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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)