Scikit-opt库学习之GA模块
一、简介
Scikit-opt(简称sko)的GA
模块提供了一个遗传算法(Genetic Algorithm, GA)的实现,用于解决优化问题。遗传算法是一种模拟自然选择和遗传学原理的搜索算法,常用于求解复杂的优化问题,特别是对于非线性、多峰值、连续或离散的搜索空间。
二、语法和参数
GA
模块的基本语法如下:
from sko.GA import GA
ga = GA(func, n_dim, size_pop, max_iter, lb, ub, precision, prob_mut)
参数说明:
func
:优化的目标函数,该函数接受一个数组作为输入,并返回一个标量作为输出。n_dim
:问题的维度,即目标函数的参数个数,或者说是染色体长度。size_pop
:种群大小,即每一代中的个体数量。max_iter
:最大迭代次数,即算法运行的代数。lb
:参数的下界,一个数组,指定每个维度的最小值。ub
:参数的上界,一个数组,指定每个维度的最大值。precision
:算法的精度,用于判断算法是否收敛。prob_mut
:突变概率,即每个个体的基因在每次迭代中发生突变的概率。
三、实例
下面的代码中,我用GA模块即使用遗传算法来拟合一个曲线。
运行前请确定你的python环境安装了代码中导入的三个包,如果不确定请先使用如下代码进行安装:
pip install numpy matplotlib scikit-opt
算法代码:
import numpy as np
import matplotlib.pyplot as plt
from sko.GA import GA
# 生成用于曲线拟合的真实数据点
x_true = np.linspace(-1.2, 1.2, 30) # 产生30个介于-1.2到1.2之间的等差数
y_true = x_true ** 3 - x_true + 0.4 * np.random.rand(30) # 计算y值,并添加噪声
# 绘制真实数据点
plt.plot(x_true, y_true, 'o')
# 定义一个多项式函数,用于后续的拟合
def f_fun(x, a, b, c, d):
return a * x ** 3 + b * x ** 2 + c * x + d
# 定义遗传算法的适应度函数,用于最小化多项式拟合的残差平方和
def obj_fun(p):
a, b, c, d = p # 解包多项式的系数
residuals = np.square(f_fun(x_true, a, b, c, d) - y_true).sum() # 计算损失平方和
return residuals # 返回适应度值,越小越好
# 初始化遗传算法的参数
nga = GA(
func=obj_fun, # 适应度函数
n_dim=4, # 问题的维度,即多项式的系数个数
size_pop=100, # 种群大小
max_iter=500, # 最大迭代次数
lb=[-2] * 4, # 系数的下界
ub=[2] * 4 # 系数的上界
)
# 运行遗传算法寻找最优解
best_params, residuals = nga.run()
# 打印最优参数和残差平方和
print('best_x:', best_params, '\n', 'best_y:', residuals)
# 使用最优参数计算多项式拟合的y值
y_predict = f_fun(x_true, *best_params)
# 准备绘图,展示真实数据点和多项式拟合结果
fig, ax = plt.subplots()
# 绘制真实数据点
ax.plot(x_true, y_true, 'o')
# 绘制多项式拟合曲线
ax.plot(x_true, y_predict, '-')
# 显示图表
plt.show()
四、注意事项
- 遗传算法的参数选择对算法性能有重要影响,需要根据具体问题进行调整。
GA
模块默认使用二进制编码,如果需要其他编码方式,可能需要自定义。- 遗传算法可能会得到局部最优解,特别是对于复杂问题,可能需要多次运行以提高找到全局最优解的概率。
- 算法的收敛性受多种因素影响,包括种群大小、突变率、交叉率等,需要仔细调整以获得最佳性能。