了解改良圈算法

一.相关知识——Hamilton圈

什么是Hamilton圈?
哈密顿图(哈密尔顿图)(英语:Hamiltonian path,或Traceable path)是一个无向图,由天文学家哈密顿提出,由指定的起点前往指定的终点,途中经过所有其他节点且只经过一次。在图论中是指含有哈密顿回路的图,闭合的哈密顿路径称作哈密顿回路(Hamiltonian cycle),含有图中所有顶点的路径称作哈密顿路径。
从图中的任意一点出发,路途中经过图中每一个结点当且仅当一次,则成为哈密顿回路。(我的理解就是从一点出发经过所有点在回到原始位置画一个圈)
Hamilton圈满足两个条件:①封闭的环②是一个连通图,且图中任意两点可达

二.改良圈算法

1. 基本原理

首先求得一个Hamilton圈,然后修改圈得到具有较小权的另一个Hamilton圈,直至无法改进则停止

2. 构建新的改良圈
在基本原理中提到“修改圈” ,那么如何修改圈?
对于 1 i < i + 1 < j n 1≤i<i+1<j≤n ,构建新的Hamilton圈 C i j = V 1 V 2 V i V j V j 1 V j 2 V i + 1 V j + 1 V j + 2 V n V 1 C_{ij} = V_1V_2…V_iV_j V_{j-1}V_{j-2}…V_{i+1}V_{j+1}V_{j+2}…V_nV_1 它是由C中将vi和vj之间的边逆序得到的。若 w V i V j + w V i + 1 V j + 1 < w V i V i + 1 + w V j V j + 1 w(V_iV_j)+w(V_{i+1}V_{j+1})<w(V_iV_{i+1})+w(V_jV_{j+1}) 则该圈替换有效
在这里插入图片描述

3.例子+MATLAB代码
在这里插入图片描述

clear,clc;
%% 初始数据
D=[ 0 56 35 21 51 60
    56 0 21 57 78 70
    35 21 0 36 68 68
    21 57 36 0 51 61
    51 78 68 51 0 13
    60 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:L
    flag=0;                           %退出标志
    for i=1:L-2
        for j=i+2:L
            if 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+1
                flag=flag+1;          %注意上述...中也有城市访问顺序也跟着改变
            end                       %即i+1-j之间的访问顺序颠倒
        end 
    end
    if flag==0                        %如果flag=0表明没有新圈代替 说明已经找到一个相对较优的解
        long=0;
        for n=1:L
            long=long+D(c(n),c(n+1)); %求出起点经过中间城市然后到终点然后从终点直接回到起点的距离
        end
        circle=c;
        break;
    end
end

4.局限与想法
很明显使用该算法得到的只是较好解,几乎可以肯定不是最优解。前几天看过遗传算法的相关知识,现在知道为什么很多关于遗传算法中的介绍都会提到改良圈算法,先用改良圈算法求一个较好的解,然后再用遗传算法优化求出最优解,这应该就是所谓的1+1>2吧!

本文代码是《数学建模算法与应用》中代码经过自己改编的

猜你喜欢

转载自blog.csdn.net/Fighting_Peter/article/details/104278498