货郎担问题
- 格式:doc
- 大小:37.00 KB
- 文档页数:3
【算法复习二】货郎担(旅行售货商)动态规划一,问题由来货郎担问题也叫旅行商问题,即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属于Sf0(i,空集)=d1i (k=1,2,…,n-1,i=2,3,…n)求解:K=0f0(2,空集)=d12=6f0(3,空集)=d13=7f0(4,空集)=d14=9当k=1时:从城市V1出发,经过1个城镇到达Vi的最短距离为:f1(2,{ 3 }) = f0 (3,空)+d 32 =7+8=15f1(2,{ 4 }) = f0 (4,空)+d 42 =9+8=14f1(3,{ 2 }) = f0 (2,空)+d 23 =6+9=15f1(3,{ 4 }) = f0 (4,空)+d 43 =9+5=14f1(4,{ 2 }) = f0 (2,空)+d 24 =6+7=13f1(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]=20P2(2,{3,4})=4f2(3,{ 2,4 })= min[14+9,13+5]=18P2(3,{2,4})=4f2(4,{ 2,3})= min[15+7,15+8]=22P2(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]=23P3(1,{2,3,4})=3逆推回去,货郎的最短路线是1 2 4 3 1,最短距离为23.四,源码[html] view plaincopyprint?1.#include<iostream>2.#include<iomanip>ing namespace std;4.5.int n;6.int cost[20][20]={};7.bool done[20]={1};8.int start = 0; //从城市0开始9.10.int imin(int num, int cur)11.{12.if(num==1) //递归调用的出口13.return cost[cur][start]; //所有节点的最后一个节点,最后返回最后一个节点到起点的路径14.15.int mincost = 10000;16.for(int i=0; i<n; i++)17.{18.cout<<i<<" i:"<<done[i]<<endl;19.if(!done[i] && i!=start) //该结点没加入且非起始点20.{21.if(mincost <= cost[cur][i]+cost[i][start])22.{23.continue; //其作用为结束本次循环。
标题:算法分支限界法在货郎担问题中的应用摘要:分支限界法是一种高效的解决组合优化问题的算法,本文将详细介绍分支限界法在货郎担问题中的应用,包括问题的描述、算法原理、实现步骤以及案例分析等内容。
一、问题描述货郎担问题,又称为旅行商问题(TSP),是一个经典的组合优化问题。
问题的描述为:有n个城市,货郎担需要从一个城市出发,经过所有的城市且只经过一次,最后回到出发的城市,要求找到一条最短的路径。
这是一个NP-hard问题,传统的穷举法在城市数量较大时难以找到最优解。
二、算法原理分支限界法是一种以深度优先搜索为基础的优化算法。
其核心思想是根据当前问题状态的下界(或上界)对搜索空间进行剪枝,从而减少搜索空间,提高搜索效率。
在货郎担问题中,分支限界法通过动态规划的方式记录已经访问过的城市,从而避免重复计算,同时利用启发式信息(如最近邻居、最小生成树等)进行路径选择,不断更新路径的下界,直至找到最优解或者搜索空间被完全剪枝。
三、实现步骤1. 初始化:设置初始的城市路径、已访问城市集合、路径长度、下界等参数。
2. 搜索:利用深度优先搜索,根据当前路径确定下一个访问的城市,并更新路径长度和下界。
3. 剪枝:根据当前路径长度与下界的关系,对搜索空间进行剪枝。
4. 回溯:如果搜索路径无法继续扩展,进行回溯,更新路径状态。
5. 结束条件:当所有城市都被访问过一次后,得到一条完整的路径,更新最优解。
四、案例分析假设有5个城市,它们的坐标为:A(0, 0)、B(1, 2)、C(3, 1)、D(5, 3)、E(4, 0)利用分支限界法求解货郎担问题,我们按照以下步骤进行计算:(1)初始化:选择一个城市作为出发点,并初始化已访问城市集合、路径长度和下界。
(2)搜索:根据当前路径选择下一个访问的城市,并更新路径长度和下界。
(3)剪枝:根据当前路径长度与下界的关系,进行搜索空间的剪枝。
(4)回溯:如果搜索路径无法继续扩展,进行回溯,更新路径状态。