动态规划求解tsp问题,动态规划求解tsp

  动态规划求解tsp问题,动态规划求解tsp

  1.最长公共子串(LCS) 1.1问题的描述

  1.2有想法的动态规划。

  下一步是找到状态之间的转换方程。

  所以以‘hello world’和‘loop’为例,可以按照这个等式来填写。

  1.3 Python代码def LCS (string 1,string 2):len 1=len(string 1)len 2=len(string 2)RES=[ 0 foriinrange(len 1)]forjinrange(len 21)]fori in len 1):if string 2(I-1)=string 1(j-1):RES[I][j]=RES[I-1][j]RES[I][j]RES[I]0,1,2,2,2,2,2,2 ],[0,0,1,2,2,2,

  1.4找到特定的子序列。以下内容请参考blog Running07的动态规划最长公共子序列流程图:如果有两个字符串,分别如下。

  S1="123456778 "

  S2="357486782 "

  动态计划的最终结果如下。

  S1和S2并不只有一个LCS。

  根据递归公式:

  上表是做出来的。

  通过递推公式,res[i][j]的值来自res[i-1][j]或res[i-1][j]和res[i][j-1]

可能相等

中的较大值。

  S1和S2的LCS是从最后一个元素c[8][9]反向销售的。

  决议[8][9]=5和S1[8]!=S2[9],所以推回去。res[8][9]的值来自c[8][8]的值(由于res[8][8] res[7][9])。

  由于res[8][8]=5,S1[8]=S2[8],所以res[8][8]的值来自res[7][7]。

  就是这样,如果你遇到S1[我]!=S2[j]并且有一个分支比如res[i-1][j]=res[i][j-1],这里选择任意方向(那么,在这种情况下,也选择相同的方向)。都是左或上)。

  S1和S2的LCS是{3,5,7,7,8}

这是遇见相等的时候,统一往左走

  S1和S2之间还有一架LCS

这是遇见相等的时候,统一往上走

  S1和S2的LCS是{3,4,6,7,8}。

  2.最长公共子串2.1问题描述

  2.2思路和最长公共子串一样,使用动态规划的算法。

  下一步是找到状态之间的转换方程。

  与LCS问题的唯一区别是成为一个[我]!=B[j],res[i][j]直接为0。为什么这么说?因为子字符串必须是连续的。

且res[i][j] 表示的是以A[i],B[j]截尾的公共子串的长度

因此,以“helloworld”和“loop”为例,可以根据这个等式进行填充。

  与LCS问题的另一个区别是需要设置res,并且每一步都要更新最长公共子串的长度。

  2.3 Python代码defLCstring(string1,string 2):len 1=len(string 1)len 2=len)string 2)RES=[0 foriinrange(len 1)]forjinrange(len 21)]result len

动态规划求解tsp问题,动态规划求解tsp