- 智能优化算法(启发式算法)
常用优化算法
经典优化算法
- genetic algorithm 遗传算法(GA) 20世纪60年代
- Simulated annealing algorithm 模拟退火算法(SA) 1975
- Particle Swarm Optimization 粒子群算法(PSO)
- Ant Colony Optimization 蚁群算法(ACO)
- Tabu Search 禁忌搜索算法(TS)
- Chaotic Optimization Algorithm 混沌优化算法(COA)
优化算法前沿
- Dung Beetle Optimizer 蜣螂算法(DBO) 2022
- Grey Wolf Optimizer 灰狼优化算法(GWO) 2014
- Sparrow Search Algorithm 麻雀搜索算法(SSA)
- ...
- ...
- 遗传算法与模拟退火算法都是非常常用的算法了,相关知识很容易得可以被检索到,本文不予赘述
粒子群算法
- 无群体意识的飞鸟(指的是飞鸟不像borg)如何找到食物呢。
- 假如所有的鸟都知道
- 自己与食物的距离
- 假如鸟之间
- 可以交换 自己与食物的距离 这一信息
- 那么就可以找出一种办法,使得鸟群更趋近于食物
- 假如所有的鸟都知道
粒子群算法的基本思路
- 用Python 3.11.4 编写“伪代码” (这玩意支持中文作为变量名,还是很不错的,这已经不是伪代码的范畴了)
import random
鸟群初始化 = random.random()
鸟群 = 鸟群初始化
def 个体发现的最优位置():
return 1
def 群体发现的最优位置():
return 1
class 鸟个体():
def __init__(self, 鸟初始位置):
self.鸟位置 = 鸟初始位置
def 鸟个体位置更新(self, 群体最优位置, 个体最优位置):
个体学习因子 = 0.5
群体学习因子 = 0.5
assert (个体学习因子+群体学习因子)==1,"学习因子设置错误!"
####
self.鸟位置 = 鸟更新位置
群体迭代限制 = 100
for 群体迭代次数 in range(群体迭代限制):
群体最优位置 = 群体发现的最优位置()
for 鸟个体 in 鸟群:
个体最优位置 = 个体发现的最优位置()
鸟个体.鸟个体位置更新(群体最优位置, 个体最优位置)
- 不一定要面向对象,我随手写得,觉得可以面向对象一下,上下也没有对应起来
pyswarm module
遗传算法与粒子群算法的Python实现 这篇博客里面有一个很棒的例子,我相信是可以用作参考的
- 这里仔细得探讨一下这个module
- 查看help
Help on package pyswarm:
NAME
pyswarm
DESCRIPTION
=========================================================================
pyswarm: Particl swarm optimization (PSO) with constraint support =========================================================================
Author: Abraham Lee
Copyright: 2013-2014
PACKAGE CONTENTS
pso
VERSION
0.6
AUTHOR
Abraham Lee
FILE
....
- 首先我们先向编写这个模块的人致敬
- 当我们打开一个help 文档时(这些文档常常有着很统一的格式),我们特别需要注意PACKAGE CONTENTS。很多module 的DESCRIPTION 是很占位子的
- 查看 help(pso)
- Parameters
- func : The function to be minimized
- lb : The lower bounds
- ub : The upper bounds
- 强制要求设置上下界
- 不需要给出导函数
- 不需要猜测值
- Optional
- ieqcons
- A list of functions of length n such that ieqcons[j](x,*args) >= 0.0
- f_ieqcons
- Returns a 1-D array in which each element must be greater or equal to 0.0 in a successfully optimized problem
- 当该项被指定后,ieqcons 会被忽视
- args and kwargs
- 额外参数
- swarmsize and maxiter
- 粒子(鸟)的数目 默认为100
- 种群最大迭代次数 默认为100
- phip : 个体学习因子(Default: 0.5) and phig : 群体学习因子(Default: 0.5)
- 简单得说,不支持等式约束,但是实际操作中可以使用 -abs(fun)>=0 作为替代
- 但是建议添加一个 tol
- tol - abs(fun) >= 0
- 防止因为精度问题导致无法得到结果
- 但是建议添加一个 tol
- 允许 修改 个体学习因子 与 群体学习因子
- 也就是说支持验证
- 对优化算法做最优化了
- ieqcons
- 实战
from pyswarm import pso
import numpy as np
import pyswarm
def opt(x):
x1 = x[0]
x2 = x[1]
x3 = x[2]
x4 = x[3]
return (x1 + 2)**2 +\
(x2 - 3)**2 +\
(x3 + 2)**2 +\
x4
def con(x):
tol = 1e-4
x1 = x[0]
x2 = x[1]
x3 = x[2]
x4 = x[3]
return [ x2 - x1 ,tol-(x4-3)**2]
lb = [-5, -5, -5, -5]
ub = [ 5, 5, 5, 5]
xopt, fopt = pso(opt, lb, ub, f_ieqcons=con)
print("xopt:", xopt)
print("fopt:", fopt)
Stopping search: maximum iterations reached --> 100
xopt: [-2.04252256 2.86597889 -1.96153295 2.9900635 ]
fopt: 3.0113130416323957
- 现在我们看看修改tol 之后的结果
tol(1e-n) | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
opt(should be 3) | 2.68 | 2.90 | 2.98 | 3.43 | 6.81 | 19.91 | 13.89 |
- 也就是说,这些约束并不能很好得被满足
- 也就是说 PSO 还不够完善
- 可信度并不是特别高
蚁群算法
本文含有隐藏内容,请 开通VIP 后查看