matlab遗传算法中的交叉算子函数应该怎么编写?

 我来答
叶绿素leaf
推荐于2018-03-30 · TA获得超过153个赞
知道小有建树答主
回答量:218
采纳率:100%
帮助的人:110万
展开全部
function [xv,fv]=myGA(fitness,a,b,NP,NG,Pc,Pm,eps)
L = ceil(log2((b-a)/eps+1)); %根据离散精度,确定二进制编码需要的码长
x = zeros(NP,L);
for i=1:NP

x(i,:) = Initial(L); %种群初始化

fx(i) = fitness(Dec(a,b,x(i,:),L)); %个体适应值

end
for k=1:NG

sumfx = sum(fx); %所有个体适应值之和

Px = fx/sumfx; %所有个体适应值的平均值
PPx = 0;

PPx(1) = Px(1);

for i=2:NP %用于轮盘赌策略的概率累加

PPx(i) = PPx(i-1) + Px(i);

end
for i=1:NP

sita = rand();

for n=1:NP

if sita <= PPx(n)

SelFather = n; %根据轮盘赌策略确定的父亲

break;

end

end

Selmother = floor(rand()*(NP-1))+1; %随机选择母亲

posCut = floor(rand()*(L-2)) + 1; %随机确定交叉点

r1 = rand();

if r1<=Pc %交叉

nx(i,1:posCut) = x(SelFather,1:posCut);

nx(i,(posCut+1):L) = x(Selmother,(posCut+1):L);

r2 = rand();

if r2 <= Pm %变异

posMut = round(rand()*(L-1) + 1);

nx(i,posMut) = ~nx(i,posMut);

end

else

nx(i,:) = x(SelFather,:);

end

end
x = nx;

for i=1:NP

fx(i) = fitness(Dec(a,b,x(i,:),L)); %子代适应值

end

end
fv = -inf;
for i=1:NP

fitx = fitness(Dec(a,b,x(i,:),L));

if fitx > fv

fv = fitx; %取个体中的最好值作为最终结果

xv = Dec(a,b,x(i,:),L);

end

end
function result = Initial(length) %初始化函数
for i=1:length
r = rand();
result(i) = round(r);
end
function y = Dec(a,b,x,L) %二进制编码转换为十进制编码
base = 2.^((L-1):-1:0);
y = dot(base,x);
y = a + y*(b-a)/(2^L-1);
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式