由旅行商问题认识何为状态压缩
动态规划
动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程(multistep decision process)的优化问题时,提出了著名的最优化原理(principle of optimality),把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解,创立了解决这类过程优化问题的新方法——动态规划。
https://blog.csdn.net/hebtu666/article/category/8018091基础总结
状态压缩
我们在进行动态规划时,有时状态相当复杂,看上去需要很多空间,比如一个数组才能表示一个状态,那么就需要对状态进行某种编码,进行压缩表示。
比如:状态和某个集合有关,集合里可以有一些元素,没有另一些元素,那么就可以用一个整数表示该集合,每个元素对应于一个bit,有该元素,则该bit就是1。
这个皇后问题就可以帮助理解https://blog.csdn.net/hebtu666/article/details/84631083
旅行商问题
旅行商问题(TravelingSalesmanProblem,TSP)是一个经典的组合优化问题。经典的TSP可以描述为:一个商品推销员要去若干个城市推销商品,该推销员从一个城市出发,需要经过所有城市后,回到出发地。应如何选择行进路线,以使总的行程最短。从图论的角度来看,该问题实质是在一个带权完全无向图中,找一个权值最小的Hamilton回路。由于该问题的可行解是所有顶点的全排列,随着顶点数的增加,会产生组合爆炸,它是一个NP完全问题。由于其在交通运输、电路板线路设计以及物流配送等领域内有着广泛的应用,国内外学者对其进行了大量的研究。早期的研究者使用精确算法求解该问题,常用的方法包括:分枝定界法、线性规划法、动态规划法等。但是,随着问题规模的增大,精确算法将变得无能为力,因此,在后来的研究中,国内外学者重点使用近似算法或启发式算法,主要有遗传算法、模拟退火法、蚁群算法、禁忌搜索算法、贪婪算法和神经网络等。
如图,我们如何从0点出发,以最小代价走过所有的点?
分析
抛开这个图,我们试想:我们可能从0点一次性走到哪些点呢?
只可能1点、2点、3点、4点(废话)
那我们如果知道了
1)从1点开始走,经过所有的点,最后走到了0点的最小距离;a
2)从2点开始走,经过所有的点,最后走到了0点的最小距离;b
3)从3点开始走,经过所有的点,最后走到了0点的最小距离;c
4)从4点开始走,经过所有的点,最后走到了0点的最小距离;d
请再次注意:
我们可能从0点一次性走到哪些点呢?
只可能1点、2点、3点、4点(废话)
所以我们可以从0点走到1点,再从1点经过最小距离走到0点。
2点、3点、4点同理。
那么我们取min(a+3,b+MAX,c+4,d+MAX)即可。
3为0点走到1点的距离,4为0点走到3点的距离。
MAX代表此路不通。。
那我们继续思考,abcd怎么求呢?其实同样的:
比如:求a
从1点开始走,经过所有的点,最后走到了0点的最小距离;a
同样的思考:我们可能从1点一次性走到哪些点呢?
答:可以走到0点、2点、3点、4点。
注意:由于问题要求为:只能经过每一个顶点一次,所以我们要去掉0点,因为我们经过0点,最后再到0点就会重复,所以,
“经过所有的点”是不准确的,是除0点的所有的点。
所以只有三个点可能从1点走过去,我们需要求:
1)从2点开始走,经过除0点所有的点,最后走到了0点的最小距离x
2)从3点开始走,经过除0点所有的点,最后走到了0点的最小距离y
3)从4点开始走,经过除0点所有的点,最后走到了0点的最小距离z
然后取min(x+到2点的距离,y+到3点的距离,z+到4点的距离)
归纳表达式
1)我们会发现,每一次状态转移其实对应的是一个点的集合:
以后还会有经过除1,2点,经过除1,2,3点等等。
2)还有从哪个点开始走:
这两个条件就可以描述当前的状态。
我们把上面的总结用公式表示出来:
S为已经访问过的点的集合
v表示当前所在点。
那么dp[S][v]就表示为从点v出发访问剩余点,最终返回0点的最小长度。
我们把刚才的求解过程用公式表达出来。
∉这个符号我实在没找到,理解意思。
压缩
像这样,状态可以根据集合表示的DP,我们称作状态压缩DP。
状态和某个集合有关,集合里可以有一些元素,没有另一些元素,那么就可以用一个整数表示该集合,每个元素对应于一个bit,有该元素,则该bit就是1。
本题来说,所有点都在集合里就是11111
哪个点没在,对应的位就为0
注意:对于状态不是整数而是集合的情况,通常不太容易确定DP的顺序,如果确实不好想顺序,可以通过记忆化搜索来做。
集合S,如果对于任意S(i)<S(j),那么一定有i<j。所以确定了顺序。
确定dp表的大小,有n个城市,从0开始编号,那么dp表的行数就是n,列数就是2^(n-1)
int n;
int d[MAX_N][MAX_N];//邻接矩阵
int dp[1<<MAX_N][MAX_N];
对于数字x,要看它的第i位是不是1,那么可以通过 (x >>i) & 1取出那一位来看
先用足够大的值初始化dp数组,不要影响结果,然后核心代码:
for(int S = (1<<n)-2 ; S >= 0 ; s--)//每一个集合
{for(int v = 0 ; v < n ; v++)//每一个出发点{for(int u = 0 ; u < n ; u++)//访问每一个点{if(!(S>>u&1))//判断是否在集合中{dp[S][v] = min(dp[S][v] , dp[S | 1<<u][u]+d[v][u]);}}}
}
总结
当我们把状态压缩应用到动态规划中,可以用来精简状态,节约空间,也方便转移。
最常见的就是用二进制来表是状态,利用各种位移运算,就可以实现O(1)的转移。
由旅行商问题认识何为状态压缩相关推荐
- 【hdu4281状态压缩+01背包+多旅行商问题】
题意:有n道题,每道题在二维平面内的不同位置且给出每道题的坐标,同时给出处理每道题所需的时间p,现在已知裁判的耐心有限,之会花费m个单位时间去做事,做完后回到起始点. 现在的要求是,我要多少个裁判才能 ...
- 状态压缩动态规划 -- 旅行商问题
旅行商问题: N个点(N<16)的带权有向图D,求一条路径,使得这条路经过每一个点恰好一次. 而且路径上边的权值和最小(或者最大),或者求一条具有这样性质的回路. 状态压缩: 将二进制表示十进制 ...
- DFS 简单的剪枝和状态压缩 海贼王之伟大航路
今天碰到了这样一道题目,是一个关于深搜的题目 4124:海贼王之伟大航路 查看 提交 统计 提示 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 "我是要成为海贼王 ...
- 由NP完全问题引出动态规划——状态压缩DP
" 所有部分都应当在非强制的情况下组合回一起.要记住,你重组的那部分原来就是你拆解的.因此,如果你不能让它们组合回来的话,那一定是有原因的.要想尽一切办法,除了用锤头." – IB ...
- 【AcWing】数位统计DP、树形DP、状态压缩DP、记忆化搜索
[AcWing]数位统计DP.树形DP.状态压缩DP.记忆化搜索 一.数位统计DP 二.状态压缩DP 三.树形DP 四.记忆化搜索 一.数位统计DP 计数问题 给定两个整数 a 和 b,求 a 和 b ...
- pat 食物链(状态压缩求哈密顿回路)
状态压缩求哈密顿回路 #include<bits/stdc++.h> using namespace std; bool dp[23][1<<21]; char s[22][2 ...
- POJ-1753 Flip Game 枚举 状态压缩
刚开始做这题时总是在想应该用何种的策略来进行翻装,最后还是没有想出来--- 这题过的代码的思路是用在考虑到每个点被翻装的次数只有0次或者是1次,所以对于16个点就只有2^16中请况了.再运用位运算将状 ...
- 状压DP Hiho-1044 状态压缩
状态压缩 [HihoCoder - 1044] 小Hi和小Ho在兑换到了喜欢的奖品之后,便继续起了他们的美国之行,思来想去,他们决定乘坐火车前往下一座城市--那座城市即将举行美食节! 但是不幸的是,小 ...
- POJ-1185 炮兵阵地 动态规划+状态压缩
由于递推的时候依赖于三个连续层的关系.一开始想着直接三重for循环,但是这里有个问题就是上一层的0位置上包括着上上层是0和1两种可能,而后者又对当前行有约束,因此该方法不行.当然有一个办法就是增加状态 ...
最新文章
- 360浏览器如何保存html文件夹下,在360浏览器中将书签保存的详细步骤
- asp.net type=file前后台合作 在上传图片到服务器
- 小程序执行运行过程原理_活性污泥法基本原理、净化反应过程、工艺类型和运行过程中存在的问题...
- WS2812自动生成花样c语言,WS2812实时时钟程序 STM32F103C8T6+WS2812串行总线控制60个全彩LED - 下载 - 搜珍网...
- linux查看局域网ip的脚本,检测网段IP使用情况的shell脚本
- java之写接口回调编程经验改进
- Java BigInteger类| bitCount()方法与示例
- 4.线性和卷积——边界问题、解决边界方法和Matlab实战_3
- 蓝桥杯 算法训练 Sticks
- jquery 2.0.3代码结构
- 语音通话视频通话前端_无需互联网即可进行数十亿视频通话
- ADT(abstract data types)抽象数据类型
- 风控中英文术语手册(银行_消费金融信贷业务)
- 软件开发需求文档案例_第2部分:开发软件需求,一个案例研究
- php对字符数组进行排序,php数组去重_php对数组中字符串去重并排序例子
- python论文怎么写_用Python写一个论文降重工具
- python写的flappy bird小游戏(最简单版本)有视频链接
- 千呼万唤始出来的CoordinatorLayout
- 金融远期合约与金融期货合约
- 完美实现无毛边异形窗体
热门文章
- 如何在WINCE中添加WebServer组件
- java 参数 string_java(String和StringBuffer分别作为参数传递)
- python归一化 增大差异_Python逻辑回归模型原理及实际案例应用
- 计算机组装与维护实验指导,计算机组装与维护实验指导书.pdf
- 【转】医疗业务学习笔记--DICOM协议的基础内容!!!!!!!!!!
- 【转】ABP源码分析三十一:ABP.AutoMapper
- 【转】C# 网络连接中异常断线的处理:ReceiveTimeout, SendTimeout 及 KeepAliveValues(设置心跳)
- 【转】SOAR平台初探(一)
- 【转】1.SharePoint服务器端对象模型 之 对象模型概述(Part 1)
- python语言中百分号是什么意思_Python中%是什么意思?python中百分号如何使用?...