【旅行商问题】基于matlab免疫算法求解旅行商问题【含Matlab源码 195期】

182 阅读3分钟

一、简介

免疫算法是在克服遗传算法不足的基础上,提出的一种具有更强鲁棒性和更快收敛法速度的搜索算法。它可以很好地解决遗传算法中出现的退化现象,所以在解决复杂的最其及优问题时具有广泛的应用。
例如,旅行商问题:一个商人从某一城市出发,要遍历所有目标城市,其中每个城市必须而且只须访问一次。其具体过程如下
1 个体编码和适应度函数
(1)算法实现中,将TSP问题的目标函数对应于抗原,问题的解对应于抗体。
(2)抗体采用以遍历城市的次序排列进行编码,每一抗体码串形如:V1,V2,…,Vn,其中V表示遍历城市的序号。适应度函数取路径长度Td倒数:

2 交又与变异算子
采用单点交叉,其中交又点的位置随机确定。算法中加入了对遗传个体基因型特征的继承性和对进一步优化所需个体特征的多样性进行评测的环节,在此基础上设计了种部分路径变异法。
该方法每次选取全长路径的一段,路径子段的起点与终点由评测的结果估算确定具体操作为采用连续n次的调换方式,其中n的大小由遗传代数K决定。
3 免疫算子
免疫算子有两种类型全免疫(非特异性免疫)和目标免疫(特异性免疫),其中全免疫即群体中的每个个体在进化算子作用后,对其每一环节都进行一次兔疫操作的免疫类型;目标免疫即在进行了进化操作后,经过一定的判断,个体仅在作用点处发生免疫反应的一种类型。
对于旅行商问题,要找到适用于整个抗原(即全局问题求解)的疫苗极为困难,所以我们采用目标免疫。
在求解问题之前先从每个城市点的周围各点中选取一个路径最近的点,以此作为算法执行过程中对该城市点进行目标免疫操作时所注人的疫苗母次遗传操作后,随机抽取一些个体注射疫苗,然后进行免疫检测,即对接种了疫苗
的个体进行检测:若适应度提高,则继续;反之,若其适应度不如父代,说明在交叉、变异的过程中出现了严重的退化现象,这时该个体将被父代中所对应的个体所取代。
在选择阶段,先计算其被选中的概率,后进行相应的条件判断。
4 案例
下面选取8个城市的规模,随机生成城市的坐标。

二、源代码

clear all
clc
N=8;               
%城市的个数
M=N-1;               
%种群的个数
pos=randn(N,2);
%%生成城市的坐标
global D;
%城市距离数据
D=zeros(N,N);
for i=1:N
    for j=i+1:N
        dis=(pos(i,1)-pos(j,1)).^2+(pos(i,2)-pos(j,2)).^2;
        D(i,j)=dis^(0.5);
        D(j,i)=D(i,j);
    end
end
unction result = CharRecompose(A)
global D;
index = A(1,2:end);
tmp = A(1,1);
result = [tmp];
[m,n] = size(index);
while n>=2
    len = D(tmp,index(1));
    tmpID = 1;
    for s = 2:n
        if len > D(tmp,index(s))
            tmpID = s;
            len = D(tmp,index(s));
        end
        function result = DisplaceInit(A)
[m,n] = size(A);
tmpCol = 0;
for col = 1:n
    if A(1,col) == 1
        tmpCol = col;
        break;
    end
end

三、运行结果

在这里插入图片描述

四、备注

版本:2014a