最短路徑之旅行商問題

2021-08-20 01:56:42 字數 1580 閱讀 1997

通過圖(無向圖或有向圖)中所有邊一次且僅一次行遍圖中所有頂點的通路稱為

尤拉通路,通過圖中所有邊一次且僅一次行遍所有頂點的迴路稱為

尤拉迴路。具有

尤拉迴路的圖稱為尤拉圖(euler 

graph),具有尤拉通路而無尤拉迴路的圖稱為半尤拉圖。

和哈密頓迴路相比,哈密頓迴路是所有點僅僅經歷一次。

郵遞員問題:至少經過街道一次,所以是用尤拉**決。

tsp(旅行商問題):至少經過每個點一次,則用哈密頓**決。

旅行商問題:

從北京(pe)乘飛機到東京(t)、紐約(n)、墨西哥城(m)、倫敦(l)、巴黎(pa)

五城市做旅遊,每城市恰去一次再回北京,應如何安排旅遊線,使旅程最短?各城市之

間的航線距離如表7。

表7 六城市間的距離

l m n pa pe t

l 56 35 21 51 60

m 56 21 57 78 70

n 35 21 36 68 68

pa 21 57 36 51 61

pe 51 78 68 51 13

t 60 70 68 61 13

則可編寫程式:

main.m

clc,clear

global a

a=zeros(6);

a(1,2)=56;a(1,3)=35;a(1,4)=21;a(1,5)=51;a(1,6)=60;

a(2,3)=21;a(2,4)=57;a(2,5)=78;a(2,6)=70;

a(3,4)=36;a(3,5)=68;a(3,6)=68; a(4,5)=51;a(4,6)=61;

a(5,6)=13; a=a+a'; l=size(a,1);

c1=[5 1:4 6];%起點是5然後按照順序是第乙個初始圈

[circle,long]=modifycircle(c1,l);

c2=[5 6 1:4];%改變初始圈,該演算法的最後乙個頂點不動

[circle2,long2]=modifycircle(c2,l);

if long2

circle;long;

子函式modifycircle.m

function [circle,long]=modifycircle(c1,l)

global a

flag=1;

while flag>0

flag=0;

for m=1:l-3

for n=m+2:l-1

if a(c1(m),c1(n))+a(c1(m+1),c1(n+1))<...>

a(c1(m),c1(m+1))+a(c1(n),c1(n+1))

flag=1;

c1(m+1:n)=c1(n:-1:m+1);

endend

endend

long=a(c1(1),c1(l));

for i=1:l-1

long=long+a(c1(i),c1(i+1));

endcircle=c1;

結果:

旅行商問題

旅行商問題 乙個商人從城市a出發,訪問bcde等城市各一次最後回到a,問行程如何使得路程或費用最低。這是個np 非多項式可解,但一般驗證容易 問題,假設中間有4個城市,那麼全排列為4!24種,沒有很好的演算法,基本只能窮舉了。class vertex 4 public class lianxi pu...

旅行商問題

一銷售商從n個城市中的某一城市出發,不重複地走完其餘n 1個城市並回到原出發點,在所有可能的路徑中求出路徑長度最短的一條。本題假定該旅行商從第1個城市出發。對每個測試例,第1行有兩個整數 n 4 n 10 和m 4 m 20 n是結點數,m是邊數。接下來m行,描述邊的關係,每行3個整數 i,j le...

旅行商問題

題意 旅行商問題,即從 1 走到 n 不重不漏,然後求最小距離。題解 狀態壓縮dp,顯然的是,要從某種狀態到某種狀態並且合法,然後取 min 然後全部遍歷。所以設 dp 的含義是,最後乙個點是 i 點,然後走過了 j 這個 01 串的有 1 的點。然後要想的是順序問題,那麼我們必然是從上乙個點推到 ...