动态编程:TSP中子集的迭代顺序

时间:2013-01-04 02:24:51

标签: c++ algorithm bit-manipulation subset traveling-salesman

问题:如何解决旅行商问题中所有城市子集{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)

1 个答案:

答案 0 :(得分:2)

为了正确解决TSP,在遍历2号子集之前,实际上并不需要遍历所有1号子集。在遍历集合X之前,您只需要遍历给定集合X的所有子集。使用集合的标准编码按数字顺序执行迭代将满足此属性。