一个易用、易部署的Python遗传算法库
簡介:?# [scikit-opt](https://github.com/guofei9987/scikit-opt) [](https://pypi.org/project/scikit-opt/) [式算法的 Python 代碼庫?
(差分進(jìn)化算法、遺傳算法、粒子群算法、模擬退火算法、蟻群算法、魚群算法、免疫優(yōu)化算法)
安裝
pip install scikit-opt或者直接把源代碼中的?sko?文件夾下載下來放本地也調(diào)用可以
特性
特性1:UDF(用戶自定義算子)
舉例來說,你想出一種新的“選擇算子”,如下
-> Demo code:?examples/demo_ga_udf.py#s1
導(dǎo)入包,并且創(chuàng)建遺傳算法實(shí)例?
-> Demo code:?examples/demo_ga_udf.py#s2
把你的算子注冊到你創(chuàng)建好的遺傳算法實(shí)例上?
-> Demo code:?examples/demo_ga_udf.py#s3
scikit-opt 也提供了十幾個算子供你調(diào)用?
-> Demo code:?examples/demo_ga_udf.py#s4
做遺傳算法運(yùn)算
-> Demo code:?examples/demo_ga_udf.py#s5
現(xiàn)在?udf?支持遺傳算法的這幾個算子:?crossover,?mutation,?selection,?ranking
Scikit-opt 也提供了十來個算子,參考這里
提供一個面向?qū)ο箫L(fēng)格的自定義算子的方法,供進(jìn)階用戶使用:
-> Demo code:?examples/demo_ga_udf.py#s6
class MyGA(GA):def selection(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, :] # next generationreturn self.Chromranking = ranking.rankingdemo_func = lambda x: x[0] ** 2 + (x[1] - 0.05) ** 2 + (x[2] - 0.5) ** 2 my_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)特性2: GPU 加速
GPU加速功能還比較簡單,將會在 1.0.0 版本大大完善。?
有個 demo 已經(jīng)可以在現(xiàn)版本運(yùn)行了:?https://github.com/guofei9987/scikit-opt/blob/master/examples/demo_ga_gpu.py
特性3:斷點(diǎn)繼續(xù)運(yùn)行
例如,先跑10代,然后在此基礎(chǔ)上再跑20代,可以這么寫:
from sko.GA import GAfunc = lambda x: x[0] ** 2 ga = GA(func=func, n_dim=1) ga.run(10) ga.run(20)快速開始
1. 差分進(jìn)化算法
Step1:定義你的問題,這個demo定義了有約束優(yōu)化問題?
-> Demo code:?examples/demo_de.py#s1
Step2: 做差分進(jìn)化算法?
-> Demo code:?examples/demo_de.py#s2
2. 遺傳算法
第一步:定義你的問題?
-> Demo code:?examples/demo_ga.py#s1
第二步:運(yùn)行遺傳算法?
-> Demo code:?examples/demo_ga.py#s2
第三步:用 matplotlib 畫出結(jié)果?
-> Demo code:?examples/demo_ga.py#s3
2.2 遺傳算法用于旅行商問題
GA_TSP?針對TSP問題重載了?交叉(crossover)、變異(mutation)?兩個算子
第一步,定義問題。?
這里作為demo,隨機(jī)生成距離矩陣. 實(shí)戰(zhàn)中從真實(shí)數(shù)據(jù)源中讀取。
-> Demo code:?examples/demo_ga_tsp.py#s1
import numpy as np from scipy import spatial import matplotlib.pyplot as pltnum_points = 50points_coordinate = np.random.rand(num_points, 2) # generate coordinate of points distance_matrix = spatial.distance.cdist(points_coordinate, points_coordinate, metric='euclidean')def cal_total_distance(routine):'''The objective function. input routine, return 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)])第二步,調(diào)用遺傳算法進(jìn)行求解?
-> Demo code:?examples/demo_ga_tsp.py#s2
第三步,畫出結(jié)果:?
-> Demo code:?examples/demo_ga_tsp.py#s3
3. 粒子群算法
(PSO, Particle swarm optimization)
3.1 帶約束的粒子群算法
第一步,定義問題?
-> Demo code:?examples/demo_pso.py#s1
第二步,做粒子群算法?
-> Demo code:?examples/demo_pso.py#s2
第三步,畫出結(jié)果?
-> Demo code:?examples/demo_pso.py#s3
↑see?examples/demo_pso.py
3.2 不帶約束的粒子群算法
-> Demo code:?examples/demo_pso.py#s4
pso = PSO(func=demo_func, dim=3) fitness = pso.run() print('best_x is ', pso.gbest_x, 'best_y is', pso.gbest_y)4. 模擬退火算法
(SA, Simulated Annealing)
4.1 模擬退火算法用于多元函數(shù)優(yōu)化
第一步:定義問題?
-> Demo code:?examples/demo_sa.py#s1
第二步,運(yùn)行模擬退火算法?
-> Demo code:?examples/demo_sa.py#s2
第三步,畫出結(jié)果
-> Demo code:?examples/demo_sa.py#s3
另外,scikit-opt 還提供了三種模擬退火流派: Fast, Boltzmann, Cauchy. 更多參見?more sa
4.2 模擬退火算法解決TSP問題(旅行商問題)
第一步,定義問題。(我猜你已經(jīng)無聊了,所以不黏貼這一步了)
第二步,調(diào)用模擬退火算法?
-> Demo code:?examples/demo_sa_tsp.py#s2
第三步,畫出結(jié)果
-> Demo code:?examples/demo_sa_tsp.py#s3
咱還有個動畫?
↑參考代碼?examples/demo_sa_tsp.py
5. 蟻群算法
蟻群算法(ACA, Ant Colony Algorithm)解決TSP問題
-> Demo code:?examples/demo_aca_tsp.py#s2
from sko.ACA import 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()6. 免疫優(yōu)化算法
(immune algorithm, IA)
-> Demo code:?examples/demo_ia.py#s2
7. 人工魚群算法
人工魚群算法(artificial fish swarm algorithm, AFSA)
-> Demo code:?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, step=0.5, visual=0.3,q=0.98, delta=0.5) best_x, best_y = afsa.run() print(best_x, best_y)?
?
原文鏈接
本文為阿里云原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。
總結(jié)
以上是生活随笔為你收集整理的一个易用、易部署的Python遗传算法库的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深入浅出FlatBuffers原理
- 下一篇: 实现阿里云容器镜像服务反向访问代理