实数编码遗传算法 matlab,matlab 实数编码多目标遗传算法 求高手指点

我参照别人程序编的多目标遗传算法程序,一步一步做下来结果都对,但不知道为什么运行时总是出错,说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));%最优染色体

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值