博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
双调欧几里德旅行商问题--hdu 2224 The shortest path --- POJ 2677Tour
阅读量:5030 次
发布时间:2019-06-12

本文共 1638 字,大约阅读时间需要 5 分钟。

货郎问题(Traveling Salesman Problem,简称“TSP”)也叫货郎担问题,中国邮路问题,旅行商问题等,是计算机算法理论历史上的经典问题。在过去几十年中,它成为许多重要算法思想的测试平台,同时也促使一些新的理论领域的产生,比如多面体理论和复杂性理论。 货郎问题:给定n个结点和任意一对结点{i,j}之间的距离为dist(i,j),要求找出一条闭合的回路,该回路经过每个结点一次且仅一次,并且该回路的费用最小,这里的费用是指每段路径的距离和。 货郎问题求解其精确解是NP难的,并且求解任意常数因子近以度的解也是NP难的。若将问题限定在欧氏平面上,就成为欧氏平面上的货郎问题,也叫欧几里德旅行商问题(Eculid Traveling Salesman Problem)。但是,即使是欧氏平面上的货郎问题也是NP难的。因此通常用来解决TSP问题的解法都是近似算法。其中第一个欧几里德旅行商问题的多项式近似算法是Arora在1996年使用随机平面分割和动态规划方法给出的。

    J.L. Bentley 建议通过只考虑双调旅程(bitonic tour)来简化问题,这种旅程即为从最左点开始,严格地从左到右直至最右点,然后严格地从右到左直至出发点。事实上,存在确定的最优双调路线的O(n*n)时间的算法。

/**********************************************************************

*        Bitonic path (详见《算法导论》 P217)                                                                                  
*        一个人从p1严格地增的走到pn,然后再严格递减的回到p1;求总路径的最小值;                                                    
*        对于1 <= i <= j <= n, 我们定义P(i, j)是一条包含了P1, P2, P3 …… Pj的途径;                   
*        这条路径可以分成2部分:递减序列与递增序列                                                                
*        起点是Pi(1 <= i <= j),拐点是P1,终点是Pj, P[i, j]为其最小值;                                     
*        状态转移方程为:                                                                                                                      
*        b[1,2] = |P1P2|,                                                                                                                               
*        i < j-1时, b[i,j] = b[i,j-1] + |Pj-1Pj|    点Pj-1在递增序列中,                                                
*        i = j-1时, b[i,j] = min{ b[k,j-1] + |PkPj|, 1<= k < j-1 }  点Pj-1在递减序列中                      
*        b[n,n] = b[n-1,n] + |Pn-1Pn|                                                                                                        
**********************************************************************/

#include"stdio.h"#include"math.h"#define INF 9999999struct point{	double x,y;}point[202];int n;double dis[202][202],b[202][202];double distant(int i,int j){	return sqrt((point[i].x-point[j].x)*(point[i].x-point[j].x)+(point[i].y-point[j].y)*(point[i].y-(point[j].y)));}double dp(){	int i,j;	double temp;	b[1][2]=dis[1][2];	for(j=3;j<=n;j++)	{		for(i=1;i<=j-2;i++)			b[i][j]=b[i][j-1]+dis[j-1][j];		b[j-1][j]=INF;		for(i=1;i<=j-2;i++)		{			temp=b[i][j-1]+dis[i][j];			if(temp

转载于:https://www.cnblogs.com/yyf573462811/archive/2012/07/27/6365365.html

你可能感兴趣的文章
洛谷P2556 [AHOI2002] 黑白图像压缩 [模拟]
查看>>
letecode [136] - Single Number
查看>>
linux下设置固定IP的方法
查看>>
VMware虚拟机下Linux系统的全屏显示
查看>>
net core体系-web应用程序-4asp.net core2.0 项目实战(任务管理系统)-2项目搭建
查看>>
高效的jQuery
查看>>
ubuntu 16.04 (软件应用)-输入法
查看>>
windos7修复引导扇区
查看>>
Leetcode总结之Backtracking
查看>>
Android开发学习之路-图片颜色获取器开发(1)
查看>>
StackExchange.Redis 官方文档(一) Basics
查看>>
nupkg 之破解 nodejs+electron-packager 打包exe的解包
查看>>
Objective-C 使用 C++类
查看>>
浅谈之高级查询over(partition by)
查看>>
Notes: CRM Analytics–BI from a CRM perspective (2)
查看>>
graphite custom functions
查看>>
列出所有的属性键
查看>>
js获取请求地址后面带的参数
查看>>
[原创]使用java批量修改文件编码(ANSI-->UTF-8)
查看>>
设计模式のCompositePattern(组合模式)----结构模式
查看>>