前提
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
1void two_opt(int p[], double d[N][N], int n) 2{ 3 int i, j, k, dif, temp; 4 5 6 7 for (i = 1; i < n+1; i++) { 8 for (j = i+2; j <i + n-1 ; j++) { 9 dif = ( d[p[i%n]][p[(i+1)%n]] + d[p[j%n]][p[(j+1)%n]] ) 10 - (d[p[i%n]][p[j%n]] + d[p[(i+1)%n]][p[(j+1)%n]]); 11 if (dif > 0) { 12 13 for (k = 0; k <(j-i)/2; k++) { 14 15 temp = p[(i+1+k)%n]; 16 p[(i+1+k)%n] = p[(j-k)%n]; 17 p[(j-k)%n] = temp; 18 } return; 19 20 } 21 } 22 } 23} 24 25void NN(int p[], double d[N][N], int n){ 26 27 28int min_ind,visited[n]; 29int i,j; 30 31for(i=0; i < n; i++){ 32 visited[i] = 0; //初期化 33 } 34 int k = 0; 35 36for(i=0; i < n; i++){ 37 p[i] = k; // 38 visited[k] = 1; //訪問済み 39 double min = 10000;//十分に大きい値 40 for(j=0; j < n; j++){ 41 if (visited[j] == 0 && d[k][j] < min) { 42 min = d[k][j]; 43 min_ind = j; 44 } 45 } k = min_ind; 46 } 47}
http://aok.blue.coocan.jp/joho/sw18apm2.html
こちらのサイトを参考にかいてみました。
2opt法のアルゴリズムも理解しているつもりなのですが,どこが間違っているのか教えていただきたいです。
ノード数を増やしての実行も行いましたが、改良されていなかったです。
あなたの回答
tips
プレビュー