问题:如何解决旅行商问题中所有城市子集{1,2,...,n}的正确迭代顺序?
在我的解决方案中,子集由位掩码表示(现在只是一个整数)。所有结果存储在二维阵列C中,其中第一维S类似于城市子集(即,位掩码)。第二维j保存在S中所有城市之间旅行的成本,其中j是结束城市。
每个子集都包含城市0(起始城市),算法从设置最短路径开始:
C[{0}][0] = 0;
然而,要使此算法起作用,所有子集都应按子集大小的顺序迭代。
这是一个简单的代码片段,它以增加的值打印所有子集:
#include <cstdio>
const int n = 5; // number of cities
const int s = 1 << n; // number of subsets
void printb(int x)
{
for (int i = n-1; i >= 0; i--) {
printf("%d", (x >> i) & 1);
}
}
int main()
{
for (int i = 0; i < s; i++) {
printb(i); printf("\n");
}
return 0;
}
我的目标是按子集大小(位数)的顺序枚举子集。
算法描述我正在使用:Algorithms,S。Dasgupta,C。H. Papadimitriou和U. V. Vazirani(p188)
答案 0 :(得分:2)
为了正确解决TSP,在遍历2号子集之前,实际上并不需要遍历所有1号子集。在遍历集合X之前,您只需要遍历给定集合X的所有子集。使用集合的标准编码按数字顺序执行迭代将满足此属性。