现代优化算法——遗传算法
简介
GA:根据群体搜索技术,根据适者生存原则逐代进化,最终得到最优解或准最优解。
需要的操作
- 产生初始群体;
- 求每个个体适应度,选择优良个体
- 父代优良个体两两配对,随机交叉染色体基因并随机变异某些染色体基因生成子代群体(变异操作是基于交叉后的染色体种群)
实现方法
- 确定可行解域,确定编码方法,用字符串或数值串(基因序列)表示可行解域中的每一个解
- 适应度函数度量每个解的好坏
- 确定进化参数:群体规模M,交叉概率\(p_c\),变异概率\(p_m\),进化终止条件
分析
在传统的遗传算法中:
- 变异操作在交叉操作的基础上进行,强调交叉作用,变异只是一个生物学机制;
- 交叉操作中,常采用单点交叉/段交叉(随机产生交叉位置),多点交叉,均匀交叉;
- 变异操作中,变异算子用 高斯分布的随即变异实现。
改进
- 将变异操作从交叉操作中分离出来,使其成为并列于交叉操作的产生子代的寻优操作;
- 交叉操作中,父代配对的个体采用“门当户对”原则(排序,较优对较优),混沌序列确定交叉点,单点交叉;
- 变异操作中,混沌序列确定变异染色体及变异位置。
使用方法
使用python第三方库geatpy,利用算法模板进行遗传进化求解
框架使用
示例:

代码
import geatpy as ea
import numpy as np
class MyProblem(ea.Problem):
def __init__(self):
name="Problem_12.1" # 问题名称
M=1 # 目标维度
maxormins=[1] # 目标最小最大化标记,1:最小化该目标;-1:最大化该目标
Dim=2 # 决策变量维度
varTypes=[0]*Dim # 决策变量类型,0:连续性;1:离散型
lb=[-100]*Dim # 决策变量下界
ub=[100]*Dim # 决策变量上界
lbin=[1]*Dim # 是否包括决策变量上界
ubin=[1]*Dim # 是否包括决策变量下界
# 调用父类构造方法完成实例化
ea.Problem.__init__(self,name,M,maxormins,Dim,varTypes,lb,ub,lbin,ubin)
def aimFunc(self,pop): # 目标函数
x1=pop.Phen[:,[0]]
x2=pop.Phen[:,[1]]
f=(x1-2)**2+(x2-1)**2
CV1=-x1+2*x2-1
CV2=-x1*x1/4+x2*x2-1
CV=np.hstack((CV1,CV2))
pop.CV=CV # 约束矩阵(注意<=0表示满足,越大越不满足)
pop.ObjV=f # 目标函数
# 实例化问题变量
problem=MyProblem()
'''----------------------种群设置--------------------------------------'''
Encoding='BG' # 编码方式,BG表示二进制/格雷编码
NIND=100 # 种群规模
Field=ea.crtfld(Encoding,problem.varTypes,problem.ranges,problem.borders) # 区域描述器
population=ea.Population(Encoding,Field,NIND) #生成初始种群
'''-----------------------算法模板调用------------------------------------'''
myAlgo=ea.soea_EGA_templet(problem,population)# 实例化算法模板对象
myAlgo.MAXGEN=200 # 最大进化代数
myAlgo.logTras=1 #每隔多少代记录日志,0表示不记录
myAlgo.verbose=True # 是否打印日志信息
myAlgo.drawing=1 # 绘图方式,1:绘制结果图 2:绘制目标空间过程动画 3:绘制决策空间过程动画
''''----------------------调用算法模板进行种群进化------------------------------'''
[BestIndi, population]=myAlgo.run() # 执行算法模板,得到最优个体及最后一代种群
BestIndi.save() # 保存最优个体信息至文件
'''--------------------------输出结果----------------------------------------'''
print('用时:%f 秒' % myAlgo.passTime)
print('评价次数:%d 次' % myAlgo.evalsNum)
if BestIndi.sizes != 0:
print('最优的目标函数值为:%s' % BestIndi.ObjV[0][0])
print('最优的控制变量值为:')
for i in range(BestIndi.Phen.shape[1]):
print(BestIndi.Phen[0, i])
else:
print("未找到可行解")
运行结果
用时:0.145813 秒
评价次数:19801 次
最优的目标函数值为:5.92308989399086e-10
最优的控制变量值为:
1.9999990463252288
0.9999756812933356

分析
geatpy算法箱算法模板:



浙公网安备 33010602011771号