matlab遗传算法

2024-07-19 10:40:36作者:饭克斯

functionm_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,:);

%迭代操作

whilegen<Max_gen

gen=gen+1;bt(gen)=max_fit;

ifmaxfit<max_fit;maxfit=max_fit;pop(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_maxgen_ct]=max(bt)%求的最大值以及代数

maxfit

best_indiv

%画图

%bt

holdon

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,'最大值')

holdoff

function[fitness]=obj_fitness(pop)

%适应度计算函数

[rc]=size(pop);

x=pop;

fitness=zeros(r,1);

fori=1:r

forj=1:c

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

end

end

functionnewpop=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,:);

%交叉

ifpop_size/2~=0

pop_size=pop_size-1;

end

fori=1:2:pop_size-1

whilepc>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

%变异

fori=1:pop_size

ifpm>rand

m_pt=1+round(9*rand);

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

end

end

展开全文

热门推荐

相关攻略

猜你喜欢