Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 旅行推销员2-opt至3-opt_Java_Graph_Traveling Salesman - Fatal编程技术网

Java 旅行推销员2-opt至3-opt

Java 旅行推销员2-opt至3-opt,java,graph,traveling-salesman,Java,Graph,Traveling Salesman,我试图将旅行推销员问题的2-opt实现转化为3-opt。我知道,与2-opt相比,它是删除3条边并替换它们,希望获得更好的距离。我不知道如何更改/添加我的2-opt交换以使其成为3-opt交换。我面临的主要问题是如何确保在单个掉期函数中考虑所有8种掉期。 多谢各位 2-opt代码: private static int[] TwoOpt(int[] TSP) { double best = totalDistance; int numCities = TSP.le

我试图将旅行推销员问题的2-opt实现转化为3-opt。我知道,与2-opt相比,它是删除3条边并替换它们,希望获得更好的距离。我不知道如何更改/添加我的2-opt交换以使其成为3-opt交换。我面临的主要问题是如何确保在单个掉期函数中考虑所有8种掉期。 多谢各位

2-opt代码:

private static int[] TwoOpt(int[] TSP) {
        double best = totalDistance;
        int numCities = TSP.length;
        int visited = 0;
        int current = 0;
        int[] newTour = TSP;
        while (visited < numCities) {
            for (int i = 0; i < numCities - 1; i++) {
                for (int j = i + 1; j < numCities; j++) {
                    int[] newerTour = Swap(i, j, newTour);
                    int newDistance = distance(newerTour);
                    if (newDistance < best) {
                        visited = 0;
                        best = newDistance;
                        newTour = newerTour;
                    }
                }
            }
            visited++;

        }
        return newTour;

    }

    private static int distance(int[] newTour) {
        int distance = 0;
        for (int i = 0; i < newTour.length - 1; i++) {
            distance += mstList.get(i).get(i + 1).p;
        }
        distance += mstList.get(newTour.length).get(0).p;
        return distance;
    }

    private static int[] Swap(int i, int j, int[] tour) {
        int size = tour.length;
        int[] newerTour = new int[tour.length];
        for (int c = 0; c <= i - 1; c++) {
            newerTour[c] = tour[c];
        }
        int change = 0;
        for (int d = i; d <= j; d++) {
            newerTour[d] = tour[d - change];
            change++;
        }
        for (int e = j + 1; e < size; e++) {
            newerTour[e] = tour[e];
        }
        return newerTour;

    }
private static int[]TwoOpt(int[]TSP){
双倍最佳=总距离;
int numCities=TSP.length;
int=0;
int电流=0;
int[]newTour=TSP;
while(访问对于(int c=0;c而言,实际上只有4种形式的3-opt

将巡演分为3个部分A->、B->、C->

连接B到A和C的两条边上的2-opt为:

  • A->
i、 只要把B的路线倒过来

现在是3-opt

  • A->,B->
  • A->,C->
请注意,A->,和A->,B->,,
private static int[] ThreeOpt(int[] TSP) {
        double best = totalDistance;
        int numCities = TSP.length;
        int visited = 0;
        int current = 0;
        int[] newTour = TSP;
        while (visited < numCities) {
            for (int i = 0; i < numCities - 2; i++) {
                for (int j = i + 1; j < numCities - 1; j++) {
                    for (int k = j + 1; k < numCities; k++) {
                        int[] newerTour = Swap(i, j, k, newTour);
                        int newDistance = distance(newTour);
                        if (newDistance < best) {
                            visited = 0;
                            best = newDistance;
                            newTour = newerTour;
                        }
                    }
                }
            }
            visited++;

        }
        return newTour;
    }