当前位置: 首页 > news >正文

算法设计与分析:动态规划 - TSP问题和0-1背包问题

【算法设计与分析】实验二:动态规划 - TSP问题和0-1背包问题


一、实验目的与要求

1. 实验目的

理解并掌握动态规划的基本原理,能将其应用于解决实际问题。

2. 实验要求

  1. 了解TSP问题和0-1背包问题的基本概念和实际应用。
  2. 掌握动态规划的基本原理,能灵活运用在这两个问题中。
  3. 能编写出正确实现动态规划解决这两个问题的代码。
  4. 分析程序的运行结果,并从动态规划的角度解释。

二、实验内容

了解TSP问题和0-1背包问题的含义,应用动态规划解决这两个问题,并能编写出实现该算法的编程代码。


三、实验方法

  1. 学习并深入理解TSP问题和0-1背包问题的基本概念和应用背景。
  2. 学习并理解动态规划的基本理论,掌握如何利用动态规划来求解这两个问题。
  3. 按照动态规划的理论,用编程语言(C或C++)编写实现动态规划解决这两个问题的代码。
  4. 运行程序,记录程序的运行结果,并反思是否每一步的前提条件都得到了满足。

四、详细的算法设计及运行结果

1. TSP问题算法设计及结果

动态规划方程推导

① 当V为空集,那么表示直接从i回到s了,此时dp[i][∅] = dist(i, s)

② 如果V不为空,那么就是对子问题的最优求解。必须在V这个城市集合中,尝试每一个,并求出最优解。

综上所述,TSP问题的动态规划方程就出来了:

dp[i][S]=min⁡k∈S{g[i][k]+dp[k][S∖{k}]}dp[i][S] = \min_{k \in S} \{ g[i][k] + dp[k][S \setminus \{k\}] \}dp[i][S]=kSmin{g[i][k]+dp[k][S{k}]}

状态压缩思想

用代码实现,通过判断元素是否在集合中,可以用二进制表示。同样通过规律发现,当有n个城市时,共有2^(n-1)个情况。比如n=4时,有7种情况,我们可以利用7的二进制0111来表示集合{a1, a2, a3},以此类推。

这里以{1,{2,3}}为例向下分解

可以得到dp数组

实验源码
#include<bits/stdc++.h>usingnamespacestd;#defineN4#defineINF10e7staticconstintM=1<<(N-1);intg[N][N]={{INF,3,6,7},{5,INF,2,3},{6,4,INF,2},{3,7,5,INF}};intdp[N][M];vector<int>path;// 用动态数组表示voidTSP(){for(inti=0;i<N;i++){dp[i][0]=g[i][0];}for(intj=1;j<M;j++){for(inti=0;i<N;i++){dp[i][j]=INF;// 初始化if(((j>>(i-1))&1)==1){continue;}for(intk=1;k<N;k++){if(((j>>(k-1))&1)==0){continue;// 如果在集合里边直接跳过}if(dp[i][j]>g[i][k]+dp[k][j^(1<<(k-1))]){dp[i][j]=g[i][k]+dp[k][j^(1<<(k-1))];}}}}}intmain(){TSP();cout<<"最小值为:"<<dp[0][M-1]<<endl;return0;}
TSP求解过程

{1, {2, 3}}为例向下分解:

dp[0][{1,2,3}] ├── g[0][1] + dp[1][{2,3}] ├── g[0][2] + dp[2][{1,3}] └── g[0][3] + dp[3][{1,2}]

由底向上求解问题,得到dp表。

2. 算法的特色

  1. 采用状态压缩动态规划求解旅行商问题,通过二进制位表示城市访问状态,满足问题最优子结构特性,相对于蛮力法求解更高效。

  2. 使用位运算实现状态判断与转移,执行效率高,利用动态规划思想,时间复杂度为O(N² × 2ⁿ),相对于蛮力法求解所有子集求解的方法O(n!)大大降低。


3. 0-1背包问题算法设计及结果

根据动态规划解题步骤(问题抽象化、建立模型、寻找约束条件、判断是否满足最优性原理、找大问题与小问题的递推关系式、填表、寻找解组成)找出0-1背包问题的最优解以及解组成,然后编写代码实现。

建立模型

即求max(V₁X₁ + V₂X₂ + … + VₙXₙ)

寻找约束条件

W₁X₁ + W₂X₂ + … + WₙXₙ < C

寻找递推关系式

面对当前商品有两种可能性:

  1. 背包的容量比该商品体积小,装不下,此时的价值与前i-1个的价值是一样的,即V(i,j) = V(i-1,j)

  2. 还有足够的容量可以装该商品,但装了也不一定达到当前最优价值,所以在装与不装之间选择最优的一个,即V(i,j) = max{V(i-1,j), V(i-1,j-w(i)) + v(i)}

其中V(i-1,j)表示不装,V(i-1,j-w(i)) + v(i)表示装了第i个商品,背包容量减少w(i),但价值增加了v(i)

由此可以得出递推关系式:

j < w(i) V(i,j) = V(i-1,j) j >= w(i) V(i,j) = max{V(i-1,j), V(i-1,j-w(i)) + v(i)}

得到状态转移方程后就可以开始求解了,下面是动态规划表,一行一行的填表。

实验源代码
#include<bits/stdc++.h>usingnamespacestd;constintN=5;constintM=10;intdp[N+1][M+1];intgood[N][2]={{2,6},{2,3},{6,5},{5,4},{4,6}};intmain(){for(inti=1;i<=N;i++){intw=good[i-1][0];intv=good[i-1][1];for(intj=0;j<=M;j++){if(j>=w)dp[i][j]=max(dp[i-1][j],dp[i-1][j-w]+v);elsedp[i][j]=dp[i-1][j];}}for(inti=1;i<=N;i++){for(intj=0;j<=M;j++){printf("%-4d",dp[i][j]);}cout<<'\n';}return0;}

4. 算法的特色

  1. 采用二维数组动态规划实现01背包,状态方程较清晰、代码简洁易懂,可以快速修改物品数和背包容量。

  2. 利用动态规划法求解0-1背包问题时间复杂度为O(N×M),而蛮力法求解需要求问题所有的解,时间复杂度为O(2ⁿ)


五、实验感想

0-1背包问题具有最优子结构性质,所以可以用动态规划方法求解。根据这种性质定义递归关系并建立递归方程,以自底向上的方式计算最优值。而且以后编程时要彻底理解问题后再构造算法。


http://www.jsqmd.com/news/1171123/

相关文章:

  • TLA2518与PIC18F96J65的高精度数据采集系统设计
  • 【Bug已解决】openclaw log file too large / Disk space exhausted by logs — OpenClaw 日志文件过大解决方案
  • 类奇点的致密天体超光速后是否会违反因果
  • AI辅助单工程拆分为多仓库:从模块化到微服务实践指南
  • 2026年7月最新太原伯爵官方售后服务网点地址及客服电话一览 - 亨得利钟表维修中心
  • SpringBoot+Vue Spring Boot律师事务所案件管理系统平台完整项目源码+SQL脚本+接口文档【Java Web毕设】
  • IDM激活脚本终极指南:5分钟永久解锁下载神器
  • 2026年企业级AI智能体行业进入规模化落地阶段,市场格局已定 —— 深度解析主流厂商技术路径与工程化指南
  • 技术可行性报告撰写指南:避开4个常见误区,附GB8567-2006标准模板
  • 盐城大面积农田打井厂家,沿海养殖深井施工报价 - 瑞溪泉水利
  • UE5行为树实战:从零构建智能守卫AI(巡逻与追击)
  • 2026吉安漏水检测维修口碑榜TOP5权威推荐:正规防水补漏公司甄选-卫生间/厨房/阳台/屋顶/地下室渗漏水精准查漏:房屋防水补漏避坑指南 - 安佳防水
  • UEditor 1.4.3.3 源码编译部署:从 GitHub 到 dist 的 3 步构建指南
  • FFmpeg 6.1 升级实战:3 种方法(包管理/源码/静态包)性能与兼容性分析
  • 【Bug已解决】openclaw conversation history lost / Cannot resume session — OpenClaw 对话历史丢失解决方案
  • Arduino IDE 2.x 串口中文乱码:3步排查法与 UTF-8/ANSI 编码转换实战
  • TB67H480FNG与PIC18F56K42的直流电机控制方案
  • iperf3 3.11 多线程压测:64 并发流下云服务器网络带宽瓶颈定位
  • Unity集成OpenAI API:打造智能NPC对话系统的实战指南
  • Unity游戏迁移微信/抖音小游戏:从WebGL适配到性能优化的实战指南
  • 2026年07月同步带与橡胶同步带行业深度解析:双面齿、PU及圆弧齿同步带品牌实力厂商推荐榜 - 甄选服务推荐
  • 人形机器人成像技术:实时三维感知的硬件攻坚核心
  • 2026江苏省不同规模企业品牌GEO工具适配建议 选型避坑要点 - 企智芯
  • Windows+Mac 双端 OpenClaw 部署实操,2.7.9 版本网关离线问题根治
  • 直流负载管理优化:继电器与MCU的高效协同方案
  • 码盘式传感器分辨率计算:二进制码与循环码(格雷码)的3点核心差异对比
  • Draw.io 2026 UML 类图绘制:3种关系连接器与5个属性编辑技巧详解
  • 3分钟终极指南:免费OFD转PDF工具完整使用教程
  • 2026年7月最新南京雷达官方售后热线及客户服务网点地址 - 亨得利钟表维修中心
  • 线阵相机选型实战:3步计算法搞定分辨率、行频与精度匹配