貨郎擔問題也叫旅行商問題,即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 }
這是結果:

