遗传算法案例及源代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算智能作业三:遗传算法计算问题
1.问题描述:
求下述二元函数的最大值:
2
22121),(m ax x x x x f +=
S.t. }7,6,5,4,3,2,1{1∈x }7,6,5,4,3,2,1{2∈x
2.程序结构:
(1)变量:
C :是一个1*6数组,每个数组里面是一个6位二进制数,它是遗传算法中的染色体。 new_c:每一轮的新变量c 。 first_c:初始群体矩阵。
sur_value :个体适应值的概率值,为0-1之间的数,所有概率值和为1。 survived :经过选择运算后产生的个体基因型组合。 intersect_c :经过交叉运算后产生的个体基因型组合。 mutation_c :经过变异运算后产生的个体基因型组合。 f :最后计算得到的最大值 (2)程序里面的方程
function out = value_function( ci ):价值函数(自适应度函数),即2
22121),(x x x x f +=。
function [ sur_value ] = calc_value( c ):计算群体中每一个个体的适应度的值
function survived = surviver( sur_value ):利用概率选择函数 function [ intersect_c ] = intersect( new_c ):交叉运算
function [ mutation_c ,mutation_value] = mutation( intersect_c ):变异运算
3.源程序
(1)遗传算法的主程序
主程序包括初始群体产生,最终结果展示,即各函数之间的调用关系。 个体编码
遗传算法的运算对象是表示个体的符号串,所以必须把变量 x1, x2 编码为无符号二进制整数。这个二进制整数位个体的基因型。
因为x1, x2 为 0 ~ 7之间的整数,所以分别用3位无符号二进制整数来表示,将它们连接在一起所组成的6位无符号二进制数就形成了个体的基因型,表示一个可行解。
遗传算法是对群体进行的进化操作,需要给其淮备一些表示起始搜索点的初始群体数据。本例中,群体规模的大小取为6,即群体由6个个体组成,每个个体可通过随机方法产生。
%初始群体的产生,本例中,群体规模大小取为6,即由6个个体组成,每个个体随机产生。
c = rand(6,6);%产生随机群体,c表示个体变量。
%第一个6表示个体个体,第二个6表示基因型由6位无符号二进制数组成
c(c>0.5) = 1;
c(c<0.5) = 0;
%显示初始群体
first_c = c;
%一轮算法包括选择,交叉,变异,变异完成后产生新的个体,作为子代群体进行下一轮进化。一共设置1000次进化
for n = 1:1000%设置循环次数
sur_value = calc_value(c);
survived = surviver(sur_value);
new_c = zeros(6,6);
for ii =1:6
new_c(ii,:) = c(survived(ii),:);
end
intersect_c = intersect(new_c);%交叉个体
mutation_c = mutation( intersect_c );%变异个体,作为子代群体
c = mutation_c;%子代群体作为新一轮的个体,继续选择,交叉,变异
end
%设置最后结果的输出,f值即最后的结果。
f=0;
for jj=1:6
b = value_function(c(jj,:));
%选择最好群体中每行个体进行适应度计算,以下是6个个体大小的判断
%选择最终适值最大的个体,其运算结果即为最后结果
if b>f
f=b;
end
End
(2)适应值计算
遗传算法中以个体适应度的大小来评定各个个体的优劣程度,从而决定其遗传机会的大小。本例中,目标函数总取非负值,并且是以求函数最大值为优化目标,故可直接
利用目标函数值作为个体的适应度。
function out = value_function( ci )
%遗传算法的价值函数,同时也可以将此目标函数值作为个体的适应度。
x1 = 4*ci(1)+2*ci(2)+1*ci(3);%x1的基因型转换为表现型
x2 = 4*ci(4)+2*ci(5)+1*ci(6);%x2的基因型转换为表现型
if x1==0
x1=1;
end
if x2==0
x2=1;
end
out = x1^2+x2^2;%通过表现型的值计算最终结果
function [ sur_value ] = calc_value( c )
%计算群体中每一个个体的适应度的值
value = zeros(1,6);
for ii = 1:6 %对于第1到第6个个体
value(ii) = value_function(c(ii,:));%计算每个个体的适应度值
end
sur_value = value ./ sum(value);%将适应度值归一化,即每个个
体被遗传到下一代群体中的概率
end
(3)选择运算
选择运算(或称为复制运算)把当前群体中适应度较高的个体按某种规则或模型遗传到下一代群体中。一般要求适应度较高的个体将有更多的机会遗传到下一代。
具体步骤:
①计算每个适应度的值
②计算所有个体适应度总和
③归一化处理,即用每个个体的适应度的值/适应度总和
④产生6个0-1的随机数,看该随机数出现在哪一概率区间内,该区间对应的个体即被选择。
function survived = surviver( sur_value )
%选择个体,采用与适应度成正比的概率来确定各个个体复制到下一代群体中survived = ones(1,6);
for ii = 1:6
random = rand(1)%随机产生一个0到1的数