使用 scikit-opt 遗传算法

  • scikit-opt 遗传算法库简单使用

  • 资料来源:

    https://github.com/guofei9987/scikit-opt
    https://scikit-opt.github.io/scikit-opt/#/zh/README

  • 更新

    1
    2021.12.16 初始

导语

这两个月项目中使用到了非常多的库,接下来的总结过程估计需要好几天.

这一篇是 scikit-opt 库.

scikit-opt 包含了众多启发式算法,包括遗传算法、蚁群、粒子群等,这里项目中选择了最熟悉的遗传算法.

遗传算法通常用在最优化问题上,需要一个进化方向,不停迭代变异种群,直到到达迭代次数或达到要求.

使用

使用前

1
pip install scikit-opt

官方例程 -> demo_ga.py

整体流程非常简单,定义函数,调库,即结束.

1
2
3
4
5
6
7
8
9
10
11
import numpy as np


def schaffer(p):
'''
This function has plenty of local minimum, with strong shocks
global minimum at (0,0) with value 0
'''
x1, x2 = p
x = np.square(x1) + np.square(x2)
return 0.5 + (np.square(np.sin(x)) - 0.5) / np.square(1 + 0.001 * x)
1
2
3
4
5
from sko.GA import GA

ga = GA(func=schaffer, n_dim=2, size_pop=50, max_iter=800, prob_mut=0.001, lb=[-1, -1], ub=[1, 1], precision=1e-7)
best_x, best_y = ga.run()
print('best_x:', best_x, '\n', 'best_y:', best_y)

GA 函数

  • func: 需要最优化的函数
  • n_dim: func 的变量数量
  • size_pop: 种群大小
  • max_iter: 最大迭代次数
  • prob_mut: 突变的概率
  • lb: 变量的上线,可以传入等维度数组,或一个值.
  • ub: 变量的下线,可以传入等维度数组,或一个值.
  • precision: 变量精度.

当变量是一个矩阵时,需要转为一维数组传入.

默认优化方向是最小化,需要最大化时,取负号,是某个具体值取个等式.

小批量问题,运行足够快了,但是还有其他加速办法

加速

官方文档有 4 种方式

  • 矢量化
  • 多线程
  • 多进程
  • 缓存化

按照示例是 矢量化 >> 多进程/多线程 > 不加速. 取值有限上缓存.

  • 能矢量化就矢量化,对函数有要求,按照示例看似乎是要求尽量用 numpy 库完成操作.
  • 多线程对应 io 密集/多进程对应 cpu 密集
  • 取值空间有限,上缓存,缓存每次计算结果.

这里以缓存话为例,其他流程相同:

1
2
mode = 'cached'
set_run_mode(schaffer, mode)

然后正常运行…(就这)

结语

scikit-opt 还有封装了其他很多启发式算法,预计接下来的工作中会长期使用,谨记录下来备忘.