动态规划:旅行售货员问题

合集下载

旅行售货员问题

旅行售货员问题


20
1 2
15 35 25
4
10
3
12
解(2,3),(3,4),(1,2) ,(1,4)不是最优解,其开销为77。
shortestLinkTSP(V,E,W) R =E; C=∅; While R is not empty: Remove the lightest (shortest) edge, vw, from R. if vw does not make a cycle with edges in C and vw would not be the third edge incident on v or w. Add the edges connecting the endpoints of the path in C; return C;
旅行售货员问题
一、最近邻居策略
如同求一颗最小支撑树一样,使用 贪心算法的思想,但这里不求一颗树, 而要得到一个圈。
“最近邻居策略”算法 最近邻居策略”
nearestTSP(V,E,W) Select an arbitrary vertex s to start the cycle c. v = s; While there are vertices not yet in C: Select an edge vw of minimum weight, where w is not in C. Add edge vw to C; v = w; add the edges vs to C; return C;
“最近邻居策略”的复杂性 最近邻居策略”
最坏情况下为: O(n2)

20
1 215 35 254来自10312
1,3,2,4,1的开销为85并不是最优解。 1,2,4,3,1的开销为72

TSP问题

TSP问题
d(1, {2, 3})=min{c12+d(2, {3}), c13+ d(3, {2})} d(2, {1, 3})=min{c21+d(1, {3}), c23+ d(3, {1})} d(3, {1, 2})=min{c31+d(1, {2}), c32+ d(2, {1})} 这一阶段的决策又依赖于下面的计算结果:
lb=((1+3)+(3+6)+(1+2)+(3+4)+(2+3))/2=14
于是,得到了目标函数的界[14, 16]。 需要强调的是,这个解并不是一个合法的选择(可能没有 构成哈密顿回路),它仅仅给出了一个参考下界。
d(1, {2, 3})=min{c12+d(2, {3}), c13+ d(3, {2})}=min{2+5, 3+11}=7(1→2) d(2, {1, 3})=min{c21+d(1, {3}), c23+ d(3, {1})}=min{4+6, 2+12}=10(2→1) d(3, {1, 2})=min{c31+d(1, {2}), c32+ d(2, {1})}=min{7+8, 5+9}=14(3→2) 最后有:
③ 边(u, v) 加入解集合S后,S中不产生分枝;
∞3 3 2 6
C= 3 ∞ 7 3 2 3 7 ∞2 5
2 3 2∞3
6 2 5 3∞
1
52
2
4
3
(a) 5城市的代价矩阵 (b) 城市1→城市4
1
2 5
22
4
3
(c) 城市5→城市2

动态规划求解TSP问题

动态规划求解TSP问题

f5(i, )=min{Cij+f6(1, )}=Ci1, d5(i, 1), i=2, 3, 4, 5 f5(i, )的值列表如下:
1
i 2
f5(i, ) 2
5 3
5 1 2 7
2
2 3 3
3
4 5
7
2 5
6
4 4
5
7

对于k=4, 有

f4(i, S4)=min{Cij+f5(j, S5)}, jS4, f4(i, S4。并且有 xn=(i, ), i=2, 3, …, n,
xn+1=(1, )
4
动态规划模型构造




决策变量:dk=(i, j), 其中i为当前所在的城市, j为下一站将要到达的城市。 状态转移方程:若当前的状态为 xk=(i, Sk) 采取的决策为 dk=(i, j) 则下一步到达的状态为 xk+1=T(xk, dk)=(j , Sk\{j})
9
(i, S3) (2, {3, 4}) (2, {3, 5})
J {3} {4} {3} {5}
Cij 3 5 3 1
S4 {4} {3} {5} {3}
Cij+f4(j, S4) 3+f4(3, {4})=3+6=9* 5+f4(4, {3})=5+11=16 3+f4(3, {5})=3+11=14* 1+f4(5, {3})=1+13=14*
(1, S1) (1, {2, 3, 4, 5})
J {2} {3} {4} {5}
Cij 2 7 2 5
S2 {3, 4, 5} {2, 4, 5} {2, 3, 5} {2, 3, 4}

旅行售货员问题(TSP)的模拟退火算法

旅行售货员问题(TSP)的模拟退火算法
代 , 并逐步 衰减t 值, 算 法 终 止 时 的 当 前 解 即 为 所 得 近 似 最 优 解, 这 是 基 于 蒙 特 卡 罗 迭 代 求 解 法 的 一 种 启 发 式 随 机 搜 索 过 程 。退 火 过 程 由冷 却 进 度 表 ( C o o l i n g S c h e d u l e ) 控制 , 包 括 控 制 参数的初值t 及其衰 减因子△ t 、 每个t 值 时的迭代 次数L 和 停 止 条件 S 。 2 . 1 模 拟 退 火算 法 的模 型 模 拟退火算法 可以分解 为解空间 、 目标 函 数 和初 始 解 三 部分。 模 拟退火的基本 思想 : ( 1 ) 初始化 : 初 始 温 度 T( 充 分大 ) , 初始解状态S ( 是 算 法 迭 代 的起 点 ) , 每个T 值的迭代次数L ; ( 2 ) 对k = l , …… , L 做第 ( 3 ) 至第6 步; ( 3 ) 产生新解S ; ( 4 ) 计 算 增 量 A t = C( S ) 一 C ( S ) , 其中C ( S ) 为评 价函数 ; ( 5 ) 若A t < O 则 接 受S
市 出发 . 不重 复地 遍 历 所 有 城 市 并 回到 起 点 , 求 一 条 路 程 最 短 的路 径 。 这 个 问题 已被 证 明是 一 个 NP — C( No n d e t e mi r n i s t i c P o l y n o — m i a l — C o m p l e t e n e s s ) 问题 , 其计算复杂度为0 ( n !) , 目前 还 不 能 找 出一 个 多 项 式 算 法 解 决 此 类 问题 。但 解 决 此类 问 题 有 较 大 的现 实 意 义 。例 如 : 在 网络 通信 中求 解 路 由问 题 时 。 可 用 节 点 间 的路 径 长 度 代 表 网 络 节 点 间 的通 信 代 价 .而求 解 一 条 代 价 最 小 路 由 回路 即 可 转 化 为r I ' S P 问 题 的 求 解 下 面将 简述T S P 问 题 的两 种 不 同近 似 算 法 : 模 拟 退 火算 法 、 遗传算法 。 2 . 模 拟 退 火算 法 K I R K P A T R I C K等 于 1 9 8 3 年 首 先 提 出模 拟 退 火 算 法 。模 拟 退 火 算 法 来 源 于 固体 退 火 原 理 , 将固体加温至充分高 . 再 让 其 徐徐冷 却 , 加 温时 , 固体 内 部 粒 子 随 温 升 变 为 无 序 状 , 内 能 增 大, 而徐徐冷却 时粒子渐趋有序 , 在每个温 度都达到平 衡态 , 最 后 在 常 温 时 达 到基 态 , 内 能 减 为 最 小 。 根 据 Me t r o p o l i s 准则 ,

6.旅游售货员问题 最佳巡视路线

6.旅游售货员问题 最佳巡视路线

显然 0 0 1, 0 越小, 说明分组的均衡性越 好. 取定一个 后, 0 与 满足条件 3)的分组是 一个均衡分组. 条件 4)表示总巡视路线最短. 此问题包含两方面:a)对顶点分组, b)在每组中 求(单个售货员)最佳旅行售货员回路. 因单个售货员的最佳旅行售货员回路问题不存 故多 也不 存在多项式时间内的精确算法.
O—2—5—6—7—E—8—E—11—G—12—H—12 —F—10—F—9—E—7—6—5—2—O O—R—29—Q—30—Q—28—27—26—N—24—23 —22—17—16—17—K—22—23—N—26—P—O O—M—25—20—21—K—18—I—15—14—13—J —19—L—6—M—O O—R—A—33—31—32—35—34—B—1—C—3 — D—4—D—3—2—O
定义 若对于某一对i和j,有 w(vi v j ) w(vi 1v j 1) w(vi vi 1) w(v j v j 1) 则圈Cij将是圈C的一个改进. 二边逐次修正法: 在接连进行一系列修改之后,最后得一个圈,不能 再用此方法改进了,这个最后的圈可能不是最优的, 但是它是比较好的,为了得到更高的精度,这个
现在尝试将顶点分为4组.分组的原则:除遵从 前面准则1、2、3外,还应遵从以下准则: 准则4 尽量使各组的停留时间相等. 用上述原则在下图上将图分为4组,同时计算 各组的停留时间,然后用算法一算出各组的近似最 最佳旅行售货员巡回,得出路线长度及行走时间, 从而得出完成巡视的近似最佳时间. 用算法一计 计算时,初始圈的输入与分三组时同样处理.
表3 组名 I II III IV 路 线
(路程单位:公里;时间单位:小时) 路 线 停留 时间 17 16 18 18 行走 时间 5.59 5.69 4.54 4.74 完成巡视 的总时间 22.59 21.69 22.54 22.74 总长度 195.8 199.2 159.1 166

【算法复习二】货郎担(旅行售货商)动态规划

【算法复习二】货郎担(旅行售货商)动态规划

【算法复习二】货郎担(旅行售货商)动态规划一,问题由来货郎担问题也叫旅行商问题,即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; //其作用为结束本次循环。

组合优化中的旅行推销员问题

组合优化中的旅行推销员问题

组合优化中的旅行推销员问题旅行推销员问题(Traveling Salesman Problem,TSP)是组合优化领域中最经典的问题之一。

该问题的基本描述是:给定一组城市和城市之间的距离,寻找一条最短的路径,使得经过每个城市一次且最终回到起始城市。

TSP在实际生活中有着广泛的应用,例如物流配送、电路板设计和基因序列分析等。

1. 问题描述在旅行推销员问题中,我们考虑有n个城市,城市之间的距离由一个n×n的矩阵D表示。

矩阵D中的元素D[i][j]表示城市i到城市j的距离。

该问题的目标是找到一条从某个城市出发,经过每个城市一次且最终回到出发城市的最短路径。

2. 算法解决方案在组合优化中,各种算法被提出来解决旅行推销员问题。

以下介绍两种常见的解决方案。

2.1 蛮力搜索算法蛮力搜索算法是一种穷举所有可能路径的方法。

其基本思想是通过尝试所有可能的路径组合,计算每条路径的总长度,最后找到最短路径。

蛮力搜索算法的缺点是时间复杂度较高,随着城市数量增加,搜索空间呈指数级增长。

2.2 近似算法近似算法是为了在较短的时间内找到接近于最优解的解决方案。

其中最著名的算法是最近邻算法。

该算法从一个起始城市出发,每次选择距离当前城市最近的未访问城市作为下一个访问城市,直到所有城市都被访问过,并返回起始城市。

虽然最近邻算法不能保证找到最优解,但其时间复杂度低,适用于大规模问题。

3. 实例分析为了更好地理解旅行推销员问题的解决方法,以一个具体的实例进行分析。

假设有5个城市,城市之间的距离矩阵D如下:城市A 城市B 城市C 城市D 城市E城市A 0 1 2 3 4城市B 1 0 5 6 7城市C 2 5 0 8 9城市D 3 6 8 0 10城市E 4 7 9 10 0使用蛮力搜索算法,我们需要计算出所有可能的路径,并计算每条路径的长度,最终找到最短路径。

在本例中,共有5个城市,所以共有5个阶乘(5!= 120)条可能的路径。

基于动态规划算法的旅行商问题求解

基于动态规划算法的旅行商问题求解

基于动态规划算法的旅行商问题求解旅行商问题(Traveling Salesman Problem,TSP)是一个经典的组合优化问题。

它的任务是在给定一系列城市和每对城市之间的距离(或者称为成本),找到一条经过每个城市一次且回到起始城市的最短路径。

动态规划算法是求解旅行商问题的一种常用方法。

它基于以下思想:将大问题分解为若干个小问题,通过解决小问题的最优解来逐步得到大问题的最优解。

首先,我们需要定义旅行商问题的状态。

在本问题中,我们可以将状态定义为一个二元组 (i, S),它表示旅行商当前所在的城市为 i,已经遍历过的城市集合为 S。

这里的状态空间是城市集合 C 的幂集除去空集:状态空间:C = {1, 2, ..., n},其中 n 是城市的数量。

接下来,我们需要定义状态转移方程。

假设当前状态为 (i, S),我们需要求解的是到达状态 (i, C) 的最短路径。

状态转移方程可以表示为:dp[i][S] = min{dist[i][j] + dp[j][S\{j}]},其中 j∈S,j≠i其中,dp[i][S] 是从城市 i 出发,经过集合 S 中的城市,最后回到起始城市的最短路径长度。

dist[i][j] 表示城市 i 到城市 j 的距离。

S\{j} 表示从集合 S 中去掉元素 j 后的集合。

最后,我们需要定义问题的边界条件。

当集合 S 中只有一个城市 i 时,经过城市 i 后回到起始城市的路径长度就是从起始城市到达城市 i 的距离。

所以边界条件可以表示为:当 |S| = 1 时,dp[i][S] = dist[i][1]接下来,我们使用动态规划算法来解决旅行商问题。

1. 创建一个二维数组 dp[n][2^n],其中 n 是城市的数量。

初始化数组 dp 的所有元素为无穷大。

2. 对于每个城市 i,将 dp[i][∅](空集)的值设为 dist[i][1]。

3. 对于集合 S 的大小从 2 到 n-1 的每个值,依次遍历每个城市 i。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

xxxxxxxx大学结课论文项目动态规划算法解决旅行售货商问题课程名称: xxxxxxxxxxxxxx院系: xxxxxxxxxxxxxx学生姓名: xxxxxx学号: xxxxxxxxx指导教师: xxxxxx2015年6月15日摘要:旅行商问题(TSP问题)时是指旅行家要旅行n个城市然后回到出发城市,要求各个城市经历且仅经历一次,并要求所走的路程最短。

该问题又称为货郎担问题、邮递员问题、售货员问题,是图问题中最广为人知的问题。

动态规划( dynamic programming )算法是解决多阶段决策过程最优化问题的一种常用方法,难度比较大,技巧性也很强。

利用动态规划算法,可以优雅而高效地解决很多贪婪算法或分治算法不能解决的问题。

本次课程设计运用动态规划解决旅行售货员问题,动态规划的基本思想是:把求解的问题分成许多若干阶段或许多子问题,然后按顺序求解各子问题。

前一子问题的解,为后一子问题的求解提供了有用的信息,在求解任一子问题时列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。

依次解决各子问题,最后一个子问题就是初始问题的解。

通过图的关系矩阵来表示个城市之间的关系,二维数组表示顶点之间的距离关系,对子问题进行求解比较,最后得出所求结果。

关键字:旅行商问题动态规划法图矩阵目录第一章绪论1.1算法介绍1.2算法应用第二章动态规划理论知识2.1动态规划的基本思想2.2动态规划设计步骤第三章旅行售货员问题3.1问题描述:旅行售货员问题3.2算法设计内容3.3算法分析3.4流程图第四章物流配送网络第五章结论第一章绪论1.1算法介绍动态规划( dynamic programming )是解决多阶段决策过程最优化问题的一种数学方法。

1951年美国数学家Bellman(贝尔曼)等人根据一类多阶段决策问题的特性,提出了解决这类问题的“最优性原理”,并研究了许多实际问题,从而创建了最优化问题的一种新方法——动态规划。

解决多阶段决策过程最优化问题,难度比较大,技巧性也很强。

利用动态规划算法,可以优雅而高效地解决很多贪婪算法或分治算法不能解决的问题。

动态规划算法的基本思想是:将待求解的问题分解成若干个相互联系的子问题,先求解子问题,然后从这些子问题的解得到原问题的解;对于重复出现的子问题,只在第一次遇到的时候对它进行求解,并把答案保存起来,让以后再次遇到时直接引用答案,不必重新求解。

动态规划算法将问题的解决方案视为一系列决策的结果,与贪婪算法不同的是,在贪婪算法中,每采用一次贪婪准则,便做出一个不可撤回的决策;而在动态规划算法中,还要考察每个最优决策序列中是否包含一个最优决策子序列,即问题是否具有最优子结构性质。

1.2算法应用动态规划在工程技术、管理、经济、工业生产、军事及现代控制工程等方面都有广泛的应用,而且由于动态规划方法有其独特之处,在解决某些实际问题时,显得更加方便有效。

由于决策过程的时间参数有离散的和连续的情况,故决策过程分为离散决策过程和连续决策过程。

这种技术采用自底向上的方式递推求值,将待求解的问题分解成若干个子问题,先求解子问题,并把子问题的解存储起来以便以后用来计算所需要求的解。

简言之,动态规划的基本思想就是把全局的问题化为局部的问题,为了全局最优必须局部最优。

第二章动态规划理论知识2.1动态规划的基本思想把求解的问题分成许多若干阶段或许多子问题,然后按顺序求解各子问题。

前一子问题的解,为后一子问题的求解提供了有用的信息,在求解任一子问题时列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。

依次解决各子问题,最后一个子问题就是初始问题的解。

简言之,动态规划的基本思想就是把全局的问题化为局部的问题,为了全局最优必须局部最优。

2.2动态规划设计步骤1)划分阶段:按照问题的时间或空间特征,把问题分为若干阶段。

这若干阶段一定要是有序的或可排序的(无后向性)。

2)选择状态:将问题发展到各个阶段时所出现的各种客观情况用不同的状态来表示出来。

状态的选择要有无后向性。

3)确定决策并写出状态转移方程:状态转移就是根据上一阶段的状态和决策来导出本阶段的状态。

第三章旅行售货员问题3.1问题描述:旅行售货员问题某售货员要到若干城市去推销商品,已知各城市之间的路程。

他要选定一条从驻地出发,经过每一个城市一遍,最后回到驻地的路线,使总的路程最小,并求出最小路程。

3.2算法设计内容不同城市的路线和距离都不一样。

运用动态规划算法来设计本次课程设计,考虑到对问题进行阶段划分和状态的选择。

使用Left函数实现V'-{k} 的下标检索。

根据遍历城市的各个阶段时所出现的情况并用不同的状态表示出来。

当然这时的状态必须要满足无后向性。

设计第一阶段则是各顶点为空,然后给赋值。

依次遍历各城市,在TSP函数中得以实现。

假设4个顶点分别用0、1、2、3的数字编号,顶点之间的权值放在数组c[4][4]中。

首先按个数为1,2,3的顺序生成1,2,3个元素的子集存放在数组V[2n-1]中。

设数组d[n][2n-1]存放迭代结果,其中d[i][j]表示从顶点i经过子集V[j]中的顶点一次且仅一次,最后回到出发点0的最短路径长度。

3.3算法分析假设从顶点i出发,令d(i,V’)表示从顶点i出发经过V’中各个顶点一次且仅一次,最后回到出发点i的最短路径的长度,开始时,V’=V-{i},于是,旅行商问题的动态规划函数为:d(i,V’) = min{cik + d(k,V’-{k})} (k∈V’) 1)d(k,{}) = cki (k ≠ i) 2)简单来说,就是用递归表达:从出发点0到1号点,假设1是第一个,则剩下的路程就是从1经过剩下的点最后回到0点的最短路径. 所以当V’为空的时候, d(k,{}) = cki (k ≠ i),找的是最后一个点到0点的距离.递归求解1之后,再继续求V’之中剩下的点,最后找出min.如果按照这个思想直接做,对于每一个i都要递归剩下的V中所有的点,所以这样的时间复杂度就近似于N!,其中有很多重复的工作.可以从小的集合到大的集合算,并存入一个二维数组,这样当加入一个节点时,就可以用到之前的结果,如四个点的情况:邻接矩阵:node 0 1 2 30 5 3 21 5 7 92 3 7 123 2 9 12动态填表:表中元素代表第i个节点经过V集合中的点最后到0点的最短值.如果有多个值,取其中最小的一个.i\Vj 0 1 2 3 1,2(取min) 1,3(取min) 2,3(取min) 1,2,3(取min)0 c[0][i]+d[i][v’]=211 5 10 11 {c[1][2]+d[2][{3}]=21,c[1][3]+d[3][{2}]=24}2 3 12 14 {c[2][1]+d[1][{3}]=18,c[2][3]+d[3][{1}]=26}3 2 14 15 {c[3][1]+d[1][{2}]=19,c[3][2]+d[2][{1}]=24}这样一共循环(2^(N-1)-1)*(N-1)次,就把时间复杂度缩小到O(N*2N )的级别.核心伪代码如下:{for (i =1;i<n;i++)d[i][0]=c[i][0];for( j=1;j<2^(N-1)-1;j++)for(i=1 ; i<n ;i++){if(子集Vj中不包含i){对Vj中的每个元素k,计算d[i][Vj] = min{c[i][k] + d[k][{Vj-k}] | 每一个k∈Vj};}}对V[2^(n-1)-1]中的每个元素k,计算:d[0][2^(n-1)-1] = min{c[0][k] + d[k][2^(n-1)-2]};输出最短路径:d[0][2^(n-1)-1];}具体代码如下:// TravRoadD.cpp : Defines the entry point for the console application. //#include "stdafx.h"#include "windows.h"#include "math.h"#include <stdio.h>#include <ctime>#include <algorithm>using namespace std;int N;int matr[20][20];int d[20][40000]={0};int getmin(int *sum){int i = 0;int min = -1,k;for(;i<N;i++){if((min < 0 && sum[i]>0) || (sum[i]>0 && sum[i]<min)){min = sum[i];k = i;}}return min;}void getJ(int jlist[], int c, int n){int i = n-1,j;int tmp = 1 , result = 0;while(!jlist[i])i--;j = i-1;while(jlist[j])j--;if(!jlist[n-1]){jlist[i]=0;jlist[i+1]=1;}else if(n-1-j==c){for(i=0;i<n;i++)jlist[i]=0;for(i=0;i<c+1;i++)jlist[i]=1;}else{int k;k=n-1-j;while(!jlist[j])j--;for(i=0;j+i<n;i++)jlist[j+i]=0;for(i=0;i<=k;i++)jlist[j+i+1]=1;}}int getnextj( int j ){int nextj = 0;int c=0;int jlist[20]={0};int i=0;int tmp = 1;while(j){if(j%2){c++;jlist[i++]=1;}else{jlist[i++]=0;}j/=2;}getJ(jlist,c,N-1);for(i=0;i<N-1;i++){if(jlist[i])nextj += tmp;tmp *= 2;}return nextj;}int main(int argc, char* argv[]){freopen("d:\\test_20.txt","r",stdin);int i,j;int min;scanf("%d",&N);for(i = 0; i < N; i++){for(j = 0;j < N; j++){scanf("%d",&matr[i][j]);}}int V[20]={0};for(i = 0; i < N; i++)V[i]=1;V[0]=0;for (i =1;i<N;i++)d[i][0]=matr[i][0];for(j=1;j<pow(2,N-1)-1;j=getnextj(j))for(i=1; i<N ;i++){if(!(j & ( 1<<(i-1) ))){int jlist[20]={0};int tmpres[20]={0};int c=0,k=j,l;while(k){if(k%2){jlist[c++]=1;}else{jlist[c++]=0;}k/=2;}c=0;for(l=0;l<N;l++){if(jlist[l]){tmpres[c++]=matr[i][l+1] + d[l+1][j-(1<<l)];}}d[i][j] = getmin(tmpres);}}int tmpres[20]={0};j = pow(2,N-1)-1;for(i=1;i<N;i++){tmpres[i]=matr[0][i] + d[i][ j - (1<<(i-1) )];}min = getmin(tmpres);d[0][2^(n-1)-1] = min{matr[0][k] + d[k][2^(n-1)-2]};d[0][2^(n-1)-1];printf("%d\n",min);getchar();return 0;}3.4流程图YN3.5运行结果截图如下图4-1图4-1开始函数IsIncluded(int x,int array[3])判断x 是否包含在数组中。

相关文档
最新文档