问题:如何在旅行商问题中对所有城市子集 {1,2,...,n} 进行正确的迭代顺序?
在我的解决方案中,子集由位掩码(现在只是一个整数)表示。所有结果都存储在二维数组 C 中,其中第一维 S 类似于城市子集(即位掩码)。第 2 个维度 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;
}
我的目标是按子集大小(位数)的顺序枚举子集。
我正在使用的算法描述:算法、S. Dasgupta、CH Papadimitriou 和 UV Vazirani (p188)