好
我通过蛮力推进了Java中的旅行者代理(TSP)问题,但是方法“ nextPermutation”中存在问题。我假设路线的逆数是相同的,因此我的代码成本为:n!/ 2。我已经进行了几种纸质测试,以各种方式交换索引,并且总是进入无限循环。
想法如下:如果我有以下矢量:
Int[] array = {0,1,2,3};
“ nextPermutation”方法应为我生成一个列表,如下所示:
0123 = 3210
2031 = 1302
0231 = 1320
0321 = 1230
0312 = 2130
1032 = 2301
0132 = 2310
1203 = 3021
2103 = 3012
2013 = 3102
0213 = 3120
1023 = 3201
左或右路线无关紧要,两者都是完全有效的,此外您还可以看到排列总数为4! / 2 = 12。
我的代码是n !,但我想要n!/ 2:
public static boolean nextPermutation (int[] v) {
int i = v.length - 1;
while (i > 0 && v[i - 1] >= v[i]) {
i--;
}
if (i <= 0) {
return false;
}
int j = v.length - 1;
while (v[j] <= v[i - 1]) {
j--;
}
swap(v, i, j);
return true;
}
public static void swap(int[] v, int i, int j) {
int aux = v[i - 1];
v[i - 1] = v[j];
v[j] = aux;
j = v.length - 1;
while (i < j) {
aux = v[i];
v[i] = v[j];
v[j] = aux;
i++;
j--;
}
}
使用此代码,我生成了所有排列,并在向量为{3,2,1,0}的情况下结束,但是我想改进该方法并避免计算其为逆的情况。例如,从加利福尼亚州到佛罗里达州再到德克萨斯州再从德克萨斯州到佛罗里达州再到加利福尼亚州都一样,因此不需要计算。
我希望我已经清楚了,打个招呼,谢谢!!