前提
TSPにおいて2opt法を用いて解きます。
NN法で出力した経路順で2opt法を適応します。
発生している問題・エラーメッセージ
->13->4->3->10->11->2->1->5->7->8->12->9->14->6-> path length= 3.795572 8->7->5->1->2->11->10->3->4->13->0->6->14->9->12-> path length= 3.795572
上の順列がNN法
下が2opt法です。
これをプロットしても同じグラフで,改良されていません。
該当のソースコード
C
void two_opt(int p[], double d[N][N], int n) { int i, j, k, dif, temp; for (i = 1; i < n+1; i++) { for (j = i+2; j <i + n-1 ; j++) { dif = ( d[p[i%n]][p[(i+1)%n]] + d[p[j%n]][p[(j+1)%n]] ) - (d[p[i%n]][p[j%n]] + d[p[(i+1)%n]][p[(j+1)%n]]); if (dif > 0) { for (k = 0; k <(j-i)/2; k++) { temp = p[(i+1+k)%n]; p[(i+1+k)%n] = p[(j-k)%n]; p[(j-k)%n] = temp; } return; } } } } void NN(int p[], double d[N][N], int n){ int min_ind,visited[n]; int i,j; for(i=0; i < n; i++){ visited[i] = 0; //初期化 } int k = 0; for(i=0; i < n; i++){ p[i] = k; // visited[k] = 1; //訪問済み double min = 10000;//十分に大きい値 for(j=0; j < n; j++){ if (visited[j] == 0 && d[k][j] < min) { min = d[k][j]; min_ind = j; } } k = min_ind; } }
http://aok.blue.coocan.jp/joho/sw18apm2.html
こちらのサイトを参考にかいてみました。
2opt法のアルゴリズムも理解しているつもりなのですが,どこが間違っているのか教えていただきたいです。
ノード数を増やしての実行も行いましたが、改良されていなかったです。