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

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

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)

function m_main()

clear

clc

Max_gen=100% 运行代数

pop_size=100%种群大小

chromsome=10%染色体的长度

pc=0.9%交叉概率

pm=0.25%变异概率

gen=0%统计代数

%初始化

init=40*rand(pop_size,chromsome)-20

pop=init

fit=obj_fitness(pop)

[max_fit,index_max]=max(fit)maxfit=max_fit

[min_fit,index_min]=min(fit)best_indiv=pop(index_max,:)

%迭代 *** 作

while gen<Max_gen

gen=gen+1 bt(gen)=max_fit

if maxfit<max_fitmaxfit=max_fitpop(index_min,:)=pop(index_max,:)best_indiv=pop(index_max,:)end

best_indiv_tmp(gen)=pop(index_max)

newpop=ga(pop,pc,pm,chromsome,fit)

fit=obj_fitness(newpop)

[max_fit,index_max]=max(fit)

[min_fit,index_min]=min(fit)

pop=newpop

trace(1,gen)=max_fit

trace(2,gen)=sum(fit)./length(fit)

end

%运行结果

[f_max gen_ct]=max(bt)%求的最大值以及代数

maxfit

best_indiv

%画图

% bt

hold on

plot(trace(1,:),'.g:')

plot( trace(2,:),'.r-')

title('实验结果图')

xlabel('迭代次数/代'),ylabel('最佳适应度(最大值)')%坐标标注

plot(gen_ct-1,0:0.1:f_max+1,'c-')%画出最大值

text(gen_ct,f_max+1, '最大值')

hold off

function [fitness]=obj_fitness(pop)

%适应度计算函数

[r c]=size(pop)

x=pop

fitness=zeros(r,1)

for i=1:r

for j=1:c

fitness(i,1)=fitness(i,1)+sin(sqrt(abs(40*x(i))))+1-abs(x(i))/20.0

end

end

function newpop=ga(pop,pc,pm,chromsome,fit)

pop_size=size(pop,1)

%轮盘赌选择

ps=fit/sum(fit)

pscum=cumsum(ps)%size(pscum)

r=rand(1,pop_size)qw=pscum*ones(1,pop_size)

selected=sum(pscum*ones(1,pop_size)<ones(pop_size,1)*r)+1

newpop=pop(selected,:)

%交叉

if pop_size/2~=0

pop_size=pop_size-1

end

for i=1:2:pop_size-1

while pc>rand

c_pt=round(8*rand+1)

pop_tp1=newpop(i,:)pop_tp2=newpop(i+1,:)

newpop(i+1,1:c_pt)=pop_tp1(1,1:c_pt)

newpop(i,c_pt+1:chromsome)=pop_tp2(1,c_pt+1:chromsome)

end

end

% 变异

for i=1:pop_size

if pm>rand

m_pt=1+round(9*rand)

newpop(i,m_pt)=40*rand-20

end

end


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11856991.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存