Hamilton回路问题求解

本文分别以最近邻点法和最近插入法求解TSP问题中的Hamilton回路问题。用以下例题作为求解案例

V1 V2 V3 V4 V5 V6
V1 0 10 6 8 7 15
V2 10 0 5 20 15 16
V3 6 5 0 14 7 8
V4 8 20 14 0 4 12
V5 7 15 7 4 0 6
V6 15 16 8 12 6 0

最近邻点法

最近邻点法的主要逻辑是通过寻找离当前顶点最近的顶点来寻找回来,这样的计算方式比较简便,但是很多情况下只能找到近似解,找不到最优解。

step1.从网络中找一个点作为起点
step2.从剩下的点中找一个离上一个点最近的点加入
step3.重复step2
step4.将最后加入的点与起点连接。这样就构成了一个回路。

Matlab代码如下:

%% 最近邻点法求解Hamilton回路
clc;clear all;close all;
%% 参数初始化
Start=1; %默认取第一个点作为起点
%初始化邻接矩阵
E=[inf 10 6 8 7 1510 inf 5 20 15 166 5 inf 14 7 88 20 14 inf 4 127 15 7 4 inf 615 16 8 12 6 inf];
%顶点集长度
PointNum=size(E,1);
% 顶点集
V=linspace(1,PointNum,PointNum);
%Hamilton回路解集
HamSolve=[];
%Hamilton回路长度
HamLength=0;%% 最近邻点法迭代过程
%将起点加入回路解集
HamSolve=[HamSolve,Start];
%将起点从顶点集中去掉
V=setdiff(V,HamSolve);
%当前点
BetweenPoint=Start;
while ~isempty(V)%找到离起点最近的点VWeight=min(E(BetweenPoint,V));Next=find(E(BetweenPoint,:)==VWeight);%将离起点最近的点加入解集HamSolve=[HamSolve,Next];%将找到的点从顶点集中去掉V=setdiff(V,Next);%计算Hamilton回路长度HamLength=HamLength+VWeight;%将当前点修改为下一个点BetweenPoint=Next;
end
%将起点加入
HamSolve=[HamSolve,Start]
%计算最后的回路长度
HamLength=HamLength+E(Next,Start)

求解结果:

最近插入法

最近插入法(Nearest Insertion)是Rosenkrantz和Stearns等人在1977年提出的另一种解决TSP问题的算法,它比最近邻点法复杂,但可得到相对满意的解。

%% 最近插入法求解Hamilton回路
clc;clear all;close all;
%% 初始化参数
Start=1; %默认取第一个点作为起点
%初始化邻接矩阵
E=[inf 10 6 8 7 1510 inf 5 20 15 166 5 inf 14 7 88 20 14 inf 4 127 15 7 4 inf 615 16 8 12 6 inf];%顶点集长度
PointNum=size(E,1);
% 顶点集
V=linspace(1,PointNum,PointNum);
%Hamilton回路
HamSolve=[];
%Hamilton回路长度
HamLength=0;%% 最近插入法迭代过程
%将起点和终点加入回路解集
HamSolve=[HamSolve,Start,Start];
%将起点从顶点集中去掉
V=setdiff(V,HamSolve);
%当前点
BetweenPoint=Start;
%找到离起点最近的点
VWeight=min(E(BetweenPoint,V));
Next=find(E(BetweenPoint,:)==VWeight);
%Hamilton回路
HamSolve=[HamSolve(1),Next,HamSolve(end)];
%将找到的点从顶点集中去掉
V=setdiff(V,Next);
%计算Hamilton回路长度
HamLength=HamLength+VWeight+E(Next,Start);
%将当前点修改为下一个点
BetweenPoint=Next;while ~isempty(V)%Hamilton回路解集HamPoint=unique(HamSolve);%找到里当前子回路中顶点最近的顶点NearestPoint=0;NearWeight=zeros(1,length(HamPoint));NearPoint=zeros(1,length(HamPoint));for Point=1:length(HamPoint)NearWeight(Point)=min(E(HamPoint(Point),V));NearPoint(Point)=find(E(HamPoint(Point),:)==NearWeight(Point),1);endNearestPoint=NearPoint(find(NearWeight==min(NearWeight)));%计算回路增量HamIncrement=zeros(1,length(HamSolve)-1);for PoinInc=1:(length(HamSolve)-1)HamIncrement(PoinInc)=E(HamSolve(PoinInc),NearestPoint(1))+E(NearestPoint(1),HamSolve(PoinInc+1))-E(HamSolve(PoinInc),HamSolve(PoinInc+1));end[MinHamIncrement,InsertPoint]=min(HamIncrement);%将点插入Hamilton回路HamSolve=[HamSolve(1:InsertPoint),NearestPoint(1),HamSolve(InsertPoint+1:end)];%计算Hamilton回路长度HamLength=HamLength+MinHamIncrement;%将已插入的点去除V=setdiff(V,NearestPoint(1));
end
HamSolve
HamLength

求解结果:

最近插入法和最近邻点法相关推荐

  1. Hamilton问题求解-最近邻点法和最近插入法(Python实现)

    Hamilton问题求解-最近邻点法和最近插入法 一.定义 1. 哈密顿通路 设 G = < V , E > G=<V,E> G=<V,E>为一个图(有向图或者无向 ...

  2. 中望3D 2021 插入基准面 - 三点法

    路径: 零件/装配环境>造型Ribbon选项卡>基准面 本方法通过指定三个点确定一个基准面.此处可采用可选选项(参见下文的"可选输入")对该平面轴的方向予以进一步的控制 ...

  3. TSP问题(贪心法)最近邻点和最短连接

    1.最近邻点法 (贪心策略 TSP) 2. 最短连接 TSP问题 贪心算法 #include<stdio.h> #include<iostream> using namespa ...

  4. 在C#用GDI+实现图形图像的任意变形效果(转载)

    本文转载自: http://www.cnblogs.com/carekee/articles/2220515.html,详细可具体参考源网页 在C#用GDI+实现图形图像的任意变形效果 如何实现类似P ...

  5. 视觉SLAM总结——视觉SLAM十四讲笔记整理

    视觉SLAM总结--视觉SLAM十四讲笔记整理 说明 基础知识点 1. 特征提取.特征匹配 (1)Harris (2)SIFT (3)SUFT (4)ORB (5)特征匹配 2. 2D-2D:对极约束 ...

  6. 基于K-Means聚类算法对NBA球员数据的聚类分析

      聚类分析的研究成果主要集中在基于距离(或者称为基于相似度)的聚类方法,用距离来作为相似性度量的优点是十分直观,从我们对物体的识别角度来分析,同类的数据样本是相互靠近的,不同类样本应该相聚较远.K- ...

  7. 基于k-means聚类算法对NBA球员数据的一次聚类分析

    数据挖掘大作业 前言 本章工具 k-means介绍 k-means原理 最佳k值的确定 拐点法 轮廓系数法 聚类运算 结果分析 小结 参考文献 前言 聚类分析的研究成果主要集中在基于距离(或者称为基于 ...

  8. 什么是生化分析中的反应曲线?

    一.基本结构 (一)按照反应装置的结构,自动生化分析仪主要分为流动式(FLOW SYSTEM).分立式(DISCRETE SYSTEM)两大类. 1.流动式 指测定项目相同的各待测样品与试剂混合后的化 ...

  9. SLAM前端知识汇总

    1.常用特征点汇总 1.1 Fast特征点 <SLAM14讲>中LK光流中用的特征点就是Fast特征点,然后对这些特征点进行光流追踪. 在8.3.2节的LK光流代码,第1帧提取的就是Fas ...

最新文章

  1. 【SQL Server】系统学习之一:表表达式
  2. 玩转高性能超猛防火墙nf-HiPAC
  3. 如何用python编写一个绘制马赛克图像的自写程序mask = np.zeros
  4. 控件与布局(WPF)
  5. json数组显示格式
  6. 利用license机制来保护Java软件产品的安全
  7. 二叉树的四种遍历方式
  8. gblfy大数据技术之安装CentOS系列
  9. activiti 流程文件存哪里_JAVA-工作流引擎-activiti-Tasks介绍
  10. 拿来就能用!这本 Python 3.6 的实战书火爆了 IT 圈!
  11. (转)ASP.NET MVC 3.0:基于Ajax的表单提交,A页面认证失败后页面被强转至登录页面,待登录成功将如何回到A页面?...
  12. hdoj1465错排公式的应用(递推)
  13. 【密码学原理】密钥管理和分发——对称密钥分发
  14. 免费Web托管公司000Webhost被黑 1350万明文密码泄露
  15. 对一个整形数组进行顺序排列
  16. 算法与数据结构 --- 哈夫曼树及其应用
  17. 水晶报表打印出错,未能加载文件或程序集“CrystalDecisions.CrystalReports.Engine, Version=10.5.3700.0
  18. DuiLib : 做一个没有任务栏图标的Dialog
  19. Ubuntu18 ROS运行报错exit code -11
  20. 3GS到iPhone6P+ 历代iPhone屏幕尺寸、像素分辨率

热门文章

  1. vue2.0模板的三种写法
  2. Python使用 Pyvisa库 控制 NI 设备Fluke(详细)
  3. 1.MySQL增删改查(初阶)
  4. 软件项目实施工作流程参考
  5. 创业者的诗,远方和功不唐捐
  6. PEEKABOO——alpha冲刺置顶集合随笔
  7. sketch插件 android,Sketch 插件大集合
  8. 关于BigDecimal常量的使用ROUND_UP,ROUND_DOWN,ROUND_HALF_UP,ROUND_HALF_DOWN
  9. 如何写一个proto消息
  10. 域名备案和域名实名认证相同吗?