问题:寻找权值最大的哈密顿路径,权值包括三方面:岛屿本身权值,桥梁权值,三角权值,状态转移时,对当前状态考虑所有可能的最后两个岛

来源: 2010-10-11 20:13:33 [博客] [旧帖] [给我悄悄话] 本文已被阅读:

问题:寻找权值最大的哈密顿路径,权值包括三方面:岛屿本身权值,桥梁权值,三角权值。桥梁权值为桥梁两端岛屿权值之积,如果路径上连续三个岛屿互相连通,则这三个岛屿构成一个三角权值,总权值需要加上这三个岛屿权值之积。假设桥梁是双向的。
除了找出权值最大的路径之外,还要算出权值这么大的路径有多少条,一条路径倒过来仍当成了相同的路径。

思路:用二进制位表示路径状态,比如如果有3个岛,则二进制的111表示一条哈密顿路径。记录某条路径最后的两个岛,因为这两个岛可决定加入新岛时的三角权值。
这样,状态转移函数将是一个三维数组:dps[status][last_island][last_but_one_island]
与之对应的还有路径数:ways[status][last_island][last_but_one_island]
当前路径加入一个点后,状态无疑会变大,因此,状态转移时从小到大进行处理。
初始化时,状态中包含两个岛的状态函数无疑要被初始化,为两岛权值之和加上桥梁权值。而对应的路径应为1。
状态转移时,对当前状态考虑所有可能的最后两个岛,并考虑所有可能加入的岛,从而可以生成新的状态。路径数随之更新。
状态数目无疑是一个很大数字,但是,通过增加限制条件,可以将状态数大大减少,因此,这个算法又称作状态压缩动态规划。