貨郎擔問題(TSP問題)


貨郎擔問題也叫旅行商問題,即TSP問題(Traveling Salesman Problem),是數學領域中著名問題之一。

有n個城市,用1,2,…,n表示,城i,j之間的距離為dij,有一個貨郎從城1出發到其他城市一次且僅一次,最后回到城市1,怎樣選擇行走路線使總路程最短?

貨郎擔問題要從圖g的所有周游路線中求取具有最小成本的周游路線,而由始點出發的周游路線一共有(n一1)!條,即等於除始結點外的n一1個結點的排列數,因此貨郎擔問題是一個排列問題。通過枚舉(n一1)!條周游路線,從中找出一條具有最小成本的周游路線的算法,其計算時間顯然為o(n!)。

解貨郎擔問題:核心是動態規划,自底向上的思想。

下面是代碼:我還沒寫出來……

哼哼:弄出來了

 1 public class Main {
 2 
 3     private static int N = 6;          //此例中共有6個點
 4     private static int index = 1;      //貨郎擔問題 解的時候假定了第一個起始點就是0,所以從1開始
 5     private int x[] = new int[N];      //每個x[index] 存放的是位置為index 的點  比如index=0  x[1] = 2  位於位置1的點是 點2
 6     private static int bestX[] = new int[N];    //最優路徑
 7     private int cLength = 0;                     //當前已經加入的點的長度
 8     private static int allLength = Integer.MAX_VALUE;    //總長
 9     private int weight[][] ={ {0,2,8,5,1,8},    
10                                 {3,0,1,8,5,2},
11                                 {6,2,0,3,6,1},
12                                 {88,3,6,0,6,4},
13                                 {7,2,6,1,0,5},
14                                 {6,3,9,1,4,0}};
15 
16     public static void main(String[] args) {
17         Main tsp = new Main();
18         tsp.getTSP(index);
19         System.out.println(allLength);
20         for (int i = 0; i < N; i++) {
21             System.out.print(bestX[i]+"  ");
22         }
23     }
24     private boolean ifExist(int index){                      //判斷index這個位置上是否可以放x[index] 這個點
25         int i=0;                                               //已經加入的位置  x[i]才是該位置的點
26         while(i<index){                                        
27             if(x[i]==x[index]){                                //判斷當前位置的點是否已經出現了
28                 return false;
29             }
30             i++;
31         }
32         return true;
33     }
34 
35     private void getTSP(int index){
36         if(index==N-1){
37             for(int j=1;j<=N;j++) {
38                 x[index] = Math.floorMod(x[index] + 1, N);         //通過取余弄出一個當前位置的點                                     
39                 if (ifExist(index) && cLength + weight[x[index - 1]][x[index]] + weight[x[index]][x[0]]< allLength) {    //總長= 已加入長度+ 到該點+該點到初始
40                     allLength = cLength + weight[x[index - 1]][x[index]]+weight[x[index]][x[0]];
41                     for (int i = 0; i < N; i++) {
42                         bestX[i] = x[i];
43                     }
44                 }
45             }
46         }else {
47             for (int j = 1; j <= N; j++) {
48                 x[index] = Math.floorMod(x[index] + 1, N);  //給定當前這個位置的點的值
49                 if (ifExist(index) && cLength + weight[x[index - 1]][x[index]] < allLength) {
50                     cLength += weight[x[index - 1]][x[index]];
51                     getTSP(index + 1);
52                     cLength -= weight[x[index - 1]][x[index]];
53                 }
54             }
55         }
56     }
57 
58 }

這是結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM