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(alpopm.sindex = np.random.choice(range(alpopm.sindex = np.random.choice(range(alpopm.sindex = np.random.choice(range(alpopm.sindex = np.random.choice(range(alpopm.sindex = np.random.choice(range(alpopm.sindex = np.random.choice(range)_) , 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), sizeants_index = np.random.choice(range(self.size_pop), sizeants_index =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_uestraint_ue =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)return 0.5 + (np.square(np.sin(part1 )) - 0.5) / np.square(1 + 0.001 * 第 2 部分)
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, '.', colortory.index, Y_history.values, '.', colortory.index, Y_history.values, '.', colortory.index, Y_history.values, '.', colortory.index, Y_history.values, '.', colortory。 ='紅色')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 = Sobd.distd. tal_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] , best_points_coordinate[:, 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(a),adance. (最佳點))
Step3 :繪製結果
-> 示範程式碼:examples/demo_sa_tsp.py#s3
從matplotlib.ticker 導入FormatStrFormatterfig, ax = plt.subplots(1, 2)best_points_ = np.concatenate([best_points, [best_points[0]]])best_points_coordinate =ppoint_座標[best_points_, :lot][0]:lot] (sa_tsp .best_y_history)ax[0].set_xlabel("迭代")ax[0].set_ylabel("距離")ax[1].plot(best_points_co骨頭[:, 0], best_points_co骨[:, 1],標記='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)b.例程:',best_points,'best_distance:',best_distance)
-> 示範程式碼: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。