货郎担问题(TSP问题)
货郎担问题也叫旅行商问题,即TSP问题(Traveling Salesman Problem),是数学领域中著名问题之一。
有n个城市,用1,2,…,n表示,城i,j之间的距离为dij,有一个货郎从城1出发到其他城市一次且仅一次,最后回到城市1,怎样选择行走路线使总路程最短?
货郎担问题要从图g的所有周游路线中求取具有最小成本的周游路线,而由始点出发的周游路线一共有(n一1)!条,即等于除始结点外的n一1个结点的排列数,因此货郎担问题是一个排列问题。通过枚举(n一1)!条周游路线,从中找出一条具有最小成本的周游路线的算法,其计算时间显然为o(n!)。
解货郎担问题:核心是动态规划,自底向上的思想。
下面是代码:我还没写出来……
哼哼:弄出来了
 public class Main {
     private static int N = 6;          //此例中共有6个点
     private static int index = 1;      //货郎担问题 解的时候假定了第一个起始点就是0,所以从1开始
     private int x[] = new int[N];      //每个x[index] 存放的是位置为index 的点  比如index=0  x[1] = 2  位于位置1的点是 点2
     private static int bestX[] = new int[N];    //最优路径
     private int cLength = 0;                     //当前已经加入的点的长度
     private static int allLength = Integer.MAX_VALUE;    //总长
     private int weight[][] ={ {0,2,8,5,1,8},
                                 {3,0,1,8,5,2},
                                 {6,2,0,3,6,1},
                                 {88,3,6,0,6,4},
                                 {7,2,6,1,0,5},
                                 {6,3,9,1,4,0}};
     public static void main(String[] args) {
         Main tsp = new Main();
         tsp.getTSP(index);
         System.out.println(allLength);
         for (int i = 0; i < N; i++) {
             System.out.print(bestX[i]+"  ");
         }
     }
     private boolean ifExist(int index){                      //判断index这个位置上是否可以放x[index] 这个点
         int i=0;                                               //已经加入的位置  x[i]才是该位置的点
         while(i<index){
             if(x[i]==x[index]){                                //判断当前位置的点是否已经出现了
                 return false;
             }
             i++;
         }
         return true;
     }
     private void getTSP(int index){
         if(index==N-1){
             for(int j=1;j<=N;j++) {
                 x[index] = Math.floorMod(x[index] + 1, N);         //通过取余弄出一个当前位置的点
                 if (ifExist(index) && cLength + weight[x[index - 1]][x[index]] + weight[x[index]][x[0]]< allLength) {    //总长= 已加入长度+ 到该点+该点到初始
                     allLength = cLength + weight[x[index - 1]][x[index]]+weight[x[index]][x[0]];
                     for (int i = 0; i < N; i++) {
                         bestX[i] = x[i];
                     }
                 }
             }
         }else {
             for (int j = 1; j <= N; j++) {
                 x[index] = Math.floorMod(x[index] + 1, N);  //给定当前这个位置的点的值
                 if (ifExist(index) && cLength + weight[x[index - 1]][x[index]] < allLength) {
                     cLength += weight[x[index - 1]][x[index]];
                     getTSP(index + 1);
                     cLength -= weight[x[index - 1]][x[index]];
                 }
             }
         }
     }
 }
这是结果:

货郎担问题(TSP问题)的更多相关文章
- bzoj3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一(spfa+状压DP)
		数据最多14个有宝藏的地方,所以可以想到用状压dp 可以先预处理出每个i到j的路径中最小权值的最大值dis[i][j] 本来想用Floyd写,无奈太弱调不出来..后来改用spfa 然后进行dp,这基本 ... 
- 07_旅行商问题(TSP问题,货郎担问题,经典NPC难题)
		问题来源:刘汝佳<算法竞赛入门经典--训练指南> P61 问题9: 问题描述:有n(n<=15)个城市,两两之间均有道路直接相连,给出每两个城市i和j之间的道路长度L[i][j],求 ... 
- 基于粒子群算法求解求解TSP问题(JAVA)
		一.TSP问题 TSP问题(Travelling Salesman Problem)即旅行商问题,又译为旅行推销员问题.货郎担问题,是数学领域中著名问题之一.假设有一个旅行商人要拜访n个城市,他必须选 ... 
- 多线程动态规划算法求解TSP(Traveling Salesman Problem) 并附C语言实现例程
		TSP问题描述: 旅行商问题,即TSP问题(Travelling Salesman Problem)又译为旅行推销员问题.货郎担问题,是数学领域中著名问题之一.假设有一个旅行商人要拜访n个城市,他必须 ... 
- 基于贪心算法求解TSP问题(JAVA)
		概述 前段时间在搞贪心算法,为了举例,故拿TSP来开刀,写了段求解算法代码以便有需之人,注意代码考虑可读性从最容易理解角度写,没有优化,有需要可以自行优化! 详细 代码下载:http://www.de ... 
- Hopfield神经网络和TSP问题
		一.TSP问题 旅行商问题,又叫货郎担问题.它是指如下问题:在完全图中寻找一条最短的哈密尔顿回路. 哈密尔顿回路问题:给定一个图,判断图中是否存在哈密尔顿回路. 哈密尔顿回路:寻找一条回路,经过图中所 ... 
- 蚁群算法(Java)tsp问题
		1.理论概述 1.1.TSP问题 旅行商问题,即TSP问题(旅行推销员问题.货郎担问题),是数学领域中著名问题之一.假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只 ... 
- TSP问题之状压dp法
		首先,我们先来认识一下什么叫做TSP问题 旅行商问题,即TSP问题(Traveling Salesman Problem)又译为旅行推销员问题.货郎担问题,是数学领域中著名问题之一.假设有一个旅行商人 ... 
- 基于爬山算法求解TSP问题(JAVA)
		一.TSP问题 TSP问题(Travelling Salesman Problem)即旅行商问题,又译为旅行推销员问题.货郎担问题,是数学领域中著名问题之一.假设有一个旅行商人要拜访n个城市,他必须选 ... 
随机推荐
- 最短meeting路线(树的直径)--牛客第四场(meeting)
			题意: 给你一棵树,树上有些点是有人的,问你选一个点,最短的(最远的那个人的距离)是多少. 思路: 其实就是树的直径,两遍dfs,dfs第二遍的时候遇到人就更新直径就行了,ans是/2,奇数的话+1. ... 
- yield浅析-Python3
			yield 浅析 先来一段代码: def fun1(): for i in range(5): yield i print("继续调用继续执行") gen1 = fun1() pr ... 
- Spring防止Xss配置
			web.xml配置 <!-- xss过滤器 --> <filter> <filter-name>XssFilter</filter-name> < ... 
- Elasticsearch入门教程(六):Elasticsearch查询(二)
			原文:Elasticsearch入门教程(六):Elasticsearch查询(二) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:h ... 
- 提升scrapy的爬取效率
			增加并发: 默认scrapy开启的并发线程为32个,可以适当进行增加.在settings配置文件中修改CONCURRENT_REQUESTS = 100值为100,并发设置成了为100. 降低日志级别 ... 
- Linux scp命令详解(服务器之间复制文件或目录)
			scp:服务器之间复制文件或目录 一.命令格式: scp [-1246BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file] [-l limit] ... 
- 网络库Alamofire使用方法
			Github地址 由于Alamofire是swift网络库,所以,以下的所有介绍均基于swift项目 导入Alamofire 以下为使用cocoapods导入,其余的方式请参考官网 source 'h ... 
- php连接阿里云mysql
			1.开启Mysql远程访问端口 现在服务器控制台,安全组那边开启3306端口 2.修改Mysql配置文件 vim /etc/mysql/mysql.conf.d/mysqld.cnf,找到bind-a ... 
- redis和mongodb面试题(一)
			● 请你回答一下mongodb和redis的区别 参考回答: 内存管理机制上:Redis 数据全部存在内存,定期写入磁盘,当内存不够时,可以选择指定的 LRU 算法删除数据.MongoDB 数据存在内 ... 
- Delphi 程序调试
