• 货郎担问题(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 }

    这是结果:

  • 相关阅读:
    浅谈c#中使用lock的是与非
    C#设计模式学习笔记单例模式
    ArrayList c.toArray might (incorrectly) not return Object[] (see 6260652)
    java.lang.Object 之 clone() 使用

    把以前的补齐 张
    String的方法 张
    随便写写 张
    集合框架 张
    java 张
  • 原文地址:https://www.cnblogs.com/12344321hh/p/9617428.html
Copyright © 2020-2023  润新知