简单的遗传算法
导言
研究生研究的领域就是用启发算法来解决超多目标优化问题,所谓的超多目标就是要同时优化目标维数超过3维且目标之间具有一定矛盾性的问题。例如从深圳到北京的交通路线,我们若只考虑时间与价格这两个目标问题(二维多目标问题),会存在时长最短但是价格昂贵的路线选择(例如航班直达),也会存在价格最便宜但是很花时间的路线(例如辗转火车公交),不会存在时长最短价格最便宜的最优路线。解决多目标问题的启发算法里,遗传算法和粒子群算法的论文较多,今天讲一下简单的遗传算法。
算法思想
遗传算法主要是用达尔文进化论的观点,优胜劣汰适者生存,能更好地适应环境的个体将会保留下来,这些拥有较好适应度的个体基因会传给下一代,让好基因广为流传,活埋不好的基因。遗传算法主要包括种群初始化,交叉,变异和环境选择四个主要操作。遗传算法属于随机性算法,不能找到最优解,只能找到近优解,除非是非常简单的问题。
算法过程
比如我们要解决一个简单的单目标问题,求解目标f的最大值,x1、x2变量有约束范围
max f (x1, x2) = 21.5 + x1·sin(4 pi x1) + x2·sin(20 pi x2)
s. t. -3.0 <= x1 <= 12.1
4.1 <= x2 <= 5.8
对于这类连续问题,其实可以不采用网上最基础的二进制编码来进行单点交叉和单点变异的操作了。实数也可以,只要把交叉和变异操作采用模拟二进制交叉simulated binary crossover(SBX)和多项式变异Polynomial mutation就好了。所以这里的种群个体可以采用[x1,x2]的数值来代表一个个体。
首先进行种群初始化,返回一个大小为100的种群列表,每个元素代表一个由两个变量构成的个体
pop_size = 100 #种群规模
population = []
dec_num = 2 #变量个数
dec_min_val = (-3, 4.1)
dec_max_val = (12.1, 5.8)
def init(population, pop_size, dec_num, dec_min_val, dec_max_val):
rangeRealVal = [dec_max_val[i]-dec_min_val[i] f

本文介绍了使用遗传算法解决超多目标优化问题,特别是针对那些目标之间具有矛盾性的复杂问题。遗传算法基于达尔文的进化理论,通过种群初始化、交叉、变异和环境选择等步骤,寻找问题的近似最优解。文章详细阐述了算法思想,并以一个简单的单目标优化问题为例,展示了实数编码的SBX交叉和多项式变异操作,以及N+N的环境选择策略。
最低0.47元/天 解锁文章
1436

被折叠的 条评论
为什么被折叠?



