一,问题由来
货郎担问题也叫旅行商问题,即TSP问题(Traveling Salesman Problem),是数学领域中著名问题之一。
二,问题描述
1)货郎担问题提法:有n个城市,用1,2,…,n表示,城i,j之间的距离为dij,有一个货郎从城1出发到其他城市一次且仅一次,最后回到城市1,怎样选择行走路线使总路程最短?
2)旅行商问题的提法:假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路经的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值。
三,问题求解
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{fk-1(j,S、{
j }+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,{ 3 }) = f0 (3,空)+d
32 =7+8=15
f1(2,{ 4 }) = f0 (4,空)+d
42 =9+8=14
f1(3,{ 2 }) = f0 (2,空)+d
23 =6+9=15
f1(3,{ 4 }) = f0 (4,空)+d
43 =9+5=14
f1(4,{ 2 }) = f0 (2,空)+d
24 =6+7=13
f1(4,{ 3 }) = f0 (3,空)+d
34 =7+8=15
当k=2时,
从城市V1出发,中间经过2个城镇到达Vi的最短距离.
f2(2,{ 3,4 }) = min[ f1(3,{4})+d32,
f1(4,{3})+ d42]
=min[14+8,15+5]=20
P2(2,{3,4})=4
f2(3,{
2,4 })= min[14+9,13+5]=18
P2(3,{2,4})=4
f2(4,{ 2,3})= min[15+7,15+8]=22
P2(4,{2,3})=2
当k=3时:
从城市V1出发,中间经过3个城镇最终回到Vi的最短距离.
f3(1,{ 2,3,4 })= min[f2(2,{
3,4 }) + d 21,f2(3,{ 2,4})+ d31,f2(4,{
2,3 }) + d41]=min[20+8,18+5,22+6]=23
P3(1,{2,3,4})=3
逆推回去,货郎的最短路线是1
2 4 3 1,最短距离为23.
四,源码
源码解析:核心是动态规划,自底向上的思想。
写法是递归写法,自顶向下递归调用。
第一次调用:起点0,第一个节点是1时候
{
进入递归---->value = d01 +imin(3,1)
{
进入递归-----value = d12 +imin(2,2)
{
进入递归---->value = d23 +imin(1,3)
{
进入递归---->return d30;
}
……}
……}
……}
分享到:
相关推荐
货郎担问题,又称旅行推销员问题(Travelling Salesman Problem, TSP),是运筹学中的一个经典问题,属于组合优化的范畴。在这个问题中,一个推销员需要访问n个城市,每个城市只能访问一次,并且最后返回出发城市,...
- 货郎担算法的核心是动态规划,通过构建一个二维数组dp[i][j]表示前i个物品在重量不超过j时能获得的最大价值。 - dp状态转移方程:dp[i][j] = max{dp[i-1][j], dp[i-1][j-w[i]] + v[i]},表示当前考虑第i个物品,...
总之,"Delphi 货郎担算法类及演示程序"提供了在Delphi环境下解决旅行商问题的一个实例,不仅展示了算法的实现,还展示了如何将算法集成到实际应用中。通过对源码的学习,开发者可以深入理解货郎担问题的解决策略,...
这是一份详细的货郎担算法,采用的是蛮力算法求解思想。
货郎担问题的应用广泛,不仅在物流配送、路线规划等领域有实际应用,还在生物信息学、电路设计等方面有重要价值。理解并掌握货郎担问题及其求解方法对于提升优化问题的解决能力至关重要。 在学习货郎担问题时,你...
总的来说,货郎担限界算法是解决旅行商问题的一种实用方法,通过在时间和计算资源有限的情况下寻找接近最优的路径。理解并应用这种算法对于理解图论、优化问题以及启发式算法的设计都有重要的价值。
### 旅行商问题的0-1整数规划模型及算法 #### 一、问题背景与定义 **旅行商问题(Traveling Salesman Problem, TSP)** 是一个经典的组合优化问题,在数学、计算机科学和运筹学等领域都有广泛的应用。旅行商问题的...
1. 动态规划方法:动态规划是解决货郎担问题的一种经典方法,通过构建一个二维数组,记录从每个城市出发到其他所有城市的最短路径。然而,这种方法的时间复杂度为O(n^2 * 2^n),其中n是城市数量,对于较大的n,这种...
在这个"算法实验货郎担、二分检索的源代码"压缩包中,包含了两个关键算法的实现:货郎担问题(Travelling Salesman Problem, TSP)和二分检索(Binary Search)。这两个算法在实际应用中都有着广泛的应用。 货郎担...
货郎担问题,又称旅行推销员问题(Travelling Salesman Problem, TSP),是运筹学中的一个经典问题,其目标是寻找最短的路径,使得旅行者能访问每个城市一次并返回起点。在这个问题中,我们通常采用数学优化的方法来...
货郎担问题,又称旅行商问题(Traveling Salesman Problem, TSP),是图论中的一个经典问题。在这个问题中,一个货郎需要拜访n个城市,每个城市仅访问一次,并在最后返回起始城市,目标是最小化旅行的总距离。货郎担...
旅行商问题(Traveling Salesman Problem,TSP)与旅行售货员问题和货郎担问题,是运筹学和组合优化领域中的经典问题。这些问题的核心在于寻找最短的路径,使得一个旅行者能访问一系列城市并返回起点,每个城市只...
【货郎担问题】,又称为旅行商问题(Traveling Salesman Problem,TSP),是图论中的一个经典问题。它的目标是找到一个有向图中所有顶点的最短环路,使得每个顶点恰好访问一次并最终返回起点。在实际应用中,这个...
"货郎担算法",又称为旅行商问题(Traveling Salesman Problem,TSP),是一个经典的组合优化问题。这个问题的基本设定是:一个销售员需要访问多个城市,每个城市只访问一次,并在最后返回起点,目标是最小化旅行的...
在提供的压缩包文件中,"TSP.C" 是C语言编写的源代码,它实现了动态规划算法来解决货郎担问题。这个代码可以在Turbo C (TC) 和Visual C++ 6.0这样的编译器环境下运行。源代码中包含了大量的注释,有助于理解每一步...
**货郎担问题(Travelling ...总之,"TSP货郎担问题源码"提供了一种使用动态规划求解TSP问题的实现,它涉及到图论、运筹学和算法设计等多个领域的知识,对于理解这些问题的解决策略和优化算法有很高的学习价值。
货郎担问题,又称旅行商问题(TSP),是一个经典的组合优化问题,它在图论和运筹学中占有重要地位。在这个问题中,一个旅行商需要访问n个城市,并在每个城市销售商品,最后返回起点,目标是找到一条使得总旅行距离...
货郎担问题,又称旅行商问题(Travelling Salesman Problem, TSP),是一个经典的组合优化问题,旨在寻找最短的可能路线,使得一个旅行商能够访问每个城市一次并返回起点。在这个问题中,每两个城市之间都有一个已知...
这类材料通常会包含问题的历史背景、基本概念、复杂度分析和一些经典算法的实现原理,如动态规划的二维表格构建和回溯法的剪枝策略。 "最短哈密顿回路.rar"可能包含的是货郎担问题的一种特殊情况——寻找图中的最短...