遗传算法案例及源代码.docx
《遗传算法案例及源代码.docx》由会员分享,可在线阅读,更多相关《遗传算法案例及源代码.docx(11页珍藏版)》请在冰豆网上搜索。
遗传算法案例及源代码
计算智能作业三:
遗传算法计算问题
1.问题描述:
求下述二元函数的最大值:
S.t.
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):
价值函数(自适应度函数),即
。
function[sur_value]=calc_value(c):
计算群体中每一个个体的适应度的值
functionsurvived=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位无符号二进制数就形成了个体的基因型,表示一个可行解。
如一下表格表示基因型和表现型之间的对应关系:
个体
基因型
表现型
1
111001
(7,1)
2
100111
(4,7)
3
011011
(3,3)
4
101110
(5,6)
5
100101
(4,5)
6
111011
(7,3)
●初始群体的产生
遗传算法是对群体进行的进化操作,需要给其淮备一些表示起始搜索点的初始群体数据。
本例中,群体规模的大小取为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次进化
forn=1:
1000%设置循环次数
sur_value=calc_value(c);
survived=surviver(sur_value);
new_c=zeros(6,6);
forii=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;
forjj=1:
6
b=value_function(c(jj,:
));
%选择最好群体中每行个体进行适应度计算,以下是6个个体大小的判断
%选择最终适值最大的个体,其运算结果即为最后结果
ifb>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的基因型转换为表现型
ifx1==0
x1=1;
end
ifx2==0
x2=1;
end
out=x1^2+x2^2;%通过表现型的值计算最终结果
function[sur_value]=calc_value(c)
%计算群体中每一个个体的适应度的值
value=zeros(1,6);
forii=1:
6%对于第1到第6个个体
value(ii)=value_function(c(ii,:
));%计算每个个体的适应度值
end
sur_value=value./sum(value);%将适应度值归一化,即每个个
体被遗传到下一代群体中的概率
end
(3)选择运算
选择运算(或称为复制运算)把当前群体中适应度较高的个体按某种规则或模型遗传到下一代群体中。
一般要求适应度较高的个体将有更多的机会遗传到下一代。
具体步骤:
1 计算每个适应度的值
2 计算所有个体适应度总和
3 归一化处理,即用每个个体的适应度的值/适应度总和
4 产生6个0-1的随机数,看该随机数出现在哪一概率区间内,该区间对应的个体即被选择。
functionsurvived=surviver(sur_value)
%选择个体,采用与适应度成正比的概率来确定各个个体复制到下一代群体中
survived=ones(1,6);
forii=1:
6
random=rand
(1)%随机产生一个0到1的数
%判断该随机数出现在哪一个概率区间内,以此来判断哪个个体被选中
sur_v_a=0;
forjj=1:
6
sur_v_a=sur_v_a+sur_value(jj);
ifrandomsurvived(ii)=jj;
break;
end
end
end
end
(4)交叉运算
交叉运算是遗传算法中产生新个体的主要操作过程,它以某一概率相互交换某两个个体之间的部分染色体。
具体步骤:
1 先对群体进行随机配对;由于上面选择运算中产生的已经是随机的个体,所以此处只要上下两两配对即可。
2 设置交叉点位置:
一共有5个交叉点位置。
6个个体共需3次交叉。
3 进行交叉运算:
以某一概率相互交换某两个个体之间的部分基因。
4 交叉完成后产生新的个体。
function[r]=random5( )
%随机设置交叉点位置,一共有5个交叉点位置。
6个个体共需3次交叉
r=rand
(1)*5;
r=floor(r)+1;
end
function[intersect_c]= intersect(new_c)
%进行交叉运算:
以某一概率相互交换某两个个体之间的部分染色体
intersect_c=zeros(6,6);
forii=1:
3
r5=random5();
%将6个个体两两分组,假如交叉点为随机数r5,则将组内第二个个体的前r5个基因保留,第一个个体的r5之后的基因给第二个个体。
这里统统赋给一个新的C
intersect_c(ii*2-1,1:
r5)=new_c(ii*2-1,1:
r5);
intersect_c(ii*2-1,r5+1:
6)=new_c(ii*2,r5+1:
6);
%将6个个体两两分组,假如交叉点为随机数r5,则将组内第一个个体的前r5个基因保留,第二个个体的r5之后的基因给第一个个体。
这里统统赋给一个新的C
intersect_c(ii*2,1:
r5)=new_c(ii*2,1:
r5);
intersect_c(ii*2,r5+1:
6)= new_c(ii*2-1,r5+1:
6);
End
(5)变异运算
变异运算是对个体的某一个或某一些基因座上的基因值按某一较小的概率进行改变,它也是产生新个体的一种操作方法。
具体步骤:
1 设置一个概率值。
2 遍历全部个体的全部基因,如果第ii个个体的第jj个基因小于此概率值,就将原来的基因值1变成0,0变成1。
否则不变。
3 输出变异点及最终变异完成后的群体基因型,作为新一轮运算的子代群体
function[mutation_c,mutation_value]= mutation(intersect_c)
%变异运算:
对个体的某一个或某一些基因位上的基因值按某一较小的概率进行改变
mutation_c=intersect_c;
mutation_value=zeros(2,36);
count=1;
%ii表示第几号个体,jj表示第ii个个体的第jj个基因
forii=1:
6
forjj=1:
6
r=rand
(1);
%设置一个概率值,如果小于此概率值,就将原来的基因值1变成0,0变成1
ifr<0.05
mutation_c(ii,jj)=1-mutation_c(ii,jj);
%输出变异点
mutation_value(1,count)=ii;
mutation_value(2,count)=jj;
count=count+1;
end
end
end
end
4.结果展示
(1)第一轮进化过程
1 初始群体产生
个体编号
初始群体基因型
初始群体表现型(x1,x2)
2 适应度计算
个体编号
初始群体基因型
适应度值
适值概率
每个个体
总和
1
110011
45
271
0.1661
2
111011
58
271
0.2140
3
010001
5
271
0.0185
4
111010
53
271
0.1956
5
110100
52
271
0.1919
6
011111
58
271
0.2140
3 选择运算
个体编号
初始群体基因型
适应度值
适值概率
选择次数
选择结果(编号)
选择结果(基因型)
1
110011
45
0.1661
0
6
011111
2
111011
58
0.2140
2
6
011111
3
010001
5
0.0185
0
5
110100
4
111010
53
0.1956
1
4
111010
5
110100
52
0.1919
1
2
111011
6
011111
58
0.2140
2
2
111011
4 交叉运算
选择结果(编号)
重新设定编号
选择结果(基因型)
配对情况
(两两配对)
随机产生交叉点位置r5
交叉结果
6
1
011111
1-2
2
01|1111
6
2
011111
1-2
2
01|1111
5
3
110100
3-4
4
1101|10
4
4
111010
3-4
4
1100|00
2
5
111011
5-6
3
111|011
2
6
111011
5-6
3
111|011
5 变异运算
交叉结果
重新设定编号
按照一定概率产生变异点
(变异点位置)
变异结果
子代群体
011111
1
无
011111
011111
011111
2
无
011111
011111
110110
3
1
010110
010110
110000
4
1,3
011000
011000
111011
5
无
111011
111011
111011
6
无
111011
111011
(2)子代群体再进行新一轮的选择,交叉,变异,此处设定进行1000轮计算
(3)最终结果
●最后群体基因型为:
1 1 1 1 1 0
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 0
1 1 0 0 0 0
1 1 1 1 1 1
●在这6个个体中再选择最好的基因型:
111111,其表现型为:
x1=7,x2=7;
得到最终f最优值值,为98.