python 动态规划 旅行商问题_状态压缩动态规划 -- 旅行商问题

本文介绍了如何使用Python实现旅行商问题的动态规划解决方案,通过状态压缩技术来处理N个点的最短路径问题。详细阐述了状态表示、状态转移方程以及具体的代码实现。
摘要由CSDN通过智能技术生成

旅行商问题:

N个点(N<16)的带权有向图D,求一条路径,使得这条路经过每个点恰好一次,

并且路径上边的权值和最小(或者最大),或者求一条具有这样性质的回路。

状态压缩:

将二进制表示十进制数N的点集,比如:

10 = 0000000000001010 代表第1和3个点已经路过

18 = 0000000000010010 代表第1和4个点已经路过

一个整数就是一个点集,

dp_arr[binary][to_]代表经过点集 binary 中,当前终点为to_,

且路径最短的值,若该状态不存在就是INF

状态转移:

单点集合:状态存在dp_arr[1<

非单点集合:

dp_arr[binary][to] = min( dp_arr[from_bin][from_] + graph[from_][to] )

from_为 from_ 与 to 右边相连,且dp_arr[from_bin][from_] 状态存在,

且 dp_arr[from_bin][from_] 中的 from_bin 尚未包含 to 点信息的一系列点,状态不存在就为INF

最后结果:

min( dp_arr[( 1<

python:

INF = 1 << 10

graph = [

[0, 2, INF, 3],

[INF, 0, 6, 1],

[INF, 2, 0, 4],

[5, 1, 3, 0]

]

state_list = []

citys = 4

dp_arr = [ [ INF for i in xrange( citys ) ] for j in xrange( 1 << citys ) ]

class State:

def __init__( self, binary = None, end = None ):

self.binary = binary

self.end = end

def dp():

for to_ in range( citys ):

binary = 1 << to_

end = to_

dp_arr[binary][end] = 0

state_list.append( State( binary, end ) )

while len( state_list ):

pre = state_list.pop()

from_bin = pre.binary

from_ = pre.end

for to_ in xrange( citys ):

binary = 1 << to_

if binary & from_bin or graph[from_][to_] is INF:

continue

binary |= from_bin

next_state = State( binary, to_ )

distance = dp_arr[from_bin][from_] + graph[from_][to_]

state_list.append( next_state )

dp_arr[binary][to_] = min( dp_arr[binary][to_], distance )

if __name__ == '__main__':

dp()

ans = min( [ dp_arr[( 1 << citys ) - 1][to_] for to_ in xrange( citys ) ] )

print ans

原文:http://blog.csdn.net/pandora_madara/article/details/31656161

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值