|
楼主 |
发表于 2009-5-14 12:00
|
显示全部楼层
原程序是这样的,高手帮忙看下哦,谢谢
%采用二进制编码的基本遗传算法
function B_GA
clear
clc
popsize=20;%input('请输入种群数:');
pselect=0.05;%input('请输入选择概率:');
pcross=0.3;%input('请输入交叉概率:');
pmutation=0.1;%input('请输入变异概率:');
options=1e-6;%input('请输入精度:');
bounds=[300 650;60 140;90 150]%input('请输入变量范围[]:');
maxGen=1000;%input('请输入最大世代数:');
%下面进行初始化(含适应度值)
bits=calcbits(bounds,options);%确定变量二进制的位数
gen=1;%第一代
initpop=round(rand(popsize,sum(bits)+1));%初始化
for i=1:popsize
var=b2f(initpop(i,:),bounds,bits); %获得变量值
fitn=fitness(var(1),var(2),var(3)); %获得变量的适应度值
initpop(i,sum(bits)+1)=fitn; %将变量适应度值加入到种群最后一列中去
end
oval = min(initpop(:,sum(bits)+1));%获得初始代中的最优种群个体
oldpop=initpop;
while(gen<=maxGen)
[bval,bindx] = min(oldpop(:,sum(bits)+1)); %留下最优代,返回最佳适应度值(bval)和相应的位置(bindx)
best=oldpop(bindx,:);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%下面进行选择,首先计算个体选择概率(采用标准几何分布进行选择)
x(:,1) =[popsize:-1:1]';
[y x(:,2)] = sort(oldpop(:,sum(bits)+1));
r = pselect/(1-(1-pselect)^popsize); %标准分布
prob(x(:,2))=r*(1-pselect).^(x(:,1)-1); %生成选择概率
%totalfit=sum(oldpop(:,sum(bits)+1));%适应度总和
%prob=oldpop(:,sum(bits)+1)/totalfit; %选择概率
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%然后采用轮盘赌的方式
prob=cumsum(prob); %累计概率
rns=sort(rand(popsize,1)); %随即产生随机数序列并排序(由小到大),采用轮盘赌
fitin=1;newin=1;
while newin<=popsize %采用轮盘赌选择
if (rns(newin)<prob(fitin)) %随机数与累计概率相比较,直到比它大的
newpop(newin,:)=oldpop(fitin,:);
newin=newin+1;
else
fitin=fitin+1;
end
end
parent=newpop;
%下面进行交叉
cp=[];
num_cp=size(cp);
while num_cp(1,1)<2
cp=find(rand(popsize,1)<pcross==1); %先后获得交叉的种群数
num_cp=size(cp);
end
if rem(size(cp,1),2)
cp=cp(1:(size(cp,1)-1));
end %如果交叉数为奇数则减1
cp=reshape(cp,size(cp,1)/2,2); %把交叉数分为两列,以便两两交叉
for j=1:size(cp,1) %从第j组开始交叉
cpoint=round(rand*sum(bits)); %获得交叉点
a=cp(j,1); b=cp(j,2); % 获得第j组的交叉种群数
child1(1:sum(bits))=[parent(a,1:cpoint) parent(b,(cpoint+1):sum(bits))];%交叉
child2(1:sum(bits))=[parent(b,1:cpoint) parent(a,(cpoint+1):sum(bits))];%交叉
parent(a,1:sum(bits))=child1(1:sum(bits));
parent(b,1:sum(bits))=child2(1:sum(bits));
var=b2f(parent(a,:),bounds,bits);
parent(a,sum(bits)+1)=fitness(var(1),var(2),var(3));%获得交叉后对应的适应度值
var=b2f(parent(b,:),bounds,bits);
parent(b,sum(bits)+1)=fitness(var(1),var(2),var(3));%获得交叉后对应的适应度值
end
%下面进行变异
j=1;
while j<=popsize
rN=rand(1,sum(bits))<pmutation; %获得变异位(注意,每一位的码都要按照变异率来判断)
Aparent(j,:)=parent(j,:);
Aparent(j,1:sum(bits)+1)=[abs(Aparent(j,1:sum(bits)) - rN) Aparent(j,sum(bits)+1)];%进行变异,用父体减去变异位,然后取绝对值
var=b2f(Aparent(j,:),bounds,bits);
g1=1-9.7009*var(3).^2*(var(1)+var(3))/(var(2).^4-30.^4);
if (g1>=0)
parent(j,:)=Aparent(j,:);
parent(j,sum(bits)+1)=fitness(var(1),var(2),var(3));
j=j+1; %增加变异后的适应度
end
end
oldpop=parent;
[bval,bindx] = max(oldpop(:,sum(bits)+1)); %找出当前进化后的最差解
oldpop(bindx,:) = best; %用最优解替换种群中最差解
[bval,bindx] =min(oldpop(:,sum(bits)+1)); %找出当前进化后的最优解
iii =mean(oldpop(:,sum(bits)+1));
var=b2f(oldpop(bindx,1:sum(bits)),bounds,bits);
disp(['第' num2str(gen) ' 次寻优结束。'])
disp(['目前函数寻优解为:' num2str(bval)])
disp(['目前函数平均解为:' num2str(iii)])
disp(['对应变量为: ' num2str(var(1)) ' ' num2str(var(2)) ' ' num2str(var(3))])
disp(['------------------------------------------------------'])
gen=gen+1;%进行新的一代
end
%======================================
%适应度函数定义
function fit=fitness(x,y,z)
fit=0.7854*(x+z)*(y.^2-900); |
|