2016-03-17 20:35:36
利用动态规划方法是可以精确求解旅行推销商问题(Traveling Salesman Problem)的, 虽然这种方法只适用于求解小规模的问题. 这个算法我一直没有弄清楚, 最近有个问题需要使用类似的算法来解决, 所以我就仔细研究了一下这个算法. 下面是网上几篇资料的总结.
我们先考虑一个小规模的问题, 只有4个城市, 城市间的距离由下面的矩阵 CC 决定.ij012300367
15023
26402
33750
值得注意的是, 这个矩阵是不对称的, 也就是说 Cij≠Cji" role="presentation" style="margin:0px;padding:0px;display:inline;line-height:normal;word-spacing:normal;word-wrap:normal;float:none;direction:ltr;max-width:none;max-height:none;min-width:0px;min-height:0px;border:0px;position:relative;">Cij≠CjiCij≠Cji. 如果这个矩阵是对称的, 算法还可以简化一些.
假定我们从城市0出发, 城市1, 2, 3每个经过一次, 最后回到城市0, 那么求解的递归树可以表示如下:d(0,{1,2,3})d[0,7]=3+7=10d(1,{2,3})d[1,6]=2+5=73d(2,{1,3})d[2,5]=4+6=106d(3,{1,2})d[3,3]=5+9=147d(1,{})d[3,0]=5d(2,{})d[2,0]=6d(3,{})d[3,0]=3d(2,{3})d[2,4]=2+3=52d(3,{2})d[3,2]=5+6=113d(1,{3})d[1,4]=3+3=64d(3,{1})d[3,1]=7+5=122d(1,{2})d[1,2]=2+6=87d(2,{1})d[2,1]=4+5=9525d(3,{})d[3,0]=337d(2,{})d[2,0]=62d(1,{})d[1,0]=54Fig.1
其中的 d(i,{j,k,l})" role="presentation" style="margin:0px;padding:0px;display:inline;line-height:normal;word-spacing:normal;word-wrap:normal;float:none;direction:ltr;max-width:none;max-height:none;min-width:0px;min-height:0px;border:0px;position:relative;">d(i,{j,k,l})d(i,{j,k,l}) 表示由城市 i" role="presentation" style="margin:0px;padding:0px;display:inline;line-height:normal;word-spacing:normal;word-wrap:normal;float:none;direction:ltr;max-width:none;max-height:none;min-width:0px;min-height:0px;border:0px;position:relative;">ii 出发, 集合 {j,k,l}" role="presentation" style="margin:0px;padding:0px;display:inline;line-height:normal;word-spacing:normal;word-wrap:normal;float:none;direction:ltr;max-width:none;max-height:none;min-width:0px;min-height:0px;border:0px;position:relative;">{j,k,l}{j,k,l} 中的城市 j,k,l" role="presentation" style="margin:0px;padding:0px;display:inline;line-height:normal;word-spacing:normal;word-wrap:normal;float:none;direction:ltr;max-width:none;max-height:none;min-width:0px;min-height:0px;border:0px;position:relative;">j,k,lj,k,l 每个经过一次需要的最小路程, 箭头上的值表示两个城市之间的距离.