參考和《演算法設計與分析》這本書
問題描述
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揹包問...