動態規劃貨郎擔問題

2021-07-11 16:38:27 字數 2788 閱讀 7144

參考和《演算法設計與分析》這本書

問題描述

1)貨郎擔問題提法:有n個城市,用1,2,…,n表示,城i,j之間的距離為dij,有乙個貨郎從城1出發到其他城市一次且僅一次,最後回到城市1,怎樣選擇行走路線使總路程最短? 

2)旅行商問題的提法:假設有乙個旅行商人要拜訪n個城市,他必須選擇所要走的路徑,路經的限制是每個城市只能拜訪一次,而且最後要回到原來出發的城市。路徑的選擇目標是要求得的路徑路程為所有路徑之中的最小值。

(特說明這部分我是直接複製

blog.csdn.net/tianshuai1111/article/details/7535026

問題求解

1)動態規劃解

例題: 設v1,v2,……..,vn是已知的n個城鎮,城鎮vi到城鎮vj的距離為dij,現求從v1出發,經各城鎮一次且僅一次返回v1的最短路程。

分析:設s表示從v1到vi中間所可能經過的城市集合,s實際上是包含除v1和vi兩個點之外的其餘點的集合,但s中的點的個數要隨階段數改變。

建模:狀態變數(i,

s)表示:從v1點出發,經過s集合中所有點一次最後到達vi。

最優指標函式fk(

i,s)為從v1出發,經過s集合中所有點一次最後到達vi。

決策變數pk(

i,s)表示:從v1經k個中間城鎮的s集合到vi城鎮的最短路線上鄰接vi的前乙個城鎮,則動態規劃的順序遞推關係為:

fk(i,s)=   min+dji}        j屬於s

f0(i,空集)=d1i (k=1,2,…,n-1,i=2,3,…n)

求解:k=0

f0(2,空集)=d12=6  

f0(3,空集)=d13=7

f0(4,空集)=d14=9

當k=1時:

從城市v1出發,經過1個城鎮到達vi的最短距離為:

f1(2,) = f0 (3,空)+d 32 =7+8=15

f1(2,) = f0 (4,空)+d 42 =9+8=14

f1(3,) = f0 (2,空)+d 23 =6+9=15

f1(3,) = f0 (4,空)+d 43 =9+5=14

f1(4,) = f0 (2,空)+d 24 =6+7=13

f1(4,) = f0 (3,空)+d 34 =7+8=15

當k=2時,

從城市v1出發,中間經過2個城鎮到達vi的最短距離.

f2(2,) = min[ f1(3,)+d32,   f1(4,)+ d42] 

=min[14+8,15+5]=20p2

(2,)=4f2

(3,)= min[14+9,13+5]=18

p2(3,)=4

f2(4,)= min[15+7,15+8]=22

p2(4,)=2

當k=3時

:從城市

v1出發

,中間經過

3個城鎮最終回到

vi的最短距離.f

3(1,)= min[f

2(2,) + d 

21,f2

(3,)+ d31,

f2(4,) + d

41]=min[20+8,18+5,22+6]=23

p3(1,)=3

逆推回去

,貨郎的最短路線是

1  2  

4  3  

1,最短距離為

23.

(我的**如下):

#include"stdio.h"

#include

#define max 10000 //相當於無窮

using namespace std;

int array_cost[4][4]=

,  ,  

,  };  

int flag_four[4]=;

int flag=0;           //全域性變數

int distance_1=0;

//int min_num=max;//這樣定義為全域性變數是不對的

int diedai(int num)

int min_num=max;       我一直迷糊這裡,最主要是對變數在函式中的作用範圍不清晰

為啥min_num不能定義為全域性變數,現在心裡有數了

for(int i=0;i<4;i++)

flag--;                //這裡我們需要還原

flag_four[i]=0;//這裡我們需要還原

}  }

return min_num;

}void main()

下面的程式是參考:

直接複製

#include

#include

using namespace std;  

int n;  

int cost[20][20];  

bool done[20]=;  

int start = 0; //從城市0開始  

// int mincost=10000;

int imin(int num, int cur)  

,  ,  

,  };  

for(int i=0; i> cost[i][j];  

cost[i][j]=cc[i][j];  

}  }  

cout << imin(n, start) << endl;  

return 0;  

}  

最普通的貨郎擔問題實現

題目描述 n個頂點,從1頂點開始出發走遍所有結點回到1頂點最小路程。最普通的貨郎擔問題實現 上圖輸入 41 3 1 1 4 7 2 1 8 2 3 5 2 4 1 3 1 7 3 2 2 3 4 6 4 1 2 4 2 5 4 3 3 0 0 0 二 稍微題目修改下,從頂點1開始不用全部走遍各個結點...

迷宮最短路徑 貨郎擔問題的解決思路

要解決的問題 給定乙個迷宮,此迷宮中有且僅有乙個入口和出口,其中設有若干檢查點,要求從入口開始,經過所有檢查點後到達出口所需的最短路徑。其中路徑中允許多次經過入口或出口或某檢查點,但路徑的開始和結尾必須分別是入口和出口。更形象一點就是要把圖中所有的寶藏找出來帶出去的問題。連設計演算法 寫演算法實現的...

動態規劃問題

思想 如果乙個問題是由交疊的子問題所構成,那麼我們就可以用動態規劃技術來解決它。一般來說,這樣的子問題出現在對給定問題求解的遞迴關係中。這個遞推關係包含了相 同問題的更小子問題的解。動態規劃法建議,與其對交疊子問題一次又一次的求解,不如把每個較小子問題只求解一次並把結果記錄在表中。例題 0 1揹包問...