许多学习算法的开发者在刷题或者练习的过程中都会遇到启发式算法,如果你恰好也正在学习算法,那么明天 Gitee 介绍的这款开源我的项目肯定能对你的学习过程有所帮忙,帮你更好的了解启发式算法。
启发式算法(heuristic algorithm)是绝对于最优化算法提出的。一个问题的最优算法求得该问题每个实例的 最优解。启发式算法能够这样定义:一个基于直观或教训结构的算法,在可承受的破费(指计算工夫和空间)下给出待解决组合优化问题每一个实例的一个可行解,该可行解与最优解的偏离水平个别不能被预计。
项目名称: scikit-opt
我的项目作者: guofei9987
开源许可协定: MIT
我的项目地址:https://gitee.com/guofei9987/scikit-opt
我的项目简介
该我的项目是一个封装了 7 种启发式算法的 Python 代码库,蕴含了差分进化算法、遗传算法、粒子群算法、模拟退火算法、蚁群算法、鱼群算法、免疫优化算法。
个性
- UDF(用户自定义算子)
- GPU 减速
- 断点持续运行
算法演示
差分进化算法
1. 定义你的问题
'''
min f(x1, x2, x3) = x1^2 + x2^2 + x3^2
s.t.
x1\*x2 >= 1
x1\*x2 <= 5
x2 + x3 = 1
0 <= x1, x2, x3 <= 5
'''
def obj\_func(p):
x1, x2, x3 = p
return x1 \*\* 2 + x2 \*\* 2 + x3 \*\* 2
constraint\_eq = \[lambda x: 1 - x\[1\] - x\[2\]
\]
constraint\_ueq = \[lambda x: 1 - x\[0\] \* x\[1\],
lambda x: x\[0\] \* x\[1\] -
2. 做差分进化算法
from sko.DE import DE
de = DE(func=obj\_func, n\_dim=3, size\_pop=50, max\_iter=800, lb=\[0, 0, 0\], ub=\[5, 5, 5\],
constraint\_eq=constraint\_eq, constraint\_ueq=constraint\_ueq)
best\_x, best\_y = de.run()
print('best\_x:', best\_x, '\\n', 'best\_y:', best\_y
遗传算法
1. 定义你的问题
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.sin(x) - 0.5) / np.square(1 + 0.001 \* x
2. 运行遗传算法
from sko.GA import GA
ga = GA(func=schaffer, n\_dim=2, size\_pop=50, max\_iter=800, 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)
3. 用 matplotlib 画出后果
import pandas as pd
import matplotlib.pyplot as plt
Y\_history = pd.DataFrame(ga.all\_history\_Y)
fig, ax = plt.subplots(2, 1)
ax\[0\].plot(Y\_history.index, Y\_history.values, '.', color='red')
Y\_history.min(axis=1).cummin().plot(kind='line')
plt.show()
粒子群算法
1. 定义问题
def demo\_func(x):
x1, x2, x3 = x
return x1 \*\* 2 + (x2 - 0.05) \*\* 2 + x3 \*\* 2
2. 做粒子群算法
from sko.PSO import PSO
pso = PSO(func=demo\_func, dim=3, pop=40, max\_iter=150, lb=\[0, -1, 0.5\], ub=\[1, 1, 1\], w=0.8, c1=0.5, c2=0.5)
pso.run()
print('best\_x is', pso.gbest\_x, 'best\_y is', pso.gbest\_y)
3. 画出后果
import matplotlib.pyplot as plt
plt.plot(pso.gbest\_y\_hist)
plt.show()
模拟退火算法
模拟退火算法用于多元函数优化
1. 定义问题
demo\_func = lambda x: x\[0\] \*\* 2 + (x\[1\] - 0.05) \*\* 2 + x\[2\] \*\* 2
2. 运行模拟退火算法
from sko.SA import SA
sa = SA(func=demo\_func, x0=\[1, 1, 1\], T\_max=1, T\_min=1e-9, L=300, max\_stay\_counter=150)
best\_x, best\_y = sa.run()
print('best\_x:', best\_x, 'best\_y', best\_y)
3. 画出后果
import matplotlib.pyplot as plt
import pandas as pd
plt.plot(pd.DataFrame(sa.best\_y\_history).cummin(axis=0))
plt.show()
蚁群算法
蚁群算法 (ACA, Ant Colony Algorithm) 解决 TSP 问题
from sko.ACA import ACA\_TSP
aca = ACA\_TSP(func=cal\_total\_distance, n\_dim=num\_points,
size\_pop=50, max\_iter=200,
distance\_matrix=distance\_matrix)
best\_x, best\_y = aca.run(
免疫优化算法
from sko.IA import IA\_TSP
ia\_tsp = IA\_TSP(func=cal\_total\_distance, n\_dim=num\_points, size\_pop=500, max\_iter=800, prob\_mut=0.2,
T=0.7, alpha=0.95)
best\_points, best\_distance = ia\_tsp.run()
print('best routine:', best\_points, 'best\_distance:', best\_distance)
人工鱼群算法
def func(x):
x1, x2 = x
return 1 / x1 \*\* 2 + x1 \*\* 2 + 1 / x2 \*\* 2 + x2 \*\* 2
from sko.AFSA import AFSA
afsa = AFSA(func, n\_dim=2, size\_pop=50, max\_iter=300,
max\_try\_num=100, step=0.5, visual=0.3,
q=0.98, delta=0.5)
best\_x, best\_y = afsa.run()
print(best\_x, best\_
想要学习更多算法类开源我的项目?点击前面的链接返回 Gitee 看看:https://gitee.com/explore/mathlibs