import geatpy as ea
import numpy as np
# 构建问题
r = 1 # 目标函数需要用到的额外数据
@ea.Problem.single
def evalVars(Vars): # 定义目标函数(含约束)
f = np.sum((Vars - r) ** 2) # 计算目标函数值
x1 = Vars[0]
x2 = Vars[1]
CV = np.array([(x1 - 0.5)**2 - 0.25,
(x2 - 1)**2 - 1]) # 约束
return f, CV
problem = ea.Problem(name='增强精英保留策略的遗传算法',
M=1, # 目标维数
maxormins=[1], # 目标最小最大化标记列表,1:最小化该目标;-1:最大化该目标
Dim=5, # 决策变量维数(个数为5)
varTypes=[0, 0, 1, 1, 1], # 决策变量的类型列表,0:实数;1:整数。0表示对应的决策变量是连续型变量;为1表示对应的是离散型变量。
lb=[-1, 1, 2, 1, 0], # 决策变量下界
ub=[1, 4, 5, 2, 1], # 决策变量上界
evalVars=evalVars)
# 构建算法
algorithm = ea.soea_SEGA_templet(problem,
# Encoding='RI实整数编,NIND=20设定了种群有20个个体。
ea.Population(Encoding='RI', NIND=20),
MAXGEN=50, # 最大进化代数。
logTras=1, # 表示每隔多少代记录一次日志信息,0表示不记录。
trappedValue=1e-6, # 单目标优化陷入停滞的判断阈值。
maxTrappedCount=10) # 进化停滞计数器最大上限值。
# 求解
res = ea.optimize(algorithm, seed=1, verbose=True, drawing=1, outputMsg=True, drawLog=False, saveFlag=True, dirName='result')
- 上述代码中 Encoding=‘RI’ 表示改种群的染色体是’RI’编码,即“实数整数混合编码”,简称“实整数编码”。类似的还有’P’编码(排列编码,可以让对应的变量互不相同)、'BG’编码(二进制/格雷码编码)。
这段代码使用了Geatpy库来构建一个遗传算法,并应用于一个特定的优化问题。下面是代码的解释:
首先,使用Geatpy库中的
@ea.Problem.single
装饰器定义了一个目标函数evalVars
,该函数接受一个决策变量向量作为输入,并计算目标函数值和约束条件的值。在这个例子中,目标函数是将决策变量与参数r
进行计算,并将结果的平方和作为目标函数值。同时,还定义了两个约束条件CV
,用于限制决策变量的取值范围。然后,通过
ea.Problem
类创建了一个问题实例problem
,其中指定了问题的名称、目标维数、最小最大化标记、决策变量维数、决策变量类型、决策变量的上下界以及目标函数的计算方式。接下来,使用
ea.soea_SEGA_templet
函数构建了一个增强精英保留策略的遗传算法实例algorithm
。该算法采用了RI编码方式(实整数编码),种群规模为20个个体。设定了最大进化代数为50,表示算法将进行50代的进化。同时,还设置了日志记录的频率为每隔一代记录一次日志信息。通过设置trappedValue
和maxTrappedCount
参数,指定了单目标优化陷入停滞的判断阈值和进化停滞计数器的最大上限值。最后,通过调用
ea.optimize
函数,使用前面构建的算法实例对问题进行求解。seed=1
设置了随机种子,verbose=True
和outputMsg=True
表示开启详细的输出信息和输出消息。drawing=1
表示开启绘图功能,drawLog=False
表示不保存绘图日志。saveFlag=True
表示保存结果,结果将保存在名为'result'的目录中。