
一样才怪!遗传算法是一种带有随机性的搜索型的求解全局最优解的方法。随机性就是在优化过程中变量的取值是随机变化的,但是这种变化是朝向全局最优的方向随机变化。但是当种群数量足够大,而且进化代数足够多的时候,最优解是具有稳定性的,虽然每次都不一样,但是最优解的变化一般不会很大。
myfun没有给出,这个是ga函数求解的部分设置,通过改变populationsize和generations可以达到获得稳定最优解的目的。变异概率和杂交概率也有一定的影响,在局部收敛的情况下可以增大变异概率等来避免局部最优。
遗传算法其实就是二重迭代,时间复杂度不超过n平方遗传算法是一种全局优化概率算法,主要的优点有
1遗传算法对所求解的优化问题没有太多的数学要求,由于他的进化特性,搜素过程中不需要问题的内在性质,对于任意形式的目标函数和约束,无论是线性的还是非线性的,离散的还是连续的都可处理。
2进化算子的各态历经性使得遗传算法能够非常有效地进行概率意义的全局搜素。
3遗传算法对于各种特殊问题可以提供极大的灵活性来混合构造领域独立的启发式,从而保证算法的有效性。
目标函数就是你希望得到的优化结果,比如函数最大值或者最小值而适应度函数是为了计算个体的适配值 适配值是非负的,而且要求适配值越大则该个体越优越而目标函数则有正有负,它们之间关系多种多样,比如求最小值时,目标函数最小,则适配值越大,求最大值时目标值越大,适配值越大。
只要目标函数是递增或者递减的就可以,但是目标函数值要为正,目标函数对遗传算法影响很大的,所以要经过不断的尝试得出正确的结果,建议你把每一次的结果平均值都记录下来,然后画出图形观察遗传算法的有效性。
适应度函数的选取直接影响到遗传算法的收敛速度以及能否找到最优解,因为遗传算法在进化搜索中基本不利用外部信息,仅以适应度函数为依据,利用种群每个个体的适应度来进行搜索。
因为适应度函数的复杂度是遗传算法复杂度的主要组成部分,所以适应度函数的设计应尽可能简单,使计算的时间复杂度最小。
遗传算法评价一个解的好坏不是取决于它的解的结构,而是取决于该解的适应度值。这正体现了遗传算法“优胜劣汰”的特点。遗传算法不需要适应度函数满足连续可微等条件,唯一要求是针对输入可计算出能加以比较的非负结果。
扩展资料
在遗传算法中,适应度是描述个体性能的主要指标。根据适应度的大小,对个体进行优胜劣汰。适应度是驱动遗传算法的动力。
从生物学角度讲,适应度相当于“生存竞争、适者生存”的生物生存能力,在遗传过程中具有重要意义。将优化问题的目标函数与个体的适应度建立映射关系,即可在群体进化过程中实现对优化问题目标函数的寻优。
-适应度函数
% 2008年4月12日修改
%%主函数
function main()
global chrom lchrom oldpop newpop varible fitness popsize sumfitness %定义全局变量
global pcross pmutation temp bestfit maxfit gen bestgen length epop efitness val varible2 varible1
global maxgen po pp mp np val1
length=18;
lchrom=30; %染色体长度
popsize=30; %种群大小
pcross=06; %交叉概率
pmutation=001; %变异概率
maxgen=1000; %最大代数
mp=01; %保护概率
%
initpop; % 初始种群
%
for gen=1:maxgen
generation;
end
%
best;
bestfit % 最佳个体适应度值输出
bestgen % 最佳个体所在代数输出
x1= val1(bestgen,1)
x2= val1(bestgen,2)
gen=1:maxgen;
figure
plot(gen,maxfit(1,gen)); % 进化曲线
title('精英保留');
%
% 产生初始种群
%
function initpop()
global lchrom oldpop popsize
oldpop=round(rand(popsize,lchrom)); %生成的oldpop为30行12列由0,1构成的矩阵
%其中popsize为种群中个体数目lchrom为染色体编码长度
%
%%产生新一代个体
%
function generation()
global epop oldpop popsize mp
objfun; %计算适应度值
n=floor(mppopsize); %需要保留的n个精英个体
for i=1:n
epop(i,:)=oldpop((popsize-n+i),:);
% efitness(1,i)=fitness(1,(popsize-n+i))
end
select; %选择 *** 作
crossover;
mutation;
elite; %精英保留
%
%%计算适应度值
%
function objfun()
global lchrom oldpop fitness popsize chrom varible varible1 varible2 length
global maxfit gen epop mp val1
a1=-3; b1=3;
a2=-2;b2=2;
fitness=0;
for i=1:popsize
%前一未知数X1
if length~=0
chrom=oldpop(i,1:length);% before代表节点位置
c=decimal(chrom);
varible1(1,i)=a1+c(b1-a1)/(2^length-1); %对应变量值
%后一未知数
chrom=oldpop(i,length+1:lchrom);% before代表节点位置
c=decimal(chrom);
varible2(1,i)=a2+c(b2-a2)/(2^(lchrom-length)-1); %对应变量值
else
chrom=oldpop(i,:);
c=decimal(chrom);
varible(1,i)=a1+c(b1-a1)/(2^lchrom-1); %对应变量值
end
%两个自变量
fitness(1,i)=4varible1(1,i)^2-21varible1(1,i)^4+1/3varible1(1,i)^6+varible1(1,i)varible2(1,i)-4varible2(1,i)^2+4varible2(1,i)^4;
%fitness(1,i) = 215+varible1(1,i)sin(4pivarible1(1,i))+varible2(1,i) sin(20pivarible2(1,i));
%一个自变量
%fitness(1,i) = 20cos(025varible(1,i))-12sin(033varible(1,i))+40 %个体适应度函数值
end
lsort; % 个体排序
maxfit(1,gen)=max(fitness); %求本代中的最大适应度值maxfit
val1(gen,1)=varible1(1,popsize);
val1(gen,2)=varible2(1,popsize);
%二进制转十进制
%
function c=decimal(chrom)
c=0;
for j=1:size(chrom,2)
c=c+chrom(1,j)2^(size(chrom,2)-j);
end
%
% 个体排序
% 从小到大顺序排列
%
function lsort()
global popsize fitness oldpop epop efitness mp val varible2 varible1
for i=1:popsize
j=i+1;
while j<=popsize
if fitness(1,i)>fitness(1,j)
tf=fitness(1,i); % 适应度值
tc=oldpop(i,:); % 基因代码
fitness(1,i)=fitness(1,j); % 适应度值互换
oldpop(i,:)=oldpop(j,:); % 基因代码互换
fitness(1,j)=tf;
oldpop(j,:)=tc;
end
j=j+1;
end
val(1,1)=varible1(1,popsize);
val(1,2)=varible2(1,popsize);
end
%转轮法选择 *** 作
%
function select()
global fitness popsize sumfitness oldpop temp mp np
sumfitness=0; %个体适应度之和
for i=1:popsize % 仅计算(popsize-np-mp)个个体的选择概率
sumfitness=sumfitness+fitness(1,i);
end
%
for i=1:popsize % 仅计算(popsize-np-mp)个个体的选择概率
p(1,i)=fitness(1,i)/sumfitness; % 个体染色体的选择概率
end
%
q=cumsum(p); % 个体染色体的累积概率(内部函数),共(popsize-np-mp)个
%
b=sort(rand(1,popsize)); % 产生(popsize-mp)个随机数,并按升序排列。mp为保护个体数
j=1;
k=1;
while j<=popsize % 从(popsize-mp-np)中选出(popsize-mp)个个体,并放入temp(j,:)中;
if b(1,j)<q(1,k)
temp(j,:)=oldpop(k,:);
j=j+1;
else
k=k+1;
end
end
%
j=popsize+1; % 从统一挪过来的(popsize-np-mp)以后个体——优秀个体中选择
for i=(popsize+1):popsize % 将mp个保留个体放入交配池temp(i,:),以保证群体数popsize
temp(i,:)=oldpop(j,:);
j=j+1;
end
%
%%交叉 *** 作
%
function crossover()
global temp popsize pcross lchrom mp
n=floor(pcrosspopsize); %交叉发生的次数(向下取整)
if rem(n,2)~=0 % 求余
n=n+1; % 保证为偶数个个体,便于交叉 *** 作
end
%
j=1;
m=0;
%
% 对(popsize-mp)个个体将进行随机配对,满足条件者将进行交叉 *** 作(按顺序选择要交叉的对象)
%
for i=1:popsize
p=rand; % 产生随机数
if p<pcross % 满足交叉条件
parent(j,:)=temp(i,:); % 选出1个父本
k(1,j)=i;
j=j+1; % 记录父本个数
m=m+1 ; % 记录杂交次数
if (j==3)&(m<=n) % 满足两个父本(j==3),未超过交叉次数(m<=n)
pos=round(rand(lchrom-1))+1; % 确定随机位数(四舍五入取整)
for i=1:pos
child1(1,i)=parent(1,i);
child2(1,i)=parent(2,i);
end
for i=(pos+1):lchrom
child1(1,i)=parent(2,i);
child2(1,i)=parent(1,i);
end
i=k(1,1);
j=k(1,2);
temp(i,:)=child1(1,:);
temp(j,:)=child2(1,:);
j=1;
end
end
end
%
%%变异 *** 作
%
function mutation()
global popsize lchrom pmutation temp newpop oldpop mp
m=lchrompopsize; % 总的基因数
n=round(pmutationm); % 变异发生的次数
for i=1:n % 执行变异 *** 作循环
k=round(rand(m-1))+1; %确定变异位置(四舍五入取整)
j=ceil(k/lchrom); % 确定个体编号(取整)
l=rem(k,lchrom); %确定个体中变位基因的位置(求余)
if l==0
temp(j,lchrom)=~temp(j,lchrom); % 取非 *** 作
else
temp(j,l)=~temp(j,l); % 取非 *** 作
end
end
for i=1:popsize
oldpop(i,:)=temp(i,:); %产生新的个体
end
%
%%精英选择%
%
function elite()
global epop oldpop mp popsize
objfun; %计算适应度值
n=floor(mppopsize); %需要保留的n个精英个体
for i=1:n
oldpop(i,:)=epop(i,:);
% efitness(1,i)=fitness(1,(popsize-n+i))
end;
%
%%最佳个体
%
function best()
global maxfit bestfit gen maxgen bestgen
bestfit=maxfit(1,1);
gen=2;
while gen<=maxgen
if bestfit<maxfit(1,gen)
bestfit=maxfit(1,gen);
bestgen=gen;
end
gen=gen+1;
end
%
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)