Python scipy實現(xiàn)差分進化算法
差分進化算法
差分進化算法是廣義的遺傳算法的一種,核心思想是變異,具體原理可見:Python實現(xiàn)差分進化算法,本文將要介紹的則是著名的scipy庫中對差分進化算法的實現(xiàn)。
在scipy.optimize中實現(xiàn)了差分進化算法,其函數(shù)的封裝形式為
scipy.optimize.differential_evolution(func, bounds, args=(), strategy='best1bin', maxiter=1000, popsize=15, tol=0.01, mutation=(0.5, 1), recombination=0.7, seed=None, callback=None, disp=False, polish=True, init='latinhypercube', atol=0, updating='immediate', workers=1, constraints=(), x0=None, *, integrality=None, vectorized=False)
其中,只有func和bound為必選參數(shù),代表將要優(yōu)化的函數(shù)和解的范圍。由于differential_evolution太長,后文統(tǒng)一用加粗的de表示。
func:格式為func(x, *args)的函數(shù),其中args即為de中輸入的args
bounds為隨機數(shù)的生成范圍
strategy為變異策略
maxiter 最大代數(shù)
popsize 總體大小
tol 容忍度
atol 絕對容忍度
mutation 突變常數(shù),當為元組**(a,b)時,表示突變常數(shù)是a,b**之間的隨機數(shù)
recombination 交叉常數(shù)
seed 隨機數(shù)種子,設置之后可保證結果的可復現(xiàn)性
disp 為True時可輸出迭代信息
callback 算法執(zhí)行完成后的迭代函數(shù)
polish 為True時,在迭代的最后,會調(diào)用L-BFGS-B算法對最優(yōu)參數(shù)進一步優(yōu)化
變異策略是差分進化算法的核心,在de函數(shù)中,共提供了12種方案:
| 向量選擇方式 | bin | exp |
|---|---|---|
| best | best1bin,best2bin | best2exp, best1exp |
| rand | rand1bin,rand2bin | rand1exp, rand2exp |
| randtobest | randtobest1bin | randtobest1exp, |
| currenttobest | currenttobest1bin | currenttobest1exp |
向量選擇方式,選擇的是在哪個向量的基礎上進行變異,best表示在當前最佳樣本上變異;rand表示隨機選擇個體進行變異;current-to-best表示對父個體進行偏向最佳值的修正,然后在此基礎上進行變異;同理,rand-to-best表示在隨機個體上進行偏向最佳值的修正,然后再變異。
bin和exp為隨機數(shù)的生成方案,前者表示生成二項分布隨機數(shù),后者表示指數(shù)分布隨機數(shù)。
中間的數(shù)字表示用于產(chǎn)生突變的個體數(shù)。
測試
接下來,測試一下
import numpy as np
from scipy.optimize import differential_evolution as de
def test(xs):
_sum = 0.0
for i in range(len(xs)):
_sum = _sum + np.cos((xs[i]*i)/5)*(i+1)
return _sum
bounds = [[-15,15] for _ in range(5)]
ret = de(test, bounds)
msg = f"全局最小值" + ", ".join([f"{x:.4f}" for x in ret.x])
msg += f"\nf(x)={ret.fun:.4f}"
print(msg)結果為
全局最小值-1.6584, -15.0000, -7.8540, -5.2360, -3.9270
f(x)=-12.9800
到此這篇關于Python scipy實現(xiàn)差分進化算法的文章就介紹到這了,更多相關Python scipy內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python的反射函數(shù)與內(nèi)省工具深入解析
這篇文章主要為大家介紹了Python的反射函數(shù)與內(nèi)省工具深入解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-06-06
Python實戰(zhàn)之屏幕錄制功能的實現(xiàn)
屏幕錄制,即屏幕捕獲,是指將計算機屏幕上的活動記錄下來,生成視頻文件,本文 主要為大家介紹了如何使用Python實現(xiàn)這一功能,希望對大家有所幫助2025-03-03
Python?創(chuàng)建或讀取?Excel?文件的操作代碼
Excel是一種常用的電子表格軟件,廣泛應用于金融、商業(yè)和教育等領域,本文介紹Python?創(chuàng)建或讀取?Excel?文件的操作代碼,感興趣的朋友一起看看吧2023-09-09
Python任意字符串轉(zhuǎn)16, 32, 64進制的方法
今天小編就為大家分享一篇Python任意字符串轉(zhuǎn)16, 32, 64進制的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06
python 如何用urllib與服務端交互(發(fā)送和接收數(shù)據(jù))
這篇文章主要介紹了python 如何用urllib與服務端交互(發(fā)送和接收數(shù)據(jù)),幫助大家更好的理解和學習使用python,感興趣的朋友可以了解下2021-03-03
tensorflow 獲取所有variable或tensor的name示例
今天小編就為大家分享一篇tensorflow 獲取所有variable或tensor的name示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01

