中国邮递员问题的求解实例
中国邮递员问题的求解实例
前面已经讲过,对于欧拉图,可以直接用Fleury算法找出一条欧拉巡回路线;对于半欧拉图,可以先求出奇点u和v之间的最短路径P,令,则G *为欧拉图,然后用Fleury算法来确定一个G *的欧拉巡回,它就是G的最优巡回。
当G有2n个奇点(n>1),可以用Edmonds算法解决,步骤如下:
(1) 用Floyd算法求出所有奇点之间的最短路径和距离矩阵。
(2) 用匈牙利法或0-1规划法求出所有奇点之间的最佳配对。
(3) 在原图上添加最佳配对所包含的两两顶点之间的最短路得到欧拉图G *。
(4) 用Fleury算法确定一个G *的欧拉巡回,这就是G的最优巡回。
以上步骤的关键是找出2n个奇点的最佳配对,举例如下。
例 图3一条巡回。21026171117163332324432493031342214402188928934232819850313264832310261981524535232210851313625342739820923396362221414523332486531145021121330637254281053333825264121812212182723825241095432372357452542313191993924291845535361808109289241617199402132432563540180910112352517252354127263265736376481010161632615143604227313065837384681156414271522217432630271593741184125131482814212194428294146042411063136203822919203444528332356140417921467253301918332462934181624039198157825231182614447343341816714219322021308483039432解:该图有42个顶点和62条边,有26个顶点为奇点,因而不是欧拉图,为了寻找最优巡回,需要先求26个奇点的最佳配对。
先用Floyd算法求出所有42个顶点之间的最短路距离和路径。程序如下:
E=[1 2 1026
1 4 402
…………… 注:每一行代表一条边(两个顶点和边长),此处省略59行
40 39 198];
for i=1:42
for j=1:42
if j==i
a(i,j)=0;
else
a(i,j)=inf;
end
end
end
for k=1:62
i=E(k,1);j=E(k,2);a(i,j)=E(k,3);a(j,i)=E(k,3);
end
[D,R]=floyd(a);
然后求26个奇点的最优配对,这可以用Lingo求解,编写程序如下:
MODEL:
SETS:
dot/2,4,5,6,8,9,10,11,12,13,14,15,17,18,19,20,22,24,25,26,28,29,30,36,40,41/;
LINKS(dot,dot)| &2 # GT # &1:C,X;
ENDSETS
DATA:
C=1319 1065 651 650 939 1228 1463 1500 1213 617 895 1590 1709 1377 1033 1112 1652 1761 1853 1418 1832 2124 2151 2479 1687
254 668 1173 1462 1751 198 181 402 1140 1418 2113 453 601 945 1635 2175 2284 597 1941 2355 868 1463 1498 2104
414 919 1208 1497 1732 435 148 886 1164 1859 679 347 691 1381 1921 2030 8