我参照别人程序编的多目标遗传算法程序,一步一步做下来结果都对,但不知道为什么运行时总是出错,说N是已清除的变量,求高手指点!!
function [xm,fv]=MGA(fitness,N,M,D,Pc,Pm) %N为种群个体数,M为迭代次数,D为变量个数,Pc为交叉概率,Pm为变异概率
format long;
a=[0.1 0.2 -100]; %用了3个变量试验,a,b是x上下限范围
b=[500 0.9 100];
x=zeros(N,D); %初始化种群个体
for k=1:N
for l=1:D
x(k,l)=rand*(b(l)-a(l))+a(l);
end
end
[k,l]=size(x); %种群大小及基因个体数
for i=1:M
for j=1:N %计算适应度
p(j)=fitness(x(j,:));
end
[MinValue,Index1]=min(p);%将当前种群中最优解保存在MinValue
[MaxValue,Index2]=max(p);%将当前种群中最次解保存在MaxValue
vari=mean(x(Index1,:));%计算最优染色体的平均值并送给vari,变异自适应调节域值
evo_x=zeros(k-1,l); %轮盘赌选择
select=zeros(k-1,l); %预先设定选择种群大小
best_gene=x(Index1,:); %将最佳染色体保存
x(Index2,:)=x(Index1,:); %将最优染色体替代最次染色体,参与选择
index=[1:k];
index(Index1)=0;
index=nonzeros(index); %使最优染色体坐在的位置为零,便于清空,使最优的染色体的原来位置不参与本次的选择、交叉、变异
y=p'; %由横向量转化为竖向量
evo_x=x(index,:); %参与选择交叉,变异的种群
evo_p=y(index,:); %参与选择、交叉、变异的适应度函数值
evo_N=k-1; %参与选择、交叉、变异的种群大小
ps=(1-evo_p/sum(evo_p))/(k-2); %适应值越小,概率越大
pscum=cumsum(ps); %累计概率
r=rand(1,evo_N); %随机生成选择概率
selected=sum(pscum*ones(1,evo_N)
select=evo_x(selected,:);
cross=zeros(k-1,l); %交叉
s=rand(1,k-1); %随机产生与交叉概率相比较的概率
y1=find(s<0.99); %参与交叉位
y2=find(s>=0.99); %不参与交叉位
len1=length(y1);
if len1>2&&mod(len1,2)==1 %如果用来进行交叉的染色体的条数为奇数,将其调整为偶数
y2(length(y2)+1)=y1(len1);
y1(len1)=[];
end
d1=rand(length(y1)/2,l); %随机生成掩码
d2=rand(length(y1)/2,l); %随机生成掩码
if length(y1)>=2,
for i=1:length(y1)/2,
for j=1:l
if d1(i,j)<=Pc %非均匀交叉位
cross(y1(2*i-1),j)=d2(i,j)*select(y1(2*i-1),j)+(1-d2(i,j))*select(y1(2*i),j);
cross(y1(2*i),j)=d2(i,j)*select(y1(2*i),j)+(1-d2(i,j))*select(y1(2*i-1),j);
else %不交叉位
cross(y1(2*i-1),j)=select(y1(2*i-1),j);
cross(y1(2*i),j)=select(y1(2*i),j);
end
end
end
end
cross(y2,:)=select(y2,:);
mutation=zeros(k-1,l); %变异
Trace=zeros(M,D+1); %最优轨迹
s=rand(k-1,l); %随机产生与变异概率相比较的概率
for i=1:k-1
for j=1:l
if s(i,j)<=Pm
mutation(i,j)=vari*(rand-0.5); %变异为变化为一个[a,b]的随机数
else
mutation(i,j)=cross(i,j);
end
end
end
Trace(i,1)=MinValue;%每代最优适应度值;
Trace(i,2:l+1)=x(Index1,:);%每代最优适应度值所对应最优染色体
x=[mutation;best_gene];%更新
for j=1:N %计算适应度
p(j)=fitness(x(j,:));
end
[MinValue,Index1]=min(p);%将当前种群中最优解保存在MinValue
end
fv=MinValue;%最优适应度值
xm=Trace(i,(2:l+1));%最优染色体