使用动态规划的 TSP
TSP using Dynamic Programming
我正在学习 TSP,并找到了这个 TSP 的递归解决方案
int compute(int start,int set)
{ int masked,mask,result=INT_MAX,temp,i;//result stores the minimum
if(g[start][set]!=-1)//memoization DP top-down,check for repeated subproblem
return g[start][set];
for(i=0;i<n;i++)
{ //npow-1 because we always exclude "home" vertex from our set
mask=(npow-1)-(1<<i);//remove ith vertex from this set
masked=set&mask;
if(masked!=set)//in case same set is generated(because ith vertex was not present in the set hence we get the same set on removal) eg 12&13=12
{
temp=adj[start][i]+compute(i,masked);//compute the removed set
if(temp<result)
result=temp,p[start][set]=i;//removing ith vertex gave us minimum
}
}
return g[start][set]=result;//return minimum
}
我不明白屏蔽是如何工作的,如何在不使用递归的情况下将其更改为动态编程解决方案,请帮助我。
这是一个传统的TSP问题,这是它的解决方案。我认为这可能对您有所帮助。
int map[15][15];
int dp[(1<<12)+5][12];
int main() {
int i,j,n,ans,k,p;
while(1) {
scanf("%d",&n);
if (n==0) break;
n++;
for (i=0; i<n; i++) {
for (j=0; j<n; j++) {
scanf("%d",&map[i][j]);
}
}
//floyd algorithm, get any two points's minimum distance
for (k=0; k<n; k++) {
for (i=0; i<n; i++) {
for (j=0; j<n; j++) {
if (i!=j && i!=k && j!=k) map[i][j]=min(map[i][k]+map[k][j],map[i][j]);
}
}
}
memset(dp,-1,sizeof(dp));
dp[1][0]=0;
// TSP solution here,bitmask and DP
for (i=1; i<(1<<n); i++) {// the current state
for (j=0; j<n; j++) {// during the current state,the last station is j
if (dp[i][j]==-1) continue;
for (k=1; k<n; k++) {//the next state is k
if ((i & (1<<k))!=0) continue;
p=(i | (1<<k));// the new state(join k)
if (dp[p][k]==-1) dp[p][k]=dp[i][j]+map[j][k];
dp[p][k]=min(dp[p][k],dp[i][j]+map[j][k]);
}
}
}
ans=INF;
// get answer
for (i=1; i<n; i++) {
if (dp[(1<<n)-1][i]>0) ans=min(ans,dp[(1<<n)-1][i]+map[i][0]);
}
printf("%dn",ans);
}
return 0;
}
相关文章:
- 如何解决动态规划问题?
- 动态规划中的旅行推销员问题
- 返回不停止函数,递归函数问题?(编程练习,动态规划,Levenshtein 回溯)
- 寻找最小楼梯成本的动态规划问题的错误答案
- 自上而下的动态规划与递归朴素解决方案.检查运行时执行
- 动态规划 - 原始计算器
- 如何通过动态规划方法解决这个问题?
- C++ 返回具有最小硬币的数组/向量以获得价值动态规划
- 动态规划 - 在数组中查找目标求和方式
- 转换为动态规划算法
- 我的记忆动态规划算法有什么问题?
- 使用动态规划在矩阵中的所有可能路径中具有最小总和的打印路径
- 动态规划:计算集合中存在多少个升序子集
- 错误 C2106:'=':左操作数必须是斐波那契数列中的 l 值,方法是动态规划 C++
- 使用动态规划的值无关背包问题
- 如何知道棒切割算法中杆的所有切割长度?(动态规划)
- 使用一维数组的LCS动态规划
- 动态规划,遍历方法
- 使用动态规划的 TSP
- 使用动态规划计算网格中的路径数