请选择 进入手机版 | 继续访问电脑版

Hello Mat

 找回密码
 立即注册
查看: 6514|回复: 0

20免疫算法的函数优化--视频分享

[复制链接]

1288

主题

1514

帖子

90

金钱

管理员

Rank: 9Rank: 9Rank: 9

积分
22589
发表于 2017-2-4 20:50:55 | 显示全部楼层 |阅读模式
20免疫算法的函数优化
PDF下载:链接:http://pan.baidu.com/s/1jH4dKjW 密码:4jbh

AIA算法基本步骤如下:
1)问题识别。根据给定的目标函数和约束条件作为算法的抗原。
2)产生抗体群。初始抗体群通常是在解空间用随机的方法产生的,抗体群采用二进制编码来表示,实际应用中,常常直接采用十进制进行抗体计算更新
3)计算抗体适应值。即计算抗原和抗体的亲和度。
4)生成免疫记忆细胞。将适应值较大的抗体作为记忆细胞加以保留。
5)抗体的选择(促进和抑制)。计算当前抗体群中适应值相近的抗体浓度,浓度高的则减小该个体的选择概率——抑制;反之,则增加该个体的选择概率——促进,以此保持群体中个体的多样性。
6)抗体的演变。进行交叉和变异操作,产生新抗体群。
7)抗体群更新。用记忆细胞中适应值高的个体代替抗体群中适应值低的个体,形成下一代抗体群。
8)终止。一旦算法满足终止条件则结束算法。否则转到(3)重复执行。

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

  15. ysw_x = zeros(3,12);
  16. % 故障类型编码,每一行为一种!code(1,:),正常;code(2,:),50%;code(3,:),150%
  17. 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
  18.        -0.7791   -1.2697  -14.8682  -26.2274  -30.2779  -39.4852  -49.4172  -59.4058  -69.3676  -79.0657  -85.8789  -81.0905
  19.        -0.8571   -1.9871  -13.4385  -13.8463  -20.4918  -29.9230  -39.8724  -49.8629  -59.8215  -69.4926  -75.9868  -70.6706];

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

  44. ysw_x   % 结果为(i*popsie)个监测器(抗体)
  45. plot(1:M,favg)
复制代码
变异操作(采用的是二进制编码):
  1. function [newpop]=mutation(pop,pm)
  2. global popsize N length;
  3. for i=1:popsize
  4.    if(rand<pm) % 产生一随机数与变异概率比较
  5.       mpoint=round(rand*N*length);  % 个体变异位置
  6.      if mpoint<=0
  7.         mpoint=1;
  8.      end
  9.      newpop(i,:)=pop(i,:);
  10.      if newpop(i,mpoint)==0
  11.         newpop(i,mpoint)=1;
  12.      else
  13.         newpop(i,mpoint)=0;
  14.      end
  15.    else
  16.      newpop(i,:)=pop(i,:);
  17.    end
  18. end
复制代码
适应度值排序操作:
  1. function B=hjjsort(A)
  2. % 将A=[3 1 4 7 6 9]置换成【7     9     6     3     4     1】
  3. N=length(A);t=[0 0];
  4. for i=1:N           
  5.     temp(i,2)=A(i);
  6.     temp(i,1)=i;
  7. end
  8. for i=1:N-1    % 沉底法将 A 排序
  9.     for j=2:N+1-i
  10.         if temp(j,2)<temp(j-1,2)
  11.             t=temp(j-1,:);
  12.             temp(j-1,:)=temp(j,:);
  13.             temp(j,:)=t;
  14.         end
  15.     end
  16. end
  17. for i=1:N/2   % 将排好的A逆序
  18.     t=temp(i,2);
  19.     temp(i,2)=temp(N+1-i,2);
  20.     temp(N+1-i,2)=t;
  21. end
  22. for i=1:N
  23.     A(temp(i,1))=temp(i,2);
  24. end
  25. B=A;
复制代码
种群选择操作:
  1. function [newpop]=selection(pop,fitvalue)
  2. global popsize;
  3. fitvalue=hjjsort(fitvalue);
  4. totalfit=sum(fitvalue);          %求适应值之和
  5. fitvalue=fitvalue/totalfit;      %单个个体被选择的概率
  6. fitvalue=cumsum(fitvalue);       %如 fitvalue=[4 2 5 1],则 cumsum(fitvalue)=[4 6 11 12]
  7. ms=sort(rand(popsize,1));        %从小到大排列,将"rand(px,1)"产生的一列随机数变成轮盘赌形式的表示方法,由小到大排列
  8. fitin=1;                         %fivalue是一向量,fitin代表向量中元素位,即fitvalue(fitin)代表第fitin个个体的单个个体被选择的概率
  9. newin=1;                         %同理
  10. while newin<=popsize % && fitin<=popsize
  11.       if (ms(newin))<fitvalue(fitin)    %ms(newin)表示的是ms列向量中第"newin"位数值,同理fitvalue(fitin)
  12.           newpop(newin,:)=pop(fitin,:); %赋值 ,即将旧种群中的第fitin个个体保留到下一代(newpop)
  13.           newin=newin+1;
  14.       else
  15.           fitin=fitin+1;
  16.       end
  17. end
复制代码


百度网盘链接如下:
链接:http://pan.baidu.com/s/1o8K0SgM 密码:rh3i






算法QQ  3283892722
群智能算法链接http://halcom.cn/forum.php?mod=forumdisplay&fid=73
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Python|Opencv|MATLAB|Halcom.cn ( 蜀ICP备16027072号 )

GMT+8, 2024-3-29 23:23 , Processed in 0.198825 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表