货郎担问题(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个城市,他必须选 ...
随机推荐
- python中的并发执行
一. Gevent实例 import gevent import requests from gevent import monkey # socket发送请求以后就会进入等待状态,gevent更改了 ...
- stm32F429启动时钟配置
STM32f429在启动时会在startup_stm32f429_439xx.s中调用static void SetSysClock(void)函数.默认使用的是25M晶振,把系统时钟设置为180M. ...
- poj 4005 Moles
大意: 给定$n$元素序列$a$, 依次插入二叉搜索树, 求出$dfs$序列, 对序列每个元素模$2$得到一个长为$2n-1$的$01$序列$s1$. 再给定$01$序列$s2$, 求$s2$在$s1 ...
- Linux内核、mysql内核、Tcp/Ip内核、java等知识书籍
LINUX <linux内核设计与实现>(2011年出版,链接:https://pan.baidu.com/s/107hriLNVt05A8egeU8Du-g 密码:0cgn) < ...
- vscode 格式化vue代码单引号变双引号
首选项->设置.输入框输入vetur vscode中设置 "vetur.format.defaultFormatterOptions": { "prettier&q ...
- golang(6): 接口 & 反射
接口详解 // 举例:sort包中的 Sort 函数,如下: func Sort(data Interface) Sort sorts data. It makes one call to data. ...
- Mysql学习(一)之简单介绍
数据库简介 数据库分类 关系型数据库:MySQL.Oracle.SQLServer.Access.db2.fox pro 文件型数据库:sqlite.mongodb 空间型数据库: 数据库分为两端 数 ...
- Altium Designer 只导出PCB元器件及标号的PDF文件的方法
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明. 作者:struct_mooc 博客地址:https://www.cnblogs.com/stru ...
- 彻底了解websocket原理
一.websocket与http WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算) 首先HTTP有 1 ...
- react 不同环境配置不同域名
npm eject 先将配置文件暴露出来 将scripts中的build文件复制一份,改名为你需要的名字 将其中的 process.env.NODE_ENV 赋值为你需要的环境 在package.js ...