求圖中多個頂點的最佳訪問路線的算法


圖為無向連通圖,帶權路徑,
允許多次訪問同一邊,或同一點,
如果求兩點的最短路徑,可用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

注意!

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



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