货郎担问题(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 }
这是结果: