求图中多个顶点的最佳访问路线的算法


图为无向连通图,带权路径,
允许多次访问同一边,或同一点,
如果求两点的最短路径,可用Dijkstra 或 Floyd算法.
但是多个点呢?求图中多个顶点的最佳访问路线的算法(即最短路径).

18 个解决方案

#1


你要的是算法,为什么不在数据算法板块中问?
如果你要的是源程序,那在这里还差不多。
我对于你的这个问题曾经作过一个算法,我称之为:环路扩张算法。

#2


sorry,我没有看到有数据板块.
那么环路扩张算法具体怎样,
我还希望你能把源程序寄给我,谢谢!

#3


在软件开发者的下级菜单中就有“数据算法”板块,你迁过去后我再给你回答。

#4


我的算法明天给你贴上来。但源程序是针对多环路无向赋权连通图做的——源程序现在已经不在了。
一共分为两个算法:多环路扩张算法和平衡算法。

#5


好啊好啊
我也要, qingrun(青润)

#6


多回路扩张算法
3符号说明及定义
Cn:第n条回路;
Vni:第n条回路上第I个节点;
ln:第n条回路的总长度;
Xij:下标为ij的变量;
W(Vi,Vj):节点Vi到节点Vj的路径长度;
WCn(Vni,Vnj):回路Cn上节点到节点的路径长度;
Max{li,lj}:取li和lj中最长的一条。
4模型的建立和算法描述
这个问题在本文中被称为:“但起止点多回路赋权完全图的最优回路求解模型”。由此得到这种模型的一种算法,这里称之为“多环路扩张法”。
其主要算法思想如下:
4.1最短路程算法:
4.1.1从起点开始任意选定m个基本回路(m为要求的回路数目):
C1=O0,V11,V12,…,V1j,…,V1n,O1
……
Ck= O0,Vk1,Vk2,…,Vkj,…,Vkn,O1
……
Cm= O0,Vm1,Vm2,…,Vmj,…,Vmn,O1
(j={j|j>0,j<=n};={k|k>0,k<=m};,k,m,n,=1,2,3,……这里O0点是指定的起点,O1点是指定的终点)
4.1.2对于任意Vn,求出:
d1=W(Vu,V1j)+w(Vu,V1(j+1))
……
dk=W(Vu,Vkj)+w(Vu,Vk(j+1))
……
dm=W(Vu,Vmj)+w(Vu,Vm(j+1))
如果满足所有的di都使d1满足d1<=dk,(k=1,2,3,…,m);则Cn= O0,Vn1,Vn2,…,Vnj,…,Vnn,O1
4.1.3重复步骤4.1.2,直至无剩余节点为止。
4.1.4对所有回路Ck进行修正:
若Ck= O0,V1,V2,…,Vi,…, Vj,…,Vn,O1
对于任意i,j,l<i+1<j<n,
若W(Vi,Vj)+W(V(i+1),V(j+1))< W(Vi,V(i+1))+W(Vj,V(j+1))则在Cn中删去边(Vi,V(i+1))和(Vj,V(j+1)),形成新的回路Cn#,Cn#=O0,V1,V2,…,Vi, Vj, V(i+1),V(j+1),…,Vn,O1。
4.1.5重复步骤4.1.5,直到条件不满足为止。
按最短路程法可以求得本类问题的最短总路程,但不能保证各环的大小,即:不能保证各环之间的均衡问题。由此我们提出了下面这种算法:
4.2均衡算法
4.2.1对比任意相邻两组所经过的路线总长度,若
|lCi-lC(i+1)|>|(lCi-Xi1-Xi2+Xi3)-(lC(i+1)+X(i+1)1+X(i+1)2-X(i+1)3|
当V(I-1),V(i+1)间有连线时,Xi1=W(V(i-1),Vi),Xi2=W(Vi,V(i+1)),Xi3=W(V(i-1),V(i+1))
当V(I-1),V(i+1)间无连线,而V(i-2)与V(i+1)间有连线时,Xi1=W(V(i-1),V(i-2)),Xi2=W(Vi,V(i+1)),Xi3=W(V(i-1),V(i-2))+ W(V(i-2),V(i+1))
当Vj和V(j+1)间有连线时,
若W(Vi,Vj)+W(Vi,V(j+1))<=W(Vj,V(j+1)),则X(i+1)1=W(Vi,Vj),X(i+1)2=W(V(i-1),V(j+1)),X(i+1)3=W(Vj,V(j+1));
若W(Vi,Vj)>=W(Vi,V(j+1))+W(Vj,V(j+1)),则X(i+1)1=2W(Vi,V(j+1)),X(i+1)2=X(i+1)3=0;
若W(Vi,V(j+1))>=W(Vi,Vj)+W(Vj,V(j+1)),则X(i+1)1=2W(Vi,Vj),X(i+1)2=X(i+1)3=0;
若W(Vi,Vj)、W(Vi,V(j+1))、W(Vj,V(j+1))满足三角形规则时,则断开W(Vi,Vj)、W(Vi,V(j+1))中较长的边,即:X(i+1)1=2max{W(Vi,Vj),W(Vi,V(j+1))},X(i+1)2=X(i+1)3=0;
当Vi与Vj,V(j+2)间有连线,但Vj与V(j+2)的连线上有一节点V(j+1)时,分两种情况:
1、 当|W(Vi,Vj)-W(Vi,V(j+2))|>|W(Vj,V(j+1))-W(V(j+1),V(j+2))|时,X(i+1)1=2max{W(Vi,Vj),W(Vj,V(j+1))},X(i+1)2=X(i+1)3=0;
2、 当|W(Vi,Vj)-W(Vi,V(j+2))|<|W(Vj,V(j+1))-W(V(j+1),V(j+2))|时,X(i+1)1=2max{ W(Vj,V(j+1))-W(V(j+1),V(j+2))},X(i+1)2=X(i+1)3=0;
至于Vi与Vj、V(j+n)间有连线,同时Vj与V(j+n)间有n-1个节点的情况,这里就不再作详述。

#7


注意上文中的下标的表现形式。
另外,我只给出了算法的主要部分,至于他的缺点和pack(嘻嘻,跟微软学的),在我的文中也有描述,不过由于原来的电子文档已经丢了,这是我今天上午敲进来的。所以,暂时就来不及了。

#8


一早上敲了这么多,对qingru敬业精神深感敬佩,但我想要的不是完全图的算法.而是带权路径的连通图.举个例子,在一个旅游图中有n个景点,要访问m(m<=n)个景点,确定起点,求最佳访问路线.我用回溯法穷举访问顺序,那么复杂度为m!*n*n,太大了.上面那个算法也看不太明白,请qingru不辞辛苦,对我这个新手详细解释一番,能不能具体讲讲这个模型。
” 4.1.1从起点开始任意选定m个基本回路(m为要求的回路数目):”这m个基本回路是怎么构造的,m是什么?
“如果满足所有的di都使d1满足d1<=dk,(k=1,2,3,…,m);则Cn= O0,Vn1,Vn2,…,Vnj,…,Vnn,O1”   这句话是什么意思?  Cn是新构造的环路么?节点顺序是怎么来的?
就先问到这吧.

#9


由于时间的关系,我只能一个一个回答你。
关于带权路径的问题,实际上只是改变了相邻两点间的距离而已,完全可以采用上面这个算法来解决。
穷举法在这里不现实。
我当时写这个算法的时候,是从同一点作为出发点和终止点,但我在敲上面这个算法时,对它作了修改,改成了起止点不同的两个点,实际上没有什么差别。我想你也可以想清楚的。但,文中有一些关键词,我没能完全考虑到,所以有些使用的还是回路或环路。

#10


上文中的字符,O和0有点分不清楚,希望你能看清。
其中:O0是起始点,O1是终止点。

#11


声明一点:我这个算法是在确定起止点后的算法,实际上你完全可以在我这个算法上增加一个限制条件来提高它的灵活性,比如说旅游图中的点,不可能每一个点都成为起止点的,所以,这些起止点的定义是有限制的,也是有数的,或者通过排列组合或者其他方式都可以解决这个问题的。

#12


4.1.1从起点开始任意选定m个基本回路(m为要求的回路数目):这实际上是针对原来的问题的一个条件造成的,比如说:你将你的人分成三个组,这三个组共同走完这幅图,这样m就等于3,如果分成四个组,自然m=4,如果只有一个组,m=1了。

#13


“如果满足所有的di都使d1满足d1<=dk,(k=1,2,3,…,m);则Cn= O0,Vn1,Vn2,…,Vnj,…,Vnn,O1”  这句话是什么意思?  Cn是新构造的环路么?节点顺序是怎么来的?
Cn在文中有定义的,节点的顺序与你所选择的路线有关,路线上相邻两点可以表示成Vni,Vn(i+1),所以,也是相邻的。

#14


salesman(),“举个例子,在一个旅游图中有n个景点,要访问m(m<=n)个景点,确定起点,求最佳访问路线”这个问题就是货郎担问题呀,是NP的,怎么可能有好算法呢?
qingrun(青润),你的算法可以寄给我看看么?starfish.h@china.com
谢谢!

#15


to starfish(海星):
我的算法的主体已经写在上面了,如果你有耐心仔细分析一下的话,我想应该是没有问题的。

#16


  _@
 @

#17


gz

#18


gz
智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告