Python 中的群体智能
(遗传算法、粒子群优化、模拟退火、蚁群算法、免疫算法、Python中的人工鱼群算法)
文档: https://scikit-opt.github.io/scikit-opt/#/en/
文档: https://scikit-opt.github.io/scikit-opt/#/zh/
源代码: https://github.com/guofei9987/scikit-opt
帮助我们改进 scikit-opt https://www.wjx.cn/jq/50964691.aspx
pip 安装 scikit-opt
对于当前的开发者版本:
git clone [email protected]:guofei9987/scikit-opt.git
cd scikit-opt
pip install .
UDF (用户定义函数)现已推出!
例如,您刚刚制定了一种新型selection
函数。
现在,您的selection
函数如下所示:
-> 演示代码:examples/demo_ga_udf.py#s1
# step1: 定义你自己的操作符:def Selection_tournament(algorithm,tourn_size):FitV = Algorithm.FitVsel_index = []for i in range(algorithm.size_pop):aspirants_index = np.random.choice(range(algorithm.size_pop), size =tourn_size)sel_index.append(max(aspirants_index, key=lambda i: FitV[i]))algorithm.Chrom = Algorithm.Chrom[sel_index, :] # 下一代返回algorithm.Chrom
导入并构建 ga
-> 演示代码:examples/demo_ga_udf.py#s2
import numpy as npfrom sko.GA import GA, GA_TSPdemo_func = lambda x: x[0] ** 2 + (x[1] - 0.05) ** 2 + (x[2] - 0.5) ** 2ga = GA(func =demo_func,n_dim=3,size_pop=100,max_iter=500, prob_mut=0.001,lb=[-1, -10, -5], ub=[2, 10, 2], 精度=[1e-7, 1e-7, 1])
将您的 udf 注册到 GA
-> 演示代码:examples/demo_ga_udf.py#s3
ga.register(operator_name='selection',operator=selection_tournament,tourn_size=3)
scikit-opt 还提供了一些运算符
-> 演示代码:examples/demo_ga_udf.py#s4
从 sko.operators 导入排名、选择、交叉、mutationga.register(operator_name='ranking',operator=ranking.ranking)。注册(operator_name='crossover',operator=crossover.crossover_2point)。注册(operator_name='mutation',operator=mutation.mutation)
现在像往常一样进行GA
-> 演示代码:examples/demo_ga_udf.py#s5
best_x, best_y = ga.run()print('best_x:', best_x, 'n', 'best_y:', best_y)
到目前为止,GA scikit-opt 的udf支持
crossover
、mutation
、selection
、ranking
,提供了十几个算子,参见这里
对于高级用户:
-> 演示代码:examples/demo_ga_udf.py#s6
类 MyGA(GA):def 选择(self,tourn_size=3):FitV = self.FitVsel_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, :] # 下一代返回 self.Chromranking = rating.rankingdemo_func = lambda x: x[0] ** 2 + (x[1] - 0.05) ** 2 + (x[2] - 0.5) ** 2my_ga = MyGA(func=demo_func, n_dim=3, size_pop=100, max_iter=500, lb=[-1, -10, -5], ub=[2, 10, 2], precision=[1e-7, 1e-7, 1])best_x, best_y = my_ga.run()print('best_x :', best_x, 'n', 'best_y:', best_y)
(0.3.6版本新增)
运行算法 10 次迭代,然后在之前 10 次迭代的基础上再运行 20 次迭代:
从 sko.GA 导入 GAfunc = lambda x: x[0] ** 2ga = GA(func=func, n_dim=1)ga.run(10)ga.run(20)
矢量化
多线程
多重处理
缓存的
参见https://github.com/guofei9987/scikit-opt/blob/master/examples/example_function_modes.py
我们正在开发GPU计算,将在1.0.0版本上稳定
已有示例:https://github.com/guofei9987/scikit-opt/blob/master/examples/demo_ga_gpu.py
Step1 :定义你的问题
-> 演示代码:examples/demo_de.py#s1
'''最小 f(x1, x2, x3) = x1^2 + x2^2 + x3^2s.t. x1*x2 >= 1 x1*x2 <= 5 x2 + x3 = 1 0 <= x1, x2, x3 <= 5'''def obj_func(p):x1, x2, x3 = 预转 x1 ** 2 + x2 ** 2 + x3 ** 2constraint_eq = [lambda x: 1 - x[1] - x[2] ]constraint_ueq = [lambda x: 1 - x[0] * x[1],lambda x: x[0] * x[1] - 5]
Step2 :进行差分进化
-> 演示代码:examples/demo_de.py#s2
从 sko.DE 导入 DEde = 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)
Step1 :定义你的问题
-> 演示代码:examples/demo_ga.py#s1
import numpy as npdef schaffer(p):''' 该函数有大量局部最小值,在 (0,0) 处具有强冲击全局最小值,值为 0 https://en.wikipedia.org/wiki/Test_functions_for_optimization ''' x1, x2 = ppart1 = np.square(x1) - np.square(x2)part2 = np.square(x1) + np.square(x2)返回 0.5 + (np.square(np.sin(part1)) - 0.5) / np.square(1 + 0.001 * part2)
Step2 :进行遗传算法
-> 演示代码:examples/demo_ga.py#s2
从 sko.GA 导入 GAga = 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)
-> 演示代码:examples/demo_ga.py#s3
import pandas as pdimport matplotlib.pyplot as pltY_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()
只需导入GA_TSP
,它就会重载crossover
、 mutation
来解决TSP
第一步:定义你的问题。准备您的点坐标和距离矩阵。
这里我随机生成数据作为演示:
-> 演示代码:examples/demo_ga_tsp.py#s1
import numpy as npfrom scipy import Spatialimport matplotlib.pyplot as pltnum_points = 50points_coordinate = np.random.rand(num_points, 2) # 生成点的坐标distance_matrix = Spatial.distance.cdist(points_coefficient,points_coefficient, metric='euclidean')def cal_total_distance(例程):'''目标函数。输入例程,返回总距离。 cal_total_distance(np.arange(num_points)) '''num_points,=routine.shapereturn sum([distance_matrix[routine[i % num_points],routine[(i + 1) % num_points]] for i in range(num_points)])
Step2 :进行遗传算法
-> 演示代码:examples/demo_ga_tsp.py#s2
从 sko.GA 导入 GA_TSPga_tsp = GA_TSP(func=cal_total_distance, n_dim=num_points, size_pop=50, max_iter=500, prob_mut=1)best_points, best_distance = ga_tsp.run()
步骤3 :绘制结果:
-> 演示代码:examples/demo_ga_tsp.py#s3
图, ax = plt.subplots(1, 2)best_points_ = np.concatenate([best_points, [best_points[0]]])best_points_coordinate = 点_坐标[best_points_, :]ax[0].plot(best_points_坐标[:, 0] , 最佳点坐标[:, 1], '或')ax[1].plot(ga_tsp. Generation_best_Y)plt.show()
第一步:定义你的问题:
-> 演示代码:examples/demo_pso.py#s1
def demo_func(x):x1, x2, x3 = xreturn x1 ** 2 + (x2 - 0.05) ** 2 + x3 ** 2
Step2 :进行PSO
-> 演示代码:examples/demo_pso.py#s2
从 sko.PSO 导入 PSOpso = PSO(func=demo_func, n_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 是 ', pso.gbest_x, 'best_y 是', pso.gbest_y)
第三步:绘制结果
-> 演示代码:examples/demo_pso.py#s3
将 matplotlib.pyplot 导入为 pltplt.plot(pso.gbest_y_hist)plt.show()
如果您需要非线性约束,例如(x[0] - 1) ** 2 + (x[1] - 0) ** 2 - 0.5 ** 2<=0
代码是这样的:
constraint_ueq = (lambda x: (x[0] - 1) ** 2 + (x[1] - 0) ** 2 - 0.5 ** 2, )pso = PSO(func=demo_func, n_dim=2, pop=40, max_iter=max_iter, lb=[-2, -2], ub=[2, 2] ,constraint_ueq=constraint_ueq)
请注意,您可以添加多个非线性约束。只需将其添加到constraint_ueq
即可
更重要的是,我们有一个动画:
↑参见示例/demo_pso_ani.py
第一步:定义你的问题
-> 演示代码:examples/demo_sa.py#s1
demo_func = lambda x: x[0] ** 2 + (x[1] - 0.05) ** 2 + x[2] ** 2
Step2 :做SA
-> 演示代码:examples/demo_sa.py#s2
从 sko.SA 导入 SAsa = 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)
第三步:绘制结果
-> 演示代码:examples/demo_sa.py#s3
import matplotlib.pyplot as pltimport pandas as pdplt.plot(pd.DataFrame(sa.best_y_history).cummin(axis=0))plt.show()
此外,scikit-opt 提供 3 种类型的模拟退火:Fast、Boltzmann、Cauchy。查看更多内容
第1步:哦,是的,定义你的问题。复制这一步很无聊。
步骤2 :TSP的DO SA
-> 演示代码:examples/demo_sa_tsp.py#s2
from sko.SA import SA_TSPsa_tsp = SA_TSP(func=cal_total_distance, x0=range(num_points), T_max=100, T_min=1, L=10 * num_points)best_points, best_distance = sa_tsp.run()print(best_points, best_distance, cal_total_distance (最佳点))
Step3 :绘制结果
-> 演示代码:examples/demo_sa_tsp.py#s3
from matplotlib.ticker import FormatStrFormatterfig, ax = plt.subplots(1, 2)best_points_ = np.concatenate([best_points, [best_points[0]]])best_points_coordinate = points_coordinate[best_points_, :]ax[0].plot(sa_tsp.best_y_history)ax[0].set_xlabel("迭代")ax[0].set_ylabel("距离")ax[1].plot(best_points_坐标[:, 0], best_points_坐标[:, 1],marker='o',markerfacecolor='b',color='c', linestyle='-')ax[1].xaxis.set_major_formatter(FormatStrFormatter('%.3f'))ax[1].yaxis.set_major_formatter(FormatStrFormatter('%.3f'))ax[1].set_xlabel("经度")ax[1].set_ylabel("纬度")plt.show()
更多:绘制动画:
↑参见示例/demo_sa_tsp.py
-> 演示代码:examples/demo_aca_tsp.py#s2
从 sko.ACA 导入 ACA_TSPaca = 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()
-> 演示代码:examples/demo_ia.py#s2
从 sko.IA 导入 IA_TSPia_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例程:',best_points, '最佳距离:',最佳距离)
-> 演示代码:examples/demo_afsa.py#s1
def func(x):x1, x2 = xreturn 1 / x1 ** 2 + x1 ** 2 + 1 / x2 ** 2 + x2 ** 2from sko.AFSA import AFSAafsa = AFSA(func, n_dim=2, size_pop= 50,max_iter=300,max_try_num=100,步长=0.5,视觉=0.3,q=0.98,增量=0.5)best_x,best_y = afsa.run()print(best_x,best_y)
于静、何Y.、严Q.、康X. (2021)。 SpecView:具有奇异频谱转换的恶意软件频谱可视化框架。 IEEE 信息取证和安全交易,16, 5093-5107。
甄华、翟华、马文、赵立、翁勇、徐勇、……和何X.(2021)。基于强化学习的最优潮流解发生器的设计与测试。能源报告。
Heinrich, K.、Zschech, P.、Janiesch, C. 和 Bonin, M. (2021)。处理数据属性很重要:引入门控卷积神经网络 (GCNN) 和键值预测注意力网络 (KVP),通过深度学习预测下一个事件。决策支持系统,143, 113494。
Tang, HK 和 Goh, SK (2021)。受《易经》哲学启发的一种新型的基于非群体的元启发式优化器。 arXiv 预印本 arXiv:2104.08564。
吴 G.、李 L.、李 X.、陈 Y.、陈 Z.、乔 B.、... 和夏 L. (2021)。基于图嵌入的实时社交事件匹配,用于 EBSN 推荐。万维网,1-22。
潘X.,张Z.,张H.,文Z.,叶W.,杨Y.,...&赵X.(2021)。一种基于注意机制的快速鲁棒混合气体识别和浓度检测算法,配备具有双损失函数的循环神经网络。传感器和执行器 B:化学,342, 129982。
卡斯特拉·巴尔塞尔,M.(2021)。 WindCrete 浮动海上风力发电机的位置保持系统优化。
翟 B.、王 Y.、王 W. 和吴 B. (2021)。雾况下高速公路路段最优变速限制控制策略。 arXiv 预印本 arXiv:2107.14406。
叶XH (2021)。局部线性数据的多标签分类:在化学毒性预测中的应用。
格布哈德,L.(2021)。使用蚁群优化进行低压电网扩展规划 Ausbauplanung von Niederspannungsnetzen mithilfe eines Ameisenalgorithmus。
马X.,周H.,李Z.(2021)。氢与电力系统之间相互依赖性的优化设计。 IEEE 工业应用汇刊。
德库索,TDC (2021)。 Johansen-Ledoit-Sornette de bolhas Financeiras 模型的研究。
吴,T.,刘,J.,刘,J.,黄,Z.,吴,H.,张,C.,...&张,G.(2021)。一种基于人工智能的新型框架,用于无人机辅助无线传感器网络中的 AoI 最佳轨迹规划。 IEEE 无线通信汇刊。
刘 H.、文 Z. 和蔡 W.(2021 年 8 月)。 FastPSO:在 GPU 上实现高效群体智能算法。第 50 届国际并行处理会议(第 1-10 页)。
马布布,R.(2020)。求解 TSP 的算法和优化技术。
Li, J.、Chen, T.、Lim, K.、Chen, L.、Khan, SA、Xie, J. 和 Wang, X. (2019)。深度学习加速了金纳米团簇的合成。先进智能系统,1(3), 1900029。