python常用算法包_Python 有什么启发式算法的包吗?

集成了六种启发式算法,并且都做了很好的封装guofei9987/scikit-opt​github.comv2-4f5cdb38bbfb23abe4ced8ba01dfeb44_ipico.jpg

安装

$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-opt​github.com

另外,这个库总共封装了遗传算法(GA)、粒子群算法(PSO)、蚁群算法(ACA)、模拟退火算法(SA)、免疫优化算法(IA)、人工鱼群算法(AFSA)。

文档在下面,大家探索吧。中文文档​scikit-opt.github.ioDocument​scikit-opt.github.io

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值