免疫算法(Immune Algorithm,IA)解决3DTSP问题

免疫算法(Immunological Algorithm, IA)是一类受生物免疫系统启发的启发式算法,广泛用于优化和搜索问题。以下是对免疫算法的简要介绍:

免疫算法的基本原理

免疫算法模拟了生物体免疫系统的关键特性,如克隆选择、变异、亲和力成熟和免疫记忆,以解决复杂的优化问题。其核心思想是通过不断生成和筛选候选解,找到全局最优解。

主要步骤

  1. 初始化种群

    • 随机生成初始解集,每个解被称为抗体。
    • 每个抗体的适应度(即其在问题空间中的质量)被计算出来。
  2. 克隆选择

    • 根据适应度选择一部分优秀的抗体进行克隆。
    • 克隆数量通常与抗体的适应度成正比。
  3. 变异操作

    • 对克隆体进行变异操作,模拟生物体中抗体多样性的产生过程。
    • 变异后的克隆体即新的候选解。
  4. 亲和度评价

    • 计算每个变异体的适应度,评估其质量。
    • 选择亲和度(适应度)最高的变异体作为新的抗体。
  5. 种群更新

    • 将亲和度高的抗体保留在种群中,同时引入一些随机生成的新抗体,以保持种群的多样性。
    • 替换部分旧抗体,防止算法陷入局部最优。
  6. 迭代进化

    • 不断重复克隆选择、变异、亲和度评价和种群更新的过程,逐步优化解集。
    • 通过多次迭代,寻找到全局最优解。

免疫算法的特点

  • 多样性维护:通过变异和引入新抗体,保持种群的多样性,避免陷入局部最优。
  • 全局搜索能力:克隆选择机制增强了算法的全局搜索能力,提高找到最优解的概率。
  • 自适应性:模拟免疫系统的自适应机制,算法具有较好的鲁棒性和适应性。

优缺点

优点

  • 适用于复杂的多峰优化问题。
  • 能够保持种群多样性,提高全局搜索能力。

缺点

  • 计算复杂度较高,尤其在种群规模较大时。
  • 依赖参数设置,参数选择不当可能影响算法性能。

 

代码结构和主要步骤

  1. 数据读取与初始化

    • 从CSV文件中读取城市坐标数据。
    • 计算并构建城市之间的距离矩阵 D。
    • 初始化免疫算法参数:种群大小 NP、最大迭代代数 G、克隆个数 Ncl。
  2. 距离矩阵计算

    • 利用欧几里得距离公式,计算任意两个城市间的距离并存储在矩阵 D中。
  3. 初始种群生成

    • 随机生成初始种群,每个个体表示一种城市访问顺序。
    • 计算初始种群中每个个体的路径长度。
  4. 免疫循环

    • 对前一半个体进行克隆操作。
    • 对每个克隆个体进行变异操作(随机交换两个城市的顺序)。
    • 计算每个克隆个体的路径长度,保留亲和度最高(路径长度最短)的个体。
    • 生成新的随机种群,与免疫种群合并并进行排序。
    • 更新最优解和相应的路径长度。
  5. 结果输出与可视化

    • 输出最优解(即最短路径)。
    • 绘制最优路径的3D图。
    • 绘制目标函数值的进化曲线。

免疫算法的关键步骤

  1. 初始化:随机生成初始种群,并计算每个个体的适应度(即路径长度)。

  2. 克隆选择

    • 选择适应度前一半的个体进行克隆。
    • 克隆过程中,对每个克隆体进行变异操作,确保基因多样性。
  3. 亲和度评价与选择

    • 计算克隆体的适应度,选择亲和度最高的个体保留。
  4. 种群刷新

    • 生成新的随机种群,与克隆选择后的种群合并。
    • 对合并后的种群进行排序,更新种群。
  5. 迭代进化

    • 通过迭代,不断优化种群,提升整体适应度,直到达到最大代数或其他终止条件。
clc;
clear all;
file_path = '..\chapter2\data.csv';
C = csvread(file_path, 1, 1);
N=size(C,1);                    %TSP问题的规模
D=zeros(N);                     %任意两个加工区域的距离间隔矩阵
%%%%%%%%%%%%%%%%%%%%%求任意两个城市距离间隔矩阵%%%%%%%%%%%%%%%%%%%%%
for i=1:N
    for j=1:N
        D(i,j)=((C(i,1)-C(j,1))^2+(C(i,2)-C(j,2))^2+(C(i,3)-C(j,3)))^0.5;
    end
end
NP=400;                           %免疫个体数目
G=3000;                           %最大免疫代数
f=zeros(N,NP);                    %用于存储种群
for i=1:NP
    f(:,i)=randperm(N);           %随机生成初始种群
end
len=zeros(NP,1);                  %存储路径长度
for i=1:NP
    len(i)=func3(D,f(:,i),N);     %计算路径长度
end
[Sortlen,Index]=sort(len);
Sortf=f(:,Index);                 %种群个体排序
gen=0;                            %免疫代数
Ncl=40;                            %克隆个数
%%%%%%%%%%%%%%%%%%%%%%%%%%%免疫循环%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
while gen<G
    for i=1:NP/2
        %%%%%%%%%%%%选激励度前NP/2个体进行免疫操作%%%%%%%%%%%%%%%
        a=Sortf(:,i);
        Ca=repmat(a,1,Ncl);
        for j=1:Ncl
            p1=floor(1+N*rand());
            p2=floor(1+N*rand());
            while p1==p2
                p1=floor(1+N*rand());
                p2=floor(1+N*rand());
            end  %确保p1和p2不同
            tmp=Ca(p1,j);
            Ca(p1,j)=Ca(p2,j);
            Ca(p2,j)=tmp;
        end
        Ca(:,1)=Sortf(:,i);            %保留克隆源个体
        %%%%%%%%%%%%克隆抑制,保留亲和度最高的个体%%%%%%%%%%%%%%
        for j=1:Ncl
            Calen(j)=func3(D,Ca(:,j),N);
        end
        [SortCalen,Index]=sort(Calen);
        SortCa=Ca(:,Index); 
        af(:,i)=SortCa(:,1);
        alen(i)=SortCalen(1);
    end
    %%%%%%%%%%%%%%%%%%%%%%%%%%种群刷新%%%%%%%%%%%%%%%%%%%%%%%%%%
    for i=1:NP/2
        bf(:,i)=randperm(N);          %随机生成初始种群
        blen(i)=func3(D,bf(:,i),N);   %计算路径长度
    end  
    %%%%%%%%%%%%%%%%%%%%免疫种群与新种群合并%%%%%%%%%%%%%%%%%%%%%
    f=[af,bf];
    len=[alen,blen];
    [Sortlen,Index]=sort(len);
    Sortf=f(:,Index);
    gen=gen+1;
    trace(gen)=Sortlen(1);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%输出优化结果%%%%%%%%%%%%%%%%%%%%%%%%%%%
Bestf=Sortf(:,1);                 %最优变量
Bestlen=trace(end);               %最优值
figure
for i=1:N-1
    plot3([C(Bestf(i),1),C(Bestf(i+1),1)],...
        [C(Bestf(i),2),C(Bestf(i+1),2)], ...
        [C(Bestf(i),3),C(Bestf(i+1),3)],'bo-');
    hold on;
end
plot3([C(Bestf(N),1),C(Bestf(1),1)],...
    [C(Bestf(N),2),C(Bestf(1),2)], ...
    [C(Bestf(N),3),C(Bestf(1),3)],'ro-');
title(['优化最短距离:',num2str(trace(end))]);
figure,plot(trace)
xlabel('迭代次数')
ylabel('目标函数值')
title('亲和度进化曲线')

 结果

 

 

 

  • 12
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值