一.相关知识——Hamilton圈
什么是Hamilton圈?
哈密顿图(哈密尔顿图)(英语:Hamiltonian path,或Traceable path)是一个无向图,由天文学家哈密顿提出,由指定的起点前往指定的终点,途中经过所有其他节点且只经过一次。在图论中是指含有哈密顿回路的图,闭合的哈密顿路径称作哈密顿回路(Hamiltonian cycle),含有图中所有顶点的路径称作哈密顿路径。
从图中的任意一点出发,路途中经过图中每一个结点当且仅当一次,则成为哈密顿回路。(我的理解就是从一点出发经过所有点在回到原始位置画一个圈)
Hamilton圈满足两个条件:①封闭的环②是一个连通图,且图中任意两点可达
二.改良圈算法
1. 基本原理
首先求得一个Hamilton圈,然后修改圈得到具有较小权的另一个Hamilton圈,直至无法改进则停止
2. 构建新的改良圈
在基本原理中提到“修改圈” ,那么如何修改圈?
对于1≤i<i+1<j≤n1≤i<i+1<j≤n1≤i<i+1<j≤n,构建新的Hamilton圈Cij=V1V2…ViVjVj−1Vj−2…Vi+1Vj+1Vj+2…VnV1C_{ij} = V_1V_2…V_iV_j V_{j-1}V_{j-2}…V_{i+1}V_{j+1}V_{j+2}…V_nV_1Cij=V1V2…ViVjVj−1Vj−2…Vi+1Vj+1Vj+2…VnV1它是由C中将vi和vj之间的边逆序得到的。若 w(ViVj)+w(Vi+1Vj+1)<w(ViVi+1)+w(VjVj+1)w(V_iV_j)+w(V_{i+1}V_{j+1})<w(V_iV_{i+1})+w(V_jV_{j+1})w(ViVj)+w(Vi+1Vj+1)<w(ViVi+1)+w(VjVj+1)则该圈替换有效
3.例子+MATLAB代码
clear,clc;
%% 初始数据
D=[ 0 56 35 21 51 6056 0 21 57 78 7035 21 0 36 68 6821 57 36 0 51 6151 78 68 51 0 1360 70 68 61 13 0 ];
L=size(D,1); %求出D有几行即有几个城市
c=[5 1:4 6 5]; %选择初始圈 注意这已经是一个圈5->1->2->3->4->6->5
%% 改良圈
for k=1:Lflag=0; %退出标志for i=1:L-2for j=i+2:Lif D(c(i),c(j))+D(c(i+1),c(j+1))<D(c(i),c(i+1))+D(c(j),c(j+1))c(i+1:j)=c(j:-1:i+1); %替换圈本来路径i->i+1...->j->j+1替换成i->j...->i+1->j+1flag=flag+1; %注意上述...中也有城市访问顺序也跟着改变end %即i+1-j之间的访问顺序颠倒end endif flag==0 %如果flag=0表明没有新圈代替 说明已经找到一个相对较优的解long=0;for n=1:Llong=long+D(c(n),c(n+1)); %求出起点经过中间城市然后到终点然后从终点直接回到起点的距离endcircle=c;break;end
end
4.局限与想法
很明显使用该算法得到的只是较好解,几乎可以肯定不是最优解。前几天看过遗传算法的相关知识,现在知道为什么很多关于遗传算法中的介绍都会提到改良圈算法,先用改良圈算法求一个较好的解,然后再用遗传算法优化求出最优解,这应该就是所谓的1+1>2吧!
本文代码是《数学建模算法与应用》中代码经过自己改编的