/* 巡回セールスマン問題を解く局所探索法による近似 アルゴリズム(2-OPTおよびOR-OPT近傍) */ #include #include #include #define N 600 /* 地点数の最大サイズ */ #define ZERO 0.0001 /* 許容誤差幅 */ #define SEED 14 /* 乱数の種 */ struct point /* 構造体pの定義 */ { float x; float y; }; int n; /* 外部変数:点の個数 */ struct point p[N]; /* p[i].xとp[i].yは点iの座標 */ /* 関数の宣言 */ float initial(int *x); float local(int *init, float lginit, int *lopt); float length(int i, int j, int *x); void printtour(int *x, float length); int rand_from(int min, int max); main() /* TSP局所探索法のテストプログラム */ { int i, init[N], lopt[N]; float initlg, bestlg; FILE *file; file=fopen("locdata1", "r"); /* 入力データの読込 */ fscanf(file, "%d", &n); for(i=0; i0) { r=r-1; j=(j+1)%n; while(test[j]==1) j=(j+1)%n; } test[j]=1; x[i]=j; } lg=0.0; for(i=0; i