首先,庆贺一下自己解决了(看懂了传说中的niubility的旅行商问题)

其次,马上要看到著名的贪心算法问题了!心中无比的激动。

旅行商问题描述:平面上n个点,确定一条连接各点的最短闭合旅程。这个解的一般形式为NP的(在多项式时间内可以求出)

J.L. Bentley 建议通过只考虑双调旅程(bitonic tour)来简化问题,这种旅程即为从最左点开始,严格地从左到右直至最右点,然后严格地从右到左直至出发点。下图(b)显示了同样的7个点的最短双调路线。在这种情况下,多项式的算法是可能的。事实上,存在确定的最优双调路线的O(n*n)时间的算法。

  

PS:在一个单位栅格上显示的平面上的七个点。 a)最短闭合路线,长度大约是24.89。这个路线不是双调的。b)相同点的集合上的最短双调闭合路线。长度大约是25.58。

解答思路:采用动态规划思想

1),首先给七个点按从左到右编号(如图所示)

2),定义一个数组:double m[8][8]; //最短路径长度

和一个求两点距离的方法:double d(Del x[],int i,int j)

3),m[i][j]存的是编号 i 点与 编号 j 点的最短距离。首先声明的是:m[i][j]=m[j][i];

所以,m矩阵是一个对称矩阵。即 i 点与 j 点的距离跟j点与i点的矩阵相等。所以这里我们只需要求下三角矩阵m就可以。

4),

  

对于任意一个点i来说,有两种连接方法,一种是如图(a)所示,i与i-1相连;另一种呢是如图(b),i与i-1不相连。(这里思想的关键)

5),由以上思路得递归公式:(i>j 求的是下三角)

(i==j时): m[i][j]=m[i][j-1]+d[i][j-1] 等于0
(i>j+1时):m[i][j]= m[i-1][j]+d[i-1][i] 通过已经求出的 上一个调节点 i-1
(i=j+1时):m[i][j]=min(1<=k<j)(m[k][j]+d[k][i]) //选择直接相连 还是不相连

//直接相连 m[i][j]=0+d[i][j];

//否则:m[i][j]=m[k][j]+d[k][i]; 通过某一个 最小代价的中间

//调节点来连接

6),求下三角时,i-1 编号的节点 是关键节点。

7),源码如下:
#include <stdio.h>
#include <math.h>
#define MAX 65535

double m[8][8]; //最短路径长度
/ /其中的 i j 分别代表七个点的编号

typedef struct{
double x,y; //横纵坐标
}Del;
double d(Del x[],int i,int j)
{
//计算两点之间距离,如果i,j都大于0返回两点距离,否则返回0
if(i>0&&j>0)
return sqrt((x[i].x-x[j].x)*(x[i].x-x[j].x)+(x[i].y-x[j].y)*(x[i].y-x[j].y));
else
return 0;
}

void Short_Way(Del x[]) //传递进来的 坐标数组
{
//求最短路径长度
int i,j,k;
double w;
for(j=0;j<=7;j++)
m[0][j]=0;
for(i=0;i<=7;i++)
m[i][0]=0;

for(i=1;i<=7;i++) //从左向右
{
for(j=1;j<=i;j++) //从下向上 注意 j<=i
{
if(i==j)
m[i][j]=m[i][j-1]+d(x,i,j-1); //m[i][j]依赖已经求出来的 m[i][j-1]
//初始化时 m[1][1]=0; 因为 = m[1][0]+d(x,1,0)
if(i>j+1)
m[i][j]=m[i-1][j]+d(x,i-1,j); //m[i][j]依赖已经求出来的 m[i-1][j] ??

if(i==j+1)
{
m[i][j]=MAX;
if(j==1) //i=2
m[i][j]=d(x,j,i);

for(k=1;k<j;k++) //计算 是相邻两点 近 还是 经过其他点后 近
{
w=m[k][j]+d(x,k,i);
if(w<m[i][j])
m[i][j]=w;
}
}
m[j][i]=m[i][j]; //对称到 上三角
}
}
}
int main(){
Del x[8];
x[1].x=0.0;
x[1].y=6.0;
x[2].x=1.0;
x[2].y=0.0;
x[3].x=2.0;
x[3].y=3.0;
x[4].x=5.0;
x[4].y=4.0;
x[5].x=6.0;
x[5].y=1.0;
x[6].x=7.0;
x[6].y=5.0;
x[7].x=8.0;
x[7].y=2.0;
Short_Way(x);
printf("%f",m[7][7]);
return 0;
}

转载于:https://www.cnblogs.com/JPAORM/archive/2011/11/29/2510079.html

【算法导论】双调欧几里得旅行商问题相关推荐

  1. 【算法学习】双调欧几里得旅行商问题(动态规划)

    双调欧几里得旅行商问题是一个经典动态规划问题.<算法导论(第二版)>思考题15-1和北京大学OJ2677都出现了这个题目. 旅行商问题描述:平面上n个点,确定一条连接各点的最短闭合旅程.这 ...

  2. java 双调旅行商 hamiltonian,双调欧几里得旅行商问题(TSP)

    最小环+欧拉回路=最短哈密顿图 介绍 TSP(Traveling Salesman Problem)即旅行商问题,是数学领域中著名问题之一.这个问题是这样的:假设有一个旅行商人要拜访n个城市,他必须选 ...

  3. 双调欧几里得旅行商问题_教学 | 旅行商问题(TSP)的整数规划模型

    介绍旅行商问题(TSP)的整数规划模型. 最近有朋友在后台咨询TSP的整数规划建模问题,经过学习相关资料,现简单介绍TSP两种经典的整数规划模型. 1 TSP问题概述 旅行商问题 (Traveling ...

  4. 算法导论答案 思考题15-1 双欧几里德旅行商问题

    解题思路: 根据简化后的双调欧几里得旅行问题的性质,将点集依据各点x坐标单调递增来进行编号,我们设b[i,j]是最短双调闭合旅程P(i,j)的长度(i<=j),而最短双条闭合旅程P(i,j)是指 ...

  5. 经典算法之辗转相除法(欧几里得定理)

    问题描述: 两个数a,b,要求求得这两个数的最大公约数和最小公倍数. 解题思路: 辗转相除法(欧几里得定理)思想:一个数,能整除数a和数b,那么这个数一定可以整除(a-b),即gcd(a, b) = ...

  6. C语言求最大公约数欧几里得Euclid算法(附完整源码)

    最大公约数欧几里得Euclid算法 最大公约数欧几里得Euclid算法完整源码(定义,实现,main函数测试) 最大公约数欧几里得Euclid算法完整源码(定义,实现,main函数测试) #inclu ...

  7. 欧几里得游戏解析实现

    首先我们可以写出两个数字来找出规律 第一例: 地板上的数字14  2   游戏结束之后 地板上的数字是:14 12 10 8 6 4 2  这7个数字   这时先写的就会赢 第二例: 地板上的数字为7 ...

  8. Java实现算法导论中求解模线性方程解(基于最大公约数欧几里得扩展算法)

    基于最大公约数欧几里得扩展算法求解算法导论中模线性方程解.具体要结合算法导论中的有关数论算法章节理解,具体代码如下: package cn.ansj;/*假设方程ax=b(mod n)有解,且x0是方 ...

  9. 机器学习的算法和普通《算法导论》里的算法有什么本质上的异同

    机器学习的算法和普通<算法导论>里的算法有什么本质上的异同? 本人非计算机专业出身,对这些方向感兴趣,所以有此一问.曾经问过一些人,说是机器学习全是数学,是用数学的方式试图去描述和理解我们 ...

最新文章

  1. 《数学之美》第27章 期望最大化算法
  2. 【NLP】发现一篇专门吐槽 NLP 内卷现状的 ACL 论文 ...
  3. 24点游戏java_24点游戏动态规划解法(java)
  4. commons-httpclient 和 httpclient 区别
  5. 2021年二月下旬文章导读与开源项目仓库 | scatter-gather DMA,SR-IOV,ARP欺骗,中断,Lockdep,virtio,vhost
  6. 题目1140:八皇后
  7. vue生命周期整理学习
  8. 文字垂直居中,水平居中 a标签水平居中只要给他的父级设置text-align=center
  9. 分布式系统负载均衡策略分析与研究
  10. 计算机修改用户名密码,怎么修改电脑用户名
  11. 键盘 Fn 键 的锁定与解锁
  12. scratch学习1 积木区+程序区
  13. JWT 生成Token、解析Token的简单工具类
  14. nant_NAnt和FxCopCmd今天我在NAnt和
  15. 【硬件】标准阻值的由来
  16. 接入层网络用于讲家庭用户计算机,根据寄生虫的方法,计算机病毒分为引导区型病毒,文件型病毒和寄生虫病毒...
  17. 联想ThinkPad 官网驱动下载 对应你的电脑的型号
  18. 思科模拟器Boson NetSim 8.0破解
  19. PPP模式如何激活智慧城市建设?
  20. 计算机网络之物理层-基带传输

热门文章

  1. 设计模式:单例模式7种写法
  2. 最大连续区间和的算法总结(转)
  3. (转载)操作系统还有未来么?
  4. Android网络通信的六种方式
  5. datagrid嵌套和资源消耗
  6. 【Java从0到架构师】Zookeeper - 系统高可用、分布式的基本概念、Zookeeper 应用场景
  7. 自底向上带你逆向解析hibernate联合主键
  8. 克罗谈投资策略01_期货交易中的墨菲法则
  9. doctor mysql数据导入_线上环境mysql主从同步的搭建过程
  10. linux进入超级管理员权限,一直处于超级管理员权限下