之前演算法課的作業:
某推銷員要從城市 v1 出發,訪問其它城市 v2,v3,…,v6 各一次且僅一次,最後返回 v1。d
為各城市間的距離矩陣。
問:該推銷員應如何選擇路線,才能使總的行程最短?
using system;
using system.collections.generic;
using system.linq;
using system.text;
namespace homework1_tsp
result.add(tmp);
flag = false;
}temp[i]++;
if (temp[i] == n)
if (i < m - 1)
flag = true;
}return result;
}class valueandpath //儲存各階段的最小距離和最優路徑
public string path
public valueandpath()
public valueandpath(int v, string s)
}class statusvariable : iequatable//狀態變數 當前所在的城市i 和未訪問的城市s[k]
public listunvistedcities
public bool equals(statusvariable status) //為dictionary 重寫equal和gethashcode
public statusvariable(int currentcity, listunvistedcities)
}public static void getshortestpath(int[,] distance_matrix) //輸入距離矩陣
},new dictionary() },
new dictionary() },
new dictionary() },
new dictionary() },
};//各階段求得的不同路徑的最小距離即fk
var distance = new dictionary() ;
for (int i = 1; i <= m ; ++i) //首先計算k=6時的不同路徑的最小距離
);var value_tmp = new valueandpath(distance_matrix[i, 0], "--" + (i+1).tostring() + "--1");
distance.add(status_tmp, value_tmp);
console.writeline(value_tmp.path + " "+value_tmp.value);
}thebestpath.add(distance);
distance = new dictionary();
for (int k = m - 1; k >=0; k--)//逆序求解k=5,4,3,2,1時不同路徑的最小距離
;if(k!=0)
cities.remove(i);
list> allsubset = combine(cities, cities.count(), m - k); //獲得k階段當前城市為i時,所有未訪問的城市集合s[k]
for (int index = 0; index < allsubset.count(); index++) //計算k階段當前城市為i時,不同s[k]的最小距離
;//計算不同狀態下fk(xk)的最小值
valueandpath temp = new valueandpath();
temp.value = distance_matrix[i,allsubset[index][j]] + thebestpath[k + 1][status_old].value;
temp.path = thebestpath[k + 1][status_old].path;
status_old.unvistedcities = new list(allsubset[index].toarray());
//某一狀態下,如果當前決策的值小於上一次決策的,則更新fk(xk),否則不處理
if (temp.value < thebestpath[k][status_new].value)}}
} }}
static void main(string args),,
,,,};
getshortestpath(m);
console.writeline("press any key to exit");
console.readkey();}}
}
TSP問題 動態規劃實現
貨郎擔問題 tsp 有n個城市,兩兩之間均有路直接連線,求一條經過每個城市一次且僅一次,最後返回起點的最短路線。這是劉汝佳書上的一道題,他給出了思路,我實現了一下。用動態規劃解決,可以假設從0點出發,然後回到0點。那麼用 f i,s 表示現在處在i點,要去訪問剩餘的在集合s中的點,集合s可以用二進位...
動態規劃解決TSP問題
題目描述 某推銷員要從城市 v1 出發,訪問其它城市v2,v3,v6 各一次且僅一次,最後返回v1。d為各城市間的距離矩陣。問 該推銷員應如何選擇路線,才能使總的行程最短?int d node number node number 每個點之間距離的矩陣 int path 6 6 行表示走到第幾步,列...
動態規劃法求解TSP問題 C
此文章借鑑於博文在此基礎上重新進行了分析總結。1 怎麼求頂點子集,即這些怎麼記錄?答 例如4個頂點,依次為 十進位制數0 1 2 3 4 5 6 7的二進位制分別為000 001 010 011 100 101 110 111。上述集合中的元素即為二進位制中的位數,例如集合,可用二進位制110 十進...