状态压缩动态规划解决旅行商问题

本文探讨了旅行商问题(TSP)并介绍了如何利用动态规划和状态压缩来解决这一问题。通过位运算进行状态判断,文章详细阐述了TSP的动态规划推导过程,并给出了实际例子及C++代码实现。
摘要由CSDN通过智能技术生成

TSP与动态规划

Travelling Salesman Problem (TSP) 是最基本的路线问题。它寻求的是旅行者由起点出发,通过所有给定的需求点后,再次返回起点所花费的最小路径成本,也叫旅行商问题、旅行推销员问题、货郎担问题……
**动态规划算法(Dynamic Programming,简称DP)**通常用于求解具有某种最优性质的问题,其基本思想是将待求解问题分解成若干个子问题,先求解子问题,然后由这些子问题的解再得到原问题的解。比如跳两格退一格的问题、给定一根绳子剪短乘积最大的问题等……

状态压缩动态规划

状态压缩动态规划,就是我们俗称的状压DP,是利用计算机二进制的性质来描述状态的一种DP方式。假设有5盏灯,编号为0,1,2,3,4,有点亮和熄灭两种状态,如果以二进制数来表示所有可能的状态,则0,1,4亮,2,3熄灭表示为

比特位 7 6 5 4 3 2 1 0
二进制值 0 0 0 1 0 0 1 1
状态 null null null on off off on on

显然,状压是一种暴力的方法,当数量很大时状态也会增多。在旅行商问题中将以0,1来标记是否走过的点。

位运算

在代码实现中将会用到位运算来实现状态的判断。下面例举常见的几个位运算:

运算符 示例 说明
& x&y 以二进制数的形式按位与,返回其对应的十进制
| x|y 以二进制数的形式按位或,返回其对应的十进制
^ x^y 以二进制数的形式按位异或,返回其对应的十进制
<< x<<y 将x每一位左移y位,1<<n相当于 2 n 2^n 2n
>> x>>y 将x每一位右移y位,1>>n相当于 1 / 2 n 1/2^n 1/2n

常见的应用:
1.判断一个数字x二进制下第i位是不是等于1。
方法: i f ( ( ( 1 &lt; &lt; ( i − 1 ) ) &amp; x ) &gt; 0 ) if(((1&lt;&lt;(i−1))\&amp;x)&gt;0) if(((1<<(i1))&x)>0)
将1左移i-1位,相当于制造了一个只有第i位上是1,其他位上都是0的二进制数。然后与x做与运算,如果结果>0,说明x第i位上是1,反之则是0。
2.将一个数字x二进制下第i位更改成1。
方法: x = x ∣ ( 1 &lt; &lt; ( i − 1 ) ) x=x|(1&lt;&lt;(i−1)) x=x(1<<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值