巡回路の2-opt法による改良

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ft-86

巡回路の2-opt法による改良

#1

投稿記事 by ft-86 » 14年前

巡回経路の2-opt法による改良法
以下の、探す関数と改良を行う関数では、すべての点から一つの枝の組み合わせでしか動かなかったのですが、
すべての枝で行うようにするにはどこをどのようにしたらいいのですか?
// for cygwin //

int Find_cd(int i,int x[MAX_N],int y[MAX_N], int n,int tour[MAX_N]){
int k,l,temp;
int city_a,city_b,city_c,city_d,ax,ay,bx,by,cx,cy,dx,dy;
double abcd_dis,acbd_dis;

for(k=i+1;k<=n; k++){// 訪問順k,k+1(=l)番目の枝 cd
l=k+1;
if( k==n ) l=1;
city_a=tour; city_b=tour[i+1]; city_c=tour[k]; city_d=tour[l];
ax = x[city_a]; ay = y[city_a]; bx = x[city_b]; by = y[city_b];
cx = x[city_c]; cy = y[city_c]; dx = x[city_d]; dy = y[city_d];

abcd_dis=dist(ax,ay,bx,by)+ dist(cx,cy,dx,dy); // |ab|+|cd|
acbd_dis=dist(ax,ay,cx,cy)+ dist(bx,by,dx,dy); // |ac|+|bd|
if( abcd_dis > acbd_dis ) { // |ab|+|cd|>|ac|+|bd|
return( k ); // 訪問順k番目を関数の戻り値とする.
}
}
return(0); // 改良する枝cdが無ければ0が戻り値
}


int TwoOpt(int x[MAX_N], int y[MAX_N], int n, int tour[MAX_N]){
int i,k,p,q;
for(i=1;i<n && (k=Find_cd(i,x,y,n,tour)) == 0;i++); // 改良可能な枝ab,cdの発見
if( k == 0 ) return(0); // 改良する枝ペアがなければ0を戻り値とする.
if( i+1 < k ){ p=i+1; q=k;} else{ p=k; q=i+1; }
while( p<q ){ swap(tour[p],tour[q]); p++; q--;}
// 枝ペアab,cdがあれば都市aからcへ,都市bからdへ,都市bc間の訪問順を逆転.
return(i);
// 改良する枝abの都市aの訪問順が戻り値.
}

“C言語何でも質問掲示板” へ戻る