【优化求解】 基于免疫算法IA求解最优目标matlab代码

189 阅读4分钟

1 简介

自Farmer在1986年提出免疫机理可以在机器学习等工程问题中得到应用之后,相关人员就一直在探索免疫机理在工程实际中的应用技术。而De Castro等完善了算法结构和算法模型后,更为人工免疫算法的应用研究提供了有力的支撑。ENDOH等将人工免疫算法应用于旅行商问题(TSP),验证了算法的有效性。Watkins利用人工免疫算法实现了一个资源受限的分类器,得到令人满意的结果。Sasaki等提出了一种基于免疫系统反馈机理的自适应学习神经网络控制器],避免了神经网络学习在最小值附近的摆动,提高了收敛速度。蒋加伏等提出一种人工免疫算法和蚁群算法综合应用的混合优化算法,并应用提出的算法成功地应用于Qos路由选择问题。梁勤欧等应用人工免疫算法进行布局分配问题的研究,并与其他优化算法应用于此问题的结果进行对比,证明人工免疫算法具有更好的优化质量。刘英等利用人工免疫算法设计分类器,将分类器的性能与基于遗传算法等其他方法的分类器性能进行了对比,结果表明基于人工免疫算法的分类算法具有更高的平均预测精度,并且可以产生更小的规则集合,是一种有效的机器学习方法​.

2 部分代码

clc,clear,close all;
warning off
global popsize length min max N code;
N=12;                % 每个染色体段数(十进制编码位数)
M=100;               % 进化代数
popsize=30;          % 设置初始参数,群体大小
length=10;           % length为每段基因的二进制编码位数
chromlength=N*length;  % 字符串长度(个体长度),染色体的二进制编码长度
pc=0.7;                % 设置交叉概率,本例中交叉概率是定值,若想设置变化的交叉概率可用表达式表示,或从写一个交叉概率函数,例如用神经网络训练得到的值作为交叉概率
pm=0.3;                % 设置变异概率,同理也可设置为变化的
bound={-100*ones(popsize,1),zeros(popsize,1)};
min=bound{1};max=bound{2};
pop=initpop(popsize,chromlength);                     %运行初始化函数,随机产生初始群体
ymax=500;   % 适应度值初始化

ysw_x = zeros(3,12);
%电容C2:故障类型编码,每一行为一种!code(1,:),正常;code(2,:),50%;code(3,:),150%
code =[-0.8180   -1.6201  -14.8590  -17.9706  -24.0737  -33.4498  -43.3949  -53.3849  -63.3451  -73.0295  -79.6806  -74.3230
      -0.7791   -1.2697  -14.8682  -26.2274  -30.2779  -39.4852  -49.4172  -59.4058  -69.3676  -79.0657  -85.8789  -81.0905
      -0.8571   -1.9871  -13.4385  -13.8463  -20.4918  -29.9230  -39.8724  -49.8629  -59.8215  -69.4926  -75.9868  -70.6706];

for i=1:3   % 3种故障模式,每种模式应该产生 popsize 种监测器(抗体),每种监测器的长度和故障编码的长度相同
   pop=initpop(popsize,chromlength);                     %运行初始化函数,随机产生初始群体
   for k=1:M
      [objvalue]=calobjvalue(pop,i);                 %计算目标函数
      fitvalue=calfitvalue(objvalue); favg(k)=sum(fitvalue)/popsize;  %计算群体中每个个体的适应度
      newpop=selection(pop,fitvalue); objvalue=calobjvalue(newpop,i); %选择
      newpop=crossover(newpop,pc,k);  objvalue=calobjvalue(newpop,i); %交叉
      newpop=mutation(newpop,pm);     objvalue=calobjvalue(newpop,i); %变异
      [bestindividual,bestfit]=best(newpop,fitvalue);%求出群体中适应值最小的个体及其适应值
      if bestfit<ymax
         ymax=bestfit;
          for j=1:N  %译码!
              temp(:,j)=decodechrom(bestindividual,1+(j-1)*length,length);      %将newpop每行(个体)每列(每段基因)转化成十进制数
              x(:,j)=temp(:,j)/(2^length-1)*(max(j)-min(j))+min(j);     % popsize×N 将二值域中的数转化为变量域的数       
          end
         ysw_x(i,:) = x;  %译码!
      end
      y(i,k)=ymax;
      if ymax<10     % 如果最大值小于设定阀值,停止进化
          break
      end
      pop=newpop;
  end  
end

ysw_x   % 结果为(i*popsie)个监测器(抗体)
plot(1:M,favg)

3 仿真结果

4 参考文献

[1]郑涛, 潘玉美, 郭昆亚, 王增平, & 孙洁. (2014). 基于免疫算法的配电网故障定位方法研究. 电力系统保护与控制, 000(001), 77-83.

部分理论引用网络文献,若有侵权联系博主删除。

5 MATLAB代码与数据下载地址

见博客主页