1)遗传操作中连续多次前后两代群体中最优个体的适应度相差在某个任意小的正数?所确定的范围内,即满足: 0?Fnew?Fold?? (2.10)
式中,Fnew为新产生的群体中最优个体的适应度;Fold为前代群体中最优个体的适应度。
2) 达到遗传操作的最大进化代数t。
3 具体数学规划问题的遗传算法实现
利用遗传算法求解下列数学规划问题:
minf(x1,x2)??x1?3???x2?2?2?g1(x1,x2)?x12?x2?5?s..t?h1(x1,x2)?x1?2x2?4?0?x,x?10,x?N121?22 (3.1)
3.1 初始化
针对上述问题利用MATLAB编写遗传算法程序求解,程序的主函数是GA.m。
首先,确定程序初始化中所需要的参数和对应的值。其中求解精度是指决策变量的求解精度,由于题目中没有给出,所以这是我自己设定的参数。程序中涉及到得参数名称、符号和相应的值如下表所示。
表3-1 遗传算法初始化参数
参数名称 最大进化代数 种群规模 交叉概率 变异概率 求解精度 变量上限值 变量下限值
符号 值
tmax 100 100 0.8 0.1
10?4
n
pc pm
dec
xmax
xmin
10 0
3.2 染色体编码
本程序采用二进制编码,将决策变量编码为二进制,其串长取决于问题要求的求解精度,但本题并没有给出精度要求,只是限定了x1为整数,不妨假设求解精度为10?4,两个变量均采用二进制编码,x1为整数这个限制条件在可在计算出小数值后作四舍五入取整处理,因此可按照假设的求解精度将决策变量的值域分成105份,则有:
x?xmin???x'2mi?1?(xmax?xmin)?105?2mi (3.2)
由于所有变量的求解精度一样,那么,决策变量的串长m1?20、m2?20,于是染色体的总长m?m1?m2?40,求解二进制编码串长的程序时len.m。那么,二进制编码精度为
??10?0?9.5368?10?6 (3.3) 202?1根据二进制编码的串长以及种群规模可生成初始种群,为计算种群中的各个个体的适应值,应先将基因型转换成表现型,其程序为coding.m。首先,将二进制值转换为十进制值,其公式为
(b1b2?bm1)2??bi?2i?1?x' (3.4)
i?1m1那么,对应的变量值为
x?x??'x (3.5) min?3.3 计算适应值
首先确定适应度函数。根据目标函数和约束条件可选择适应度函数的变换方式。由于目标函数f(x)?0,为了避免出现适应值大于1的情况,于是根据目标函数的特点在设计适应度函数时,在分母上加上2,分子上剩以4,如式(3.1)所示;又根据优化问题的约束条件,利用约束条件处理方法中的罚函数法设计了相应的罚函数c,那么适应度函数为 F(x)?4 (3.6)
f(x)?c?2其中,c???max{0,g1(x1,x2)?5}???max{0,|h1(x1,x2)?4|},????10000。
按照上述方法计算种群中各个个体的适应值,如果适应值趋近于1,那么对应的个体即为最佳个体,计算适应值的程序是fitness.m。
3.4 遗传算子
3.4.1 选择操作
本程序选择轮盘赌法来实现选择操作。根据之前计算的各个个体的适应值,利用式(2.6)计算种群中所有个体的适应值的和Fall;然后按照如式(2.7)、(2.8)计算每个个体的选择概率p和累计概率q。旋转轮盘100次(种群规模),每次生成一个0到1的随机数r,用这个随机数与种群中的个体的累积概率q作比较,如果这个随机数落在了这个概率区间,那么就保留该个体,这就完全模拟了轮盘赌的思想,若个体的选择概率大,那么它被选到遗传到下一代的概率也就大一些。选择操作的程序是selec.m。 3.4.2 交叉操作
对经过选择操作产生的群体作交叉操作。本程序采用均匀交叉的方式,首先打乱种群中所有个体的原有排列顺序,这样体现了随机抽取的概念,然后把种群分成两部分new_genA和new_genB;分别从这两个部分选择一个个体配成对进行均匀交叉,其程序为cross.m。 3.4.3 变异操作
对经过交叉操作产生的群体作变异操作。本程序采用基本位变异方法实现变异操作,依据变异概率对新种群中的个体实施基本位变异,具体程序为mut.m。
在最初编写的程序中还包含倒位操作,具体程序是inverse.m,原理类似于基本位变异,只是具体操作上有差异。在调试时,我比较了有倒位操作和没有倒位操作作用于程序对计算结果的影响,在有倒位操作时并没有改善算法在搜索到最优解方面的性能,于是我在最终的程序中取掉了这一操作。
3.5 搜索终止判断
本程序采用了达到最大进化代数时停止搜索的方法,由于本问题比较简单,所以采用此法是可行的。但是,对于复杂的问题,也许要求更加有效的判断手段,所以这是需要改进的地方。
3.6 运行调试
调试阶段解决了两个问题:第一,最佳个体的适应值很快就达到一个稳定的值而不再变化;第二,适应度函数的设计存在缺陷。针对第一个问题,考虑到交叉操作是产生新个体的主要操作,所以将交叉概率从0.8调到0.9,增加对种群
的交叉操作,产生更多的新个体,保持了种群的多样性,这就使得最优个体是适应值不断的变化。对于第二个问题是在调试过程中发现最优个体适应值超过了1,于是检查适应度函数时发现了这个问题,最开始设计的适应度函数为
F(x)?2 (3.7)
f(x)?c其中,c???max{0,g1(x1,x2)?5}???max{0,|h1(x1,x2)?4|},????10000。很有可能就是分母小于了2,于是在分母上加上一个常数即可,修改后的适应度函数如式(3.6)所示。
调试后运行的结果如图3-1所示,本次运行的最优个体的适应值和种群平均适应值随进化代数的变换趋势如图3-2所示。
图3-1 通过遗传算法计算出的结果
图3-2 最优个体适应值与种群平均适应值变化曲线
4 总结
首先,对本次遗传算法的培训工作做一下总结。从开始拿到这个问题的时候什么都不懂,到现在能够顺利编写简单的遗传程序,这其中我遵循了先从基本概念入手,然后学习简单方法这样一个研究过程。先是学习遗传算法中的名词、概念,然后学习遗传算法的基本原理,分块掌握每部分的内容,如遗传操作包括了选择、交叉、变异,那么选择的概念是什么,目的是什么,实现方法有哪些,逐步理解掌握。在理解概念的基础上,先从简单的方法入手,编制简单优化问题的遗传算法,在程序上也使用常用、简单的遗传操作方法。这为以后在学习新的问题提供了方法,也更加的自信能够学好新问题。
其次,本次编写的程序还有很多需要改进的地方。第一,编码方法,本程序使用的是二进制编码,而题目要求x1为整数,所以可以开始就对x1进行实数编码,对x2依然采用二进制编码,这样计算出来的结果可能更接近最优解。第二,遗传算法不收敛的问题。是否可以考虑在执行交叉、变异之前筛选出最优个体直接作为下一代个体,而不被交叉、变异所破坏,同时也保证了搜索效率。
最后,对近期工作做一下展望,遗传算法的学习结束后,接下来就是学习PSASP潮流计算部分的程序,对比自己编写的潮流程序,并修改自己的程序以实现至少三种方式的调压。由于本周确定了专业方向:状态估计,因此,下一阶段的学习同时围绕学习电力系统状态估计来进行。