旅行推销员蛮力组合

时间:2018-10-27 17:28:07

标签: java arrays list multidimensional-array

我今天开始编写一些代码,以测试针对旅行商问题的一些不同解决方案。我已经对随机算法和最近的邻居算法进行了一些测试,但是,我在使用蛮力方法感到吃力。

我的程序要做的是询问用户他们将添加多少个城市。然后要求他们输入城市名称,然后输入其经度和纬度。我创建了一种方法,然后生成一个二维数组,其中存储了所有城市之间的距离。

我希望我的蛮力算法要做的是计算所有城市组合之间的距离,最后输出最短的距离。

例如:

输入3个城市(纽约,巴黎,上海) 然后存储它们之间的距离。

[0.0, 5834.0, 11851.0]
[5834.0, 0.0, 9257.0]
[11851.0, 9257.0, 0.0]

现在我想算出所有可能的组合及其总距离:

NY-P-S-NY
NY-S-P-NY
P-NY-S-P
P-S-NY-P
S-NY-P-S
S-P-NY-S

我的问题是避免与数组的距离为0.0,这显然会导致路线更短。

非常感谢您的帮助。请注意,我只是在学习编码,因此,如果可能的话,我宁愿效率较低且更易于理解的答案:)

下面的代码是我尝试使其在4个城市运行的尝试,但是,我希望该程序能够在任意数量的城市中完成此任务。我很清楚自己尝试失败的地方:

int numCities = weights.length();
      List<Integer> brute = new ArrayList<Integer>();
      for (int i = 0; i< 4; i++){
        brute.add(i);
      }
      System.out.println(brute);
      double weight = 0.0;
      double tempWeight = 0.0;
      int temp1 = 0;
      int temp2 = 0;
      int temp3 = 0;
      int temp4 = 0;
      int removing = 0;
      int valuetoRemove = 0;
      for (int a = 0; a < 4; a++){
        for (int b = 0; b < 3; b++){
          temp2 = brute.get(b);
          //System.out.println(temp2);
          List<Integer> brute2 = new ArrayList<Integer>();
          brute2.addAll(brute);
          brute.remove(b);
          System.out.println(brute);
          for (int c = 0; c < 2; c++){
            temp3 = brute.get(c);
            //System.out.println(temp3);
            List<Integer> brute2 = new ArrayList<Integer>();
            brute2.addAll(brute);
            brute.remove(c);
            //System.out.println(brute);
            temp4 = brute.get(0);
            //System.out.println(temp4);
            //brute.remove(0);
            //System.out.println(brute);
            tempWeight = weights[temp1][temp2] + weights[temp2][temp3] + weights[temp3][temp4] +  weights[temp4][temp1]; 
            System.out.println(tempWeight);
            brute = brute2;
          }
        }
      }

0 个答案:

没有答案