📄 ls.c
字号:
tour[j] = tour[i]; pos[tour[i]] = j; while ( i != pos_c1) { i++; j++; if ( j >= n) j = 0; if ( i >= n) i = 0; tour[j] = tour[i]; pos[tour[i]] = j; } /* Now copy stored part from h_tour */ j++; if ( j >= n ) j = 0; i = 0; tour[j] = h_tour[i]; pos[h_tour[i]] = j; while ( j != pos_c1 ) { j++; if ( j >= n ) j = 0; i++; tour[j] = h_tour[i]; pos[h_tour[i]] = j; } tour[n] = tour[0]; } else if ( h == 2 ) { /* copy part from pos[h2] to pos[h5] and from pos[h3] to pos[h6] (inverted), it remains the part from pos[h4] to pos[h1] */ j = pos[h2]; h = pos[h5]; i = 0; h_tour[i] = tour[j]; n1 = 1; while ( j != h ) { i++; j++; if ( j >= n ) j = 0; h_tour[i] = tour[j]; n1++; } j = pos_c2; h = pos[h6]; i = 0; hh_tour[i] = tour[j]; n2 = 1; while ( j != h) { i++; j--; if ( j < 0 ) j = n-1; hh_tour[i] = tour[j]; n2++; } j = pos[h2]; for ( i = 0; i< n2 ; i++ ) { tour[j] = hh_tour[i]; pos[hh_tour[i]] = j; j++; if ( j >= n) j = 0; } /* Now copy stored part from h_tour */ for ( i = 0; i< n1 ; i++ ) { tour[j] = h_tour[i]; pos[h_tour[i]] = j; j++; if ( j >= n ) j = 0; } tour[n] = tour[0]; } } else if ( move_flag == 2 ) { if ( pos_c3 < pos_c1 ) n1 = pos_c1 - pos_c3; else n1 = n - (pos_c3 - pos_c1); if ( pos_c3 > pos_c2 ) n2 = pos_c3 - pos_c2; else n2 = n - (pos_c2 - pos_c3); if ( pos_c2 > pos_c1 ) n3 = pos_c2 - pos_c1; else n3 = n - (pos_c1 - pos_c2); val[0] = n1; val[1] = n2; val[2] = n3; /* Determine which is the longest part */ h = 0; help = LONG_MIN; for ( g = 0; g <= 2; g++) { if ( help < val[g] ) { help = val[g]; h = g; } } /* order partial tours according length */ if ( h == 0 ) { /* copy part from pos[h3] to pos[h2] (inverted) and from pos[h5] to pos[h4], it remains the part from pos[h6] to pos[h1] */ j = pos[h3]; h = pos[h2]; i = 0; h_tour[i] = tour[j]; n1 = 1; while ( j != h ) { i++; j--; if ( j < 0 ) j = n-1; h_tour[i] = tour[j]; n1++; } j = pos[h5]; h = pos[h4]; i = 0; hh_tour[i] = tour[j]; n2 = 1; while ( j != h ) { i++; j--; if ( j < 0 ) j = n-1; hh_tour[i] = tour[j]; n2++; } j = pos[h2]; for ( i = 0; i<n1 ; i++ ) { tour[j] = h_tour[i]; pos[h_tour[i]] = j; j++; if ( j >= n ) j = 0; } for ( i = 0; i < n2 ; i++ ) { tour[j] = hh_tour[i]; pos[hh_tour[i]] = j; j++; if ( j >= n ) j = 0; } tour[n] = tour[0]; /* getchar(); */ } else if ( h == 1 ) { /* copy part from pos[h2] to pos[h3] and from pos[h1] to pos[h6] (inverted), it remains the part from pos[h4] to pos[h5] */ j = pos[h2]; h = pos[h3]; i = 0; h_tour[i] = tour[j]; n1 = 1; while ( j != h ) { i++; j++; if ( j >= n ) j = 0; h_tour[i] = tour[j]; n1++; } j = pos[h1]; h = pos[h6]; i = 0; hh_tour[i] = tour[j]; n2 = 1; while ( j != h ) { i++; j--; if ( j < 0 ) j = n-1; hh_tour[i] = tour[j]; n2++; } j = pos[h6]; for ( i = 0; i<n1 ; i++ ) { tour[j] = h_tour[i]; pos[h_tour[i]] = j; j++; if ( j >= n ) j = 0; } for ( i = 0; i < n2 ; i++ ) { tour[j] = hh_tour[i]; pos[hh_tour[i]] = j; j++; if ( j >= n ) j = 0; } tour[n] = tour[0]; } else if ( h == 2 ) { /* copy part from pos[h1] to pos[h6] (inverted) and from pos[h4] to pos[h5], it remains the part from pos[h2] to pos[h3] */ j = pos[h1]; h = pos[h6]; i = 0; h_tour[i] = tour[j]; n1 = 1; while ( j != h ) { i++; j--; if ( j < 0 ) j = n-1; h_tour[i] = tour[j]; n1++; } j = pos[h4]; h = pos[h5]; i = 0; hh_tour[i] = tour[j]; n2 = 1; while ( j != h ) { i++; j++; if ( j >= n ) j = 0; hh_tour[i] = tour[j]; n2++; } j = pos[h4]; /* Now copy stored part from h_tour */ for ( i = 0; i<n1 ; i++ ) { tour[j] = h_tour[i]; pos[h_tour[i]] = j; j++; if ( j >= n ) j = 0; } /* Now copy stored part from h_tour */ for ( i = 0; i < n2 ; i++ ) { tour[j] = hh_tour[i]; pos[hh_tour[i]] = j; j++; if ( j >= n ) j = 0; } tour[n] = tour[0]; } } else if ( move_flag == 3 ) { if ( pos_c3 < pos_c1 ) n1 = pos_c1 - pos_c3; else n1 = n - (pos_c3 - pos_c1); if ( pos_c3 > pos_c2 ) n2 = pos_c3 - pos_c2; else n2 = n - (pos_c2 - pos_c3); if ( pos_c2 > pos_c1 ) n3 = pos_c2 - pos_c1; else n3 = n - (pos_c1 - pos_c2); /* n1: length h6 - h1, n2: length h4 - h5, n2: length h2 - h3 */ val[0] = n1; val[1] = n2; val[2] = n3; /* Determine which is the longest part */ h = 0; help = LONG_MIN; for ( g = 0; g <= 2; g++) { if ( help < val[g] ) { help = val[g]; h = g; } } /* order partial tours according length */ if ( h == 0 ) { /* copy part from pos[h2] to pos[h3] (inverted) and from pos[h4] to pos[h5] it remains the part from pos[h6] to pos[h1] */ j = pos[h3]; h = pos[h2]; i = 0; h_tour[i] = tour[j]; n1 = 1; while ( j != h ) { i++; j--; if ( j < 0 ) j = n-1; h_tour[i] = tour[j]; n1++; } j = pos[h2]; h = pos[h5]; i = pos[h4]; tour[j] = h4; pos[h4] = j; while ( i != h ) { i++; if ( i >= n ) i = 0; j++; if ( j >= n ) j = 0; tour[j] = tour[i]; pos[tour[i]] = j; } j++; if ( j >= n ) j = 0; for ( i = 0; i < n1 ; i++ ) { tour[j] = h_tour[i]; pos[h_tour[i]] = j; j++; if ( j >= n ) j = 0; } tour[n] = tour[0]; } else if ( h == 1 ) { /* copy part from pos[h3] to pos[h2] (inverted) and from pos[h6] to pos[h1], it remains the part from pos[h4] to pos[h5] */ j = pos[h3]; h = pos[h2]; i = 0; h_tour[i] = tour[j]; n1 = 1; while ( j != h ) { i++; j--; if ( j < 0 ) j = n-1; h_tour[i] = tour[j]; n1++; } j = pos[h6]; h = pos[h1]; i = 0; hh_tour[i] = tour[j]; n2 = 1; while ( j != h ) { i++; j++; if ( j >= n ) j = 0; hh_tour[i] = tour[j]; n2++; } j = pos[h6]; for ( i = 0; i<n1 ; i++ ) { tour[j] = h_tour[i]; pos[h_tour[i]] = j; j++; if ( j >= n ) j = 0; } for ( i = 0 ; i < n2 ; i++ ) { tour[j] = hh_tour[i]; pos[hh_tour[i]] = j; j++; if ( j >= n ) j = 0; } tour[n] = tour[0]; } else if ( h == 2 ) { /* copy part from pos[h4] to pos[h5] (inverted) and from pos[h6] to pos[h1] (inverted) it remains the part from pos[h2] to pos[h3] */ j = pos[h5]; h = pos[h4]; i = 0; h_tour[i] = tour[j]; n1 = 1; while ( j != h ) { i++; j--; if ( j < 0 ) j = n-1; h_tour[i] = tour[j]; n1++; } j = pos[h1]; h = pos[h6]; i = 0; hh_tour[i] = tour[j]; n2 = 1; while ( j != h ) { i++; j--; if ( j < 0 ) j = n-1; hh_tour[i] = tour[j]; n2++; } j = pos[h4]; /* Now copy stored part from h_tour */ for ( i = 0; i< n1 ; i++ ) { tour[j] = h_tour[i]; pos[h_tour[i]] = j; j++; if ( j >= n ) j = 0; } /* Now copy stored part from h_tour */ for ( i = 0; i< n2 ; i++ ) { tour[j] = hh_tour[i]; pos[hh_tour[i]] = j; j++; if ( j >= n ) j = 0; } tour[n] = tour[0]; } } else { printf(" Some very strange error must have occurred !!!\n\n"); exit(0); } } if (opt2_flag) { /* Now perform move */ dlb[h1] = FALSE; dlb[h2] = FALSE; dlb[h3] = FALSE; dlb[h4] = FALSE; if ( pos[h3] < pos[h1] ) { help = h1; h1 = h3; h3 = help; help = h2; h2 = h4; h4 = help; } if ( pos[h3]-pos[h2] < n / 2 + 1) { /* reverse inner part from pos[h2] to pos[h3] */ i = pos[h2]; j = pos[h3]; while (i < j) { c1 = tour[i]; c2 = tour[j]; tour[i] = c2; tour[j] = c1; pos[c1] = j; pos[c2] = i; i++; j--; } } else { /* reverse outer part from pos[h4] to pos[h1] */ i = pos[h1]; j = pos[h4]; if ( j > i ) help = n - (j - i) + 1; else help = (i - j) + 1; help = help / 2; for ( h = 0 ; h < help ; h++ ) { c1 = tour[i]; c2 = tour[j]; tour[i] = c2; tour[j] = c1; pos[c1] = j; pos[c2] = i; i--; j++; if ( i < 0 ) i = n - 1; if ( j >= n ) j = 0; } tour[n] = tour[0]; } } } else { dlb[c1] = TRUE; } } } free( random_vector ); free( h_tour ); free( hh_tour ); free( pos ); free( dlb );}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -