java 双调旅行商 hamiltonian,双调欧几里得旅行商问题(TSP)
最小环+欧拉回路=最短哈密顿图
介绍
TSP(Traveling Salesman Problem)即旅行商问题,是数学领域中著名问题之一。这个问题是这样的:假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径长度为所有路径之中的最小值。TSP是一个典型的组合优化问题,且是一个NP完全难题,关于NP的这个概念本文就不做详细介绍了,但简单的说就是:TSP问题目前尚不能找到一个多项式时间复杂度的算法来求解。
n个城市 第一次选择n-1个城市,第二次n-2... 即要遍历n!次,普通遍历复杂度太高
算法
所以TSP旅行商问题有以下4种算法
贪心算法
模拟退火算法
遗传算法
基本蚁群算法
双调欧几里得旅行商问题
这种旅程即为从最左点开始,严格地从左到右直至最右点,然后严格地从右到左直至出发点。事实上,存在确定的最优双调路线的O(n*n)时间的算法。
是对平面上给定的n个点确定一条连接各点的最短闭合旅程的问题。 题目描述 现在笛卡尔平面上有n(n<=1000)个点,每个点的坐标为(x,y)(-2^31
思路
(1)首先将各点按照x坐标从小到大排列,时间复杂度为O(nlgn)。 (2)寻找子结构:定义从Pi到Pj的路径为:从Pi开始,从右到左一直到P1,然后从左到右一直到Pj。在这个路径上,会经过P1到Pmax(i,j)之间的所有点且只经过一次。
模板
#include
#include
#include
#include
#include
#define INF 1e30 //数据上限
using namespace std;
const int MAX = 1000;//点的最大数
int n;double dis[MAX][MAX],dp[MAX][MAX];
struct node{
double x,y;
}a[MAX];
bool cmp(node a,node b) {
return a.x < b.x;
}
double Euc(node a,node b){//计算欧几里得距离
return sqrt(pow(a.x - b.x,2) + pow(a.y - b.y,2));
}
double DP(){
sort(a,a + n,cmp);//排序
for(int i = 0;i < n;i++){
for(int j = i + 1;j < n;j++){
dis[i][j] = Euc(a[i],a[j]);
dp[i][j] = INF;
}
}
dp[0][1] = dis[0][1];
for(int i = 0;i < n;i++){
for(int j = i + 1;j < n;j++){
dp[i][j + 1] = min(dp[i][j + 1],dp[i][j] + dis[j][j + 1]);
dp[j][j + 1] = min(dp[j][j + 1],dp[i][j] + dis[i][j + 1]);
}
}
double ans=INF;
for(int i = 0;i < n - 1;i++) ans = min(ans,dp[i][n - 1] + dis[i][n - 1]);
return ans;
}
int main(){
scanf("%d",&n);
for(int i = 0;i < n;i++)
scanf("%lf%lf",&a[i].x,&a[i].y);
double ans=DP();
printf("%0.2lf\n",ans);
return 0;
}
例题
java 双调旅行商 hamiltonian,双调欧几里得旅行商问题(TSP)相关推荐
- 【算法学习】双调欧几里得旅行商问题(动态规划)
双调欧几里得旅行商问题是一个经典动态规划问题.<算法导论(第二版)>思考题15-1和北京大学OJ2677都出现了这个题目. 旅行商问题描述:平面上n个点,确定一条连接各点的最短闭合旅程.这 ...
- 【算法导论】双调欧几里得旅行商问题
首先,庆贺一下自己解决了(看懂了传说中的niubility的旅行商问题) 其次,马上要看到著名的贪心算法问题了!心中无比的激动. 旅行商问题描述:平面上n个点,确定一条连接各点的最短闭合旅程.这个解的 ...
- 双调欧几里得旅行商问题_教学 | 旅行商问题(TSP)的整数规划模型
介绍旅行商问题(TSP)的整数规划模型. 最近有朋友在后台咨询TSP的整数规划建模问题,经过学习相关资料,现简单介绍TSP两种经典的整数规划模型. 1 TSP问题概述 旅行商问题 (Traveling ...
- 旅行售货员 java_JAVA旅行商售货TSP
题目描述 有若干个城市,任何两个城市之间的距离都是确定的,现要求一旅行商从某城市出发必须经过每一个城市且只在一个城市逗留一次,最后回到出发的城市,问如何事先确定一条最短的线路以保证路径最短? 输入 输 ...
- JAVA之旅(八)——多态的体现,前提,好处,应用,转型,instanceof,多态中成员变量的特点,多态的案例...
JAVA之旅(八)--多态的体现,前提,好处,应用,转型,instanceof,多态中成员变量的特点,多态的案例 一.多态 我们今天又要学习一个新的概念了,就是多态,它是面向对象的第三个特征,何谓多态 ...
- MATLAB实战系列(十九)-遗传算法解决TSP(旅行商)问题-应用及解析(文末附MATLAB源码)
接上篇MATLAB实战系列(十八)-遗传算法解决TSP(旅行商)问题-算法原理 https://wenyusuran.blog.csdn.net/article/details/114060030 感 ...
- 利用Matlab优化工具箱求解旅行商最短路径问题
前面介绍了利用Matlab二元整数规划求解数独问题,对于另一个问题-旅行商问题也可以用它来求解. 旅行商问题就是找到经过所有站点的最短闭合路径,如下图为在美国地图框架内产生的200个旅行站点,而旅行商 ...
- poj1061-青蛙的约会(拓展欧几里得java)
题目: 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚 ...
- a算法TSP旅行商java_A*算法实现旅行商问题(人工智能报告,付代码)
一. 问题描述 "旅行商问题"常被称为"旅行推销员问题",是指一名推销员要拜访多个地点时,如何找到在拜访每个地点一次后再回到起点的最短路径.规则虽然简单,但在地 ...
最新文章
- [号外] Blazor wasm 其实也挺快!
- 棘手的问题input:当在严格模式中使用 Vuex 时,在属于 Vuex 的 state 上使用 v-model,input
- CTS(13)---CTS 测试之Media相关测试failed 小结(一)
- 如何自学python-小白是如何自学Python逆袭成功的?
- java实训心得体会3篇_java实训心得体会3篇
- tomcat启动异常:org.apache.catalina.deploy.WebXml addFilter或者the JDBC Driver has been forcibly unregister
- IBM深陷云计算业务欺诈丑闻,遭股东集体诉讼
- 如何把拼音放在文字的右侧,干货到,在WORD中怎么把拼音和汉字同排
- 我的2018年考博英语复习计划Share
- Java项目:基于java+ssm生鲜超市进销存管理系统--计算机毕业设计
- 30岁成功入职京东啦
- EditPlus设置远程连接Linux管理文件
- 005. 组合总和 II
- Vue + Spring Boot 项目实战(四):数据库的引入
- 西门子工控机触摸屏维修IPC677D平板式PC机
- 基于CANVAS与MD5的客户端生成验证码
- 国家基金申请书中的科学问题与关键问题
- matlab poly用法
- Lucene 7.5.0 索引文件之tvxtvd
- K2L:工业和汽车网络通信设备的开发工具