免疫算法(Immunological Algorithm, IA)是一类受生物免疫系统启发的启发式算法,广泛用于优化和搜索问题。以下是对免疫算法的简要介绍:
免疫算法的基本原理
免疫算法模拟了生物体免疫系统的关键特性,如克隆选择、变异、亲和力成熟和免疫记忆,以解决复杂的优化问题。其核心思想是通过不断生成和筛选候选解,找到全局最优解。
主要步骤
-
初始化种群:
- 随机生成初始解集,每个解被称为抗体。
- 每个抗体的适应度(即其在问题空间中的质量)被计算出来。
-
克隆选择:
- 根据适应度选择一部分优秀的抗体进行克隆。
- 克隆数量通常与抗体的适应度成正比。
-
变异操作:
- 对克隆体进行变异操作,模拟生物体中抗体多样性的产生过程。
- 变异后的克隆体即新的候选解。
-
亲和度评价:
- 计算每个变异体的适应度,评估其质量。
- 选择亲和度(适应度)最高的变异体作为新的抗体。
-
种群更新:
- 将亲和度高的抗体保留在种群中,同时引入一些随机生成的新抗体,以保持种群的多样性。
- 替换部分旧抗体,防止算法陷入局部最优。
-
迭代进化:
- 不断重复克隆选择、变异、亲和度评价和种群更新的过程,逐步优化解集。
- 通过多次迭代,寻找到全局最优解。
免疫算法的特点
- 多样性维护:通过变异和引入新抗体,保持种群的多样性,避免陷入局部最优。
- 全局搜索能力:克隆选择机制增强了算法的全局搜索能力,提高找到最优解的概率。
- 自适应性:模拟免疫系统的自适应机制,算法具有较好的鲁棒性和适应性。
优缺点
优点:
- 适用于复杂的多峰优化问题。
- 能够保持种群多样性,提高全局搜索能力。
缺点:
- 计算复杂度较高,尤其在种群规模较大时。
- 依赖参数设置,参数选择不当可能影响算法性能。
代码结构和主要步骤
-
数据读取与初始化:
- 从CSV文件中读取城市坐标数据。
- 计算并构建城市之间的距离矩阵 D。
- 初始化免疫算法参数:种群大小 NP、最大迭代代数 G、克隆个数 Ncl。
-
距离矩阵计算:
- 利用欧几里得距离公式,计算任意两个城市间的距离并存储在矩阵 D中。
-
初始种群生成:
- 随机生成初始种群,每个个体表示一种城市访问顺序。
- 计算初始种群中每个个体的路径长度。
-
免疫循环:
- 对前一半个体进行克隆操作。
- 对每个克隆个体进行变异操作(随机交换两个城市的顺序)。
- 计算每个克隆个体的路径长度,保留亲和度最高(路径长度最短)的个体。
- 生成新的随机种群,与免疫种群合并并进行排序。
- 更新最优解和相应的路径长度。
-
结果输出与可视化:
- 输出最优解(即最短路径)。
- 绘制最优路径的3D图。
- 绘制目标函数值的进化曲线。
免疫算法的关键步骤
-
初始化:随机生成初始种群,并计算每个个体的适应度(即路径长度)。
-
克隆选择:
- 选择适应度前一半的个体进行克隆。
- 克隆过程中,对每个克隆体进行变异操作,确保基因多样性。
-
亲和度评价与选择:
- 计算克隆体的适应度,选择亲和度最高的个体保留。
-
种群刷新:
- 生成新的随机种群,与克隆选择后的种群合并。
- 对合并后的种群进行排序,更新种群。
-
迭代进化:
- 通过迭代,不断优化种群,提升整体适应度,直到达到最大代数或其他终止条件。
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('亲和度进化曲线')
结果