遗传算法用于函数优化
adptability=[adptability;parent_ave];
y_max=[y_max;max(y)];
y_min=[y_min;min(y)];
%----------------end---------------------------------
%------------遗传算法--------------------------------
4、设定交叉概率为0.9,进行遗传操作(交叉);
5、设定变异概率0.05,进行遗传操作(变异);
6、产生下一代种群,与终止条件比较,不满足返回到步骤2直到满足条件退出。
算法的流程如图7.1所示。
图7.1 算法流程图
四、实验结果及分析
我们采用遗传算法来寻求目标函数的最大值。初始化样本个数为20个,编码位数为5位,采用二进制编码,交叉概率为0.9,变异概率为0.05,最大迭代次数为1000次,初始样本随机选择,当父代与子代间适应度变化小于0.001时,达到系统指标。MATLAB模拟运行输出迭代种群的平均适应度变化、种群的最优解与最差解,绘出图像(见图1),计算运行时间的平均值(见表1),由表可知,平均运行时间约为0.65秒左右,速度较快。由图可知,前期平均适应度是不断上升的,到达一定程度后即平均适应度在0.9以上后,就基本处于波动平衡状态。通过对遗传算法的分析,这是因为种群内的所有个体几乎都已经接近最优值,上升空间比较小,且由于有变异的可能性,所以平均适应度在后期处于波动状态。由图可发现,每代的最大值都差不多,几乎都是1,但每代的最小值的变化就比较多了,但从趋势可以基本看出,最小值在逐渐变大,向最大值靠拢。因为要找的最优解是最大值,所以在迭代过程中,最小值淘汰几率最大,它的基因难以遗传下来,因此最小值会逐渐变大。
children_adptability=[]; %子代种群适应度
variance_adptability=0; %适应度变化
adptability=[]; %每次迭代适应度
times=1000; %最大迭代次数
time=0; %实际迭代次数
y_sum=[];
y_min=[];
y_max=[];
%y_y=[];
图6
表6
次数
第一次
第二次
第三次
第四次
第五次
平均
时间(s)
0.639
0.653
0.599
0.600
0.608
0.6198
最大值
1
1
0.9375
1
1
0.9875
最小值
0.7500
0.9375
0.9375
0
0.4375
0.65625
图7
表7
次数
第一次
第二次
第三次
第四次
第五次
平均
时间(s)
0.642
0.634
三、实验步骤
1、初始化种群,确定种群规模M=20,编码位数n=5 和编码机制(二进制编码);
初始化种群:E = round(rand(M,n));
每个编码对应的二进制数值: 为第i位二进制代码;
二进制数y转换为十进制数x: ;
2、根据给定的目标函数,计算各个种群的适应度值;
3、采用轮盘选择法对种群进行选择复制;
五、MATLAB编程代码
function genetic1
%遗传算法
%目标函数y=1-(x-1)^2;
M=20; %种群规模
%n=5; %编码位数
n=8; %编码位数
p_crossover=0.9; %交叉概率
p_mutation=0.05; %变异概率
parent_adptability=[]; %父代种群适应度
图2
表2
次数(M=10)
第一次
第二次
第三次
第四次
第五次
平均
时间(s)
0.570
0.654
0.611
0.590
0.589
0.6028
最大值
0.9648
0.9648
0.9375
0.9961
0.9023
0.9531
最小值
0.9648
0.8086
0.9375
0.9844
0.9023
0.91952
图3
表3
次数(M=200)
e=e/128; %使x在【0,2】之间
x=[x;e];
end
y=1-(x-1).^2; %目标函数
%y_y=[y_y,y];
ysum=0;
for j=1:M %求和
ysum=y(j,1)+ysum;
end
parent_adptability=y./ysum;%父代的适应度
parent_ave=ysum/M; %父代的目标函数平均值
遗传算法用于函数优化求解
一、实验目的
本实验要求在掌握遗传算法的基本思想、原理和算法流程的基础上,能够针对指定的单变量优化目标函数,设计相应的遗传算法优化程序,并求得全局最优解。
二、实验要求
针对目标函数 ,设计利用遗传算法进行优化求解的程序,绘制迭代过程中最优解的变化情况,并分别改变算法中的编码位数、种群规模、交叉和变异概率,分析这些变量对算法精度及收敛性的影响。
图1
表1
次数
第一次
第二次
第三次
第四次
第五次
平均
时间(s)
0.700
0.621
0.622
0.598
0.669
0.642
最大值
1
0.9961
0.9961
0.9961
0.9961
0.99688
最小值
0.8594
0.8086
0.8594
0.8086
0.3398
0.73516
改变初始种群的规模,其他参数不变,多次运行程序,观察初始种群规模大小对此算法的影响。图2为种群规模为10时,种群适应度的变化及每代最大值和最小值,由图可看到,平均适应度大的趋势是上升的,虽然过程中有些因为变异引起的曲折,每代的最大值基本相似,但最小值是近似地随着平均适应度的曲线变化的,可以推测,最小值影响了平均适应度。表2是种群规模为10时,其每次运行时间和得到的最终最大值最小值,由表可见,运行平均时间为0.6s左右,最终获得的最大值和最小值差距极小,且获得最大值与实际目标函数的最大值差距较大。图3与表3为种群规模为200时的情况,从图中可发现,平均适应度上升较缓,波动较小,且每代最大值最小值差距较大,又由表3可看出,其运行时间为0.75s左右,每次运行最终最大值几乎都为1,最小值接近0,与目标函数的最大值基本相同。对比种群规模分别为10(图2,表2),20(图1,表1),200(图3,表3),可以发现,种群规模越大,平均适应度的波动越小,上升坡度越平缓,且最终获得的最大值和最小值的差别越大,最大值越接近目标函数的实际最大值。由此可分析出,当种群规模小时,单个个体的基因对整个群体的适应度影响比较大,因此只有当整个群体中适应度最差的个体也达到一个较高适应度后,才达到系统标准(这一代与上一代的平均适应度差小于0.001),退出循环,而这样,最终的最小值就会接近最大值,种群内部每个个体的差别很小,最大值很难达到目标函数的最大值。而当种群规模大时,单个个体的基因对整个群体的适应度就没有那么大的影响,只要大多数个体的基因达到较高适应度,就能够满足系统标准,退出循环,因此每次迭代的最高适应度的个体与最低适应度的个体几乎可以共存,最终获得的最大值几乎就是目标函数的最大值,最小值也接近目标函数的小的值。
图4
表4
次数
第一次
第二次
第三次
第四次
第五次
平均
时间(s)
0.648
0.620
0.670
0.621
0.644
0.6406
最大值
0.9961
0.9844
0.9961
0.9844
1
0.9922
最小值
0.9375
0.8594
0.9375
0.8594
0.8594
0.89064
初始种群的规模为20,交叉的概率为0.9,变异概率增加至0.5,其他参数不变,多次运行程序,观察结果(见图5,表5)。由图5发现,平均适应度一直处于在0.7和0.9之间上下剧烈波动的情况,没有不断上升的趋势,说明变异几率太大,导致种群无法收敛于一个稳定的最佳状态,由表5可知,改变变异概率对运行时间,最终能达到的最大值影响不大,但影响了最小值,因为变异的概率高,所以种群不断地有适应度极低的变异个体出现,所以最终的最小值较小,但也导致了种群无法收敛的情况。由此可知,变异概率不能太大,不然种群无法收敛到最优解附近。
0.626
0.652
0.622
0.6352
最大值
0.9970
0.9998
0.9970
0.9995
0.9802
0.9947
最小值
0.9677
0.9413
0.8412
0.9780
0.8350
0.91264
通过实验对比分析发现,种群规模是影响适应度及最终获得的最优解的一个重要因素,当种群规模大时,适应度曲线的上升程度比较平缓,且获得的最优值更接近实际的最优解。另外,变异概率不能过大,否则适应度曲线没有上升的趋势,一直处于波动状态,种群无法收敛于最优解附近。编码位数不宜过少,不然适应度曲线波动较大,不那么容易收敛,最终达到的整体适应度较低,编码位数也不应过多,适中最好。
第一次
第二次
第三次
第四次
第五次
平均
时间(s)
0.736
0.680
0.798
0.798
0.715
0.7454