集成了六种启发式算法,并且都做了很好的封装guofei9987/scikit-optgithub.com
安装
$pip install scikit-opt
目标函数
def demo_func(x):
x1, x2, x3 = x
return x1 ** 2 + (x2 - 0.05) ** 2 + x3 ** 2
用遗传算法求解
from ga import GA
ga = GA(func=demo_func, lb=[-1, -10, -5], ub=[2, 10, 2], max_iter=500)
best_x, best_y = ga.run()
还提供一个每代数据的借口,可以拿来画各个维度的图
import pandas as pd
import matplotlib.pyplot as plt
FitV_history = pd.DataFrame(ga.FitV_history)
fig, ax = plt.subplots(2, 1)
ax[0].plot(FitV_history.index, FitV_history.values, '.', color='red')
plt_max = FitV_history.max(axis=1)
ax[1].plot(plt_max.index, plt_max, label='max')
ax[1].plot(plt_max.index, plt_max.cummax())
plt.show()
2. 用遗传算法解决TSP问题(Travelling Salesman Problem)
加载距离矩阵的数据,这里用随机数生成数据
from GA import GA_TSP
import numpy as np
num_points = 8
points = range(num_points)
points_coordinate = np.random.rand(num_points, 2)
distance_matrix = np.zeros(shape=(num_points, num_points))
for i in range(num_points):
for j in range(num_points):
distance_matrix[i][j] = np.linalg.norm(points_coordinate[i] - points_coordinate[j], ord=2)
print('distance_matrix is: \n', distance_matrix)
def cal_total_distance(points):
num_points, = points.shape
total_distance = 0
for i in range(num_points - 1):
total_distance += distance_matrix[points[i], points[i + 1]]
total_distance += distance_matrix[points[i + 1], points[0]]
return total_distance
用遗传算法求解:
ga_tsp = GA_TSP(func=cal_total_distance, points=points, pop=50, max_iter=200, Pm=0.001)
best_points, best_distance = ga_tsp.fit()
画图:
fig, ax = plt.subplots(1, 1)
best_points_ = np.concatenate([best_points, [best_points[0]]])
best_points_coordinate = points_coordinate[best_points_, :]
ax.plot(best_points_coordinate[:, 0], best_points_coordinate[:, 1],'o-r')
plt.show
这个库的灵活之处在于,可以方便地添加自定义算子
例如,如果你想到一种选择算子(selection),你的算子是这样的:
def selection_tournament(self, tourn_size):
FitV = self.FitV
sel_index = []
for i in range(self.size_pop):
aspirants_index = np.random.choice(range(self.size_pop), size=tourn_size)
sel_index.append(max(aspirants_index, key=lambda i: FitV[i]))
self.Chrom = self.Chrom[sel_index, :] # next generation
return self.Chrom
把你的 UDF 自定义算子注册到遗传算法对象上:
from sko.GA import GA, GA_TSP
from sko.GA import ranking_linear, ranking_raw, crossover_2point, selection_roulette_2, mutation
demo_func = lambda x: x[0] ** 2 + (x[1] - 0.05) ** 2 + x[2] ** 2
ga = GA(func=demo_func, n_dim=3, size_pop=100, max_iter=500, lb=[-1, -10, -5], ub=[2, 10, 2])
#
ga.register(operator_name='ranking', operator=ranking_linear). \
register(operator_name='crossover', operator=crossover_2point). \
register(operator_name='mutation', operator=mutation). \
register(operator_name='selection', operator=selection_tournament, tourn_size=3)
像往常一样运行遗传算法:
best_x, best_y = ga.run()
print('best_x:', best_x, '\n', 'best_y:', best_y)
恭喜你,成功了。现在 udf 支持遗传算法的这几个算子: crossover, mutation, selection, ranking
提供了十来个算子 参考这里
3. 粒子群算法
定义目标函数
def demo_func(x):
x1, x2, x3 = x
return x1 ** 2 + (x2 - 0.05) ** 2 + x3 ** 2
优化求解
from sko.PSO import PSO
pso = PSO(func=demo_func, dim=3)
fitness = pso.run()
print('best_x is ',pso.gbest_x)
print('best_y is ',pso.gbest_y)
pso.plot_history()
from sko.SA import SA
def demo_func(x):
x1, x2, x3 = x
return x1 ** 2 + (x2 - 0.05) ** 2 + x3 ** 2
sa = SA(func=demo_func, x0=[1, 1, 1])
x_star, y_star = sa.run()
print(x_star, y_star)
import matplotlib.pyplot as plt
import pandas as pd
plt.plot(pd.DataFrame(sa.f_list).cummin(axis=0))
plt.show()
TSP问题(旅行商问题)
作为demo,生成模拟数据(代码与遗传算法解决TSP问题一样,这里省略)
调用模拟退火算法
from sko.SA import SA_TSP
sa_tsp = SA_TSP(func=demo_func, x0=range(num_points))
best_points, best_distance = sa_tsp.run()
画出结果
fig, ax = plt.subplots(1, 1)
best_points_ = np.concatenate([best_points, [best_points[0]]])
best_points_coordinate = points_coordinate[best_points_, :]
ax.plot(best_points_coordinate[:, 0], best_points_coordinate[:, 1], 'o-r')
plt.show()
4. 蚁群算法解决TSP问题
蚁群算法(ACA, Ant Colony Algorithm)
aca = ACA_TSP(func=cal_total_distance, n_dim=8,
size_pop=10, max_iter=20,
distance_matrix=distance_matrix)
best_x, best_y = aca.run()
from sko.IA import IA_TSP_g as IA_TSP
ia_tsp = IA_TSP(func=cal_total_distance, n_dim=num_points, pop=500, max_iter=2000, Pm=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.ASFA import ASFA
asfa = ASFA(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 = asfa.run()
print(best_x, best_y)
库的地址,欢迎starscikit-optgithub.com
另外,这个库总共封装了遗传算法(GA)、粒子群算法(PSO)、蚁群算法(ACA)、模拟退火算法(SA)、免疫优化算法(IA)、人工鱼群算法(AFSA)。
文档在下面,大家探索吧。中文文档scikit-opt.github.ioDocumentscikit-opt.github.io