20免疫算法的函数优化
PDF下载:链接:http://pan.baidu.com/s/1jH4dKjW 密码:4jbh
AIA算法基本步骤如下: (1)问题识别。根据给定的目标函数和约束条件作为算法的抗原。 (2)产生抗体群。初始抗体群通常是在解空间用随机的方法产生的,抗体群采用二进制编码来表示,实际应用中,常常直接采用十进制进行抗体计算更新。 (3)计算抗体适应值。即计算抗原和抗体的亲和度。 (4)生成免疫记忆细胞。将适应值较大的抗体作为记忆细胞加以保留。 (5)抗体的选择(促进和抑制)。计算当前抗体群中适应值相近的抗体浓度,浓度高的则减小该个体的选择概率——抑制;反之,则增加该个体的选择概率——促进,以此保持群体中个体的多样性。 (6)抗体的演变。进行交叉和变异操作,产生新抗体群。 (7)抗体群更新。用记忆细胞中适应值高的个体代替抗体群中适应值低的个体,形成下一代抗体群。 (8)终止。一旦算法满足终止条件则结束算法。否则转到(3)重复执行。
MATLAB代码如下:
- 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);
- % 故障类型编码,每一行为一种!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)
复制代码 变异操作(采用的是二进制编码):- function [newpop]=mutation(pop,pm)
- global popsize N length;
- for i=1:popsize
- if(rand<pm) % 产生一随机数与变异概率比较
- mpoint=round(rand*N*length); % 个体变异位置
- if mpoint<=0
- mpoint=1;
- end
- newpop(i,:)=pop(i,:);
- if newpop(i,mpoint)==0
- newpop(i,mpoint)=1;
- else
- newpop(i,mpoint)=0;
- end
- else
- newpop(i,:)=pop(i,:);
- end
- end
复制代码 适应度值排序操作:
- function B=hjjsort(A)
- % 将A=[3 1 4 7 6 9]置换成【7 9 6 3 4 1】
- N=length(A);t=[0 0];
- for i=1:N
- temp(i,2)=A(i);
- temp(i,1)=i;
- end
- for i=1:N-1 % 沉底法将 A 排序
- for j=2:N+1-i
- if temp(j,2)<temp(j-1,2)
- t=temp(j-1,:);
- temp(j-1,:)=temp(j,:);
- temp(j,:)=t;
- end
- end
- end
- for i=1:N/2 % 将排好的A逆序
- t=temp(i,2);
- temp(i,2)=temp(N+1-i,2);
- temp(N+1-i,2)=t;
- end
- for i=1:N
- A(temp(i,1))=temp(i,2);
- end
- B=A;
复制代码 种群选择操作:
- function [newpop]=selection(pop,fitvalue)
- global popsize;
- fitvalue=hjjsort(fitvalue);
- totalfit=sum(fitvalue); %求适应值之和
- fitvalue=fitvalue/totalfit; %单个个体被选择的概率
- fitvalue=cumsum(fitvalue); %如 fitvalue=[4 2 5 1],则 cumsum(fitvalue)=[4 6 11 12]
- ms=sort(rand(popsize,1)); %从小到大排列,将"rand(px,1)"产生的一列随机数变成轮盘赌形式的表示方法,由小到大排列
- fitin=1; %fivalue是一向量,fitin代表向量中元素位,即fitvalue(fitin)代表第fitin个个体的单个个体被选择的概率
- newin=1; %同理
- while newin<=popsize % && fitin<=popsize
- if (ms(newin))<fitvalue(fitin) %ms(newin)表示的是ms列向量中第"newin"位数值,同理fitvalue(fitin)
- newpop(newin,:)=pop(fitin,:); %赋值 ,即将旧种群中的第fitin个个体保留到下一代(newpop)
- newin=newin+1;
- else
- fitin=fitin+1;
- end
- end
复制代码
百度网盘链接如下:
链接:http://pan.baidu.com/s/1o8K0SgM 密码:rh3i
|