我无法改善TSP问题中的nextPermutation方法

时间:2018-10-29 22:05:25

标签: java arrays algorithm brute-force

我通过蛮力推进了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}的情况下结束,但是我想改进该方法并避免计算其为逆的情况。例如,从加利福尼亚州到佛罗里达州再到德克萨斯州再从德克萨斯州到佛罗里达州再到加利福尼亚州都一样,因此不需要计算。

我希望我已经清楚了,打个招呼,谢谢!!

0 个答案:

没有答案