簡體   English   中英

2選到3選旅行推銷員

[英]2-opt to 3-opt for Travelling Salesman

我正在嘗試將旅行商問題的2選件實施轉換為3選件。 我知道,與2-opt相比,它是去除3條邊並替換它們以希望獲得更好的距離。 我在確定要更改/添加到我的2-opt交換中使其變為3opt時遇到問題。 我遇到的主要問題是如何確保所有8種交換都在單個交換函數中得到考慮。 謝謝

2種代碼:

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[] 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;
    }

實際上,3種選擇只有4種形式。

將游覽分為三部分A->,B->,C->

將B連接到A和C的兩個邊上的2-opt是:

  • A - >,< - B,C->

即只是逆轉B的旅程。

現在進行3選

  • A - >,< - B,< - Visual C
  • A - >,C - >,B->
  • A - >,C - >,< - B
  • A - >,< - C,B->

請注意,A->,<-B,C->和A->,B->,<-C和A->,<-C,<-B都是2-opt。

逆轉很容易實現,您只需考慮4個變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM