當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python SciPy optimize.dual_annealing用法及代碼示例


本文簡要介紹 python 語言中 scipy.optimize.dual_annealing 的用法。

用法:

scipy.optimize.dual_annealing(func, bounds, args=(), maxiter=1000, minimizer_kwargs=None, initial_temp=5230.0, restart_temp_ratio=2e-05, visit=2.62, accept=-5.0, maxfun=10000000.0, seed=None, no_local_search=False, callback=None, x0=None)#

使用雙重退火求函數的全局最小值。

參數

func 可調用的

要最小化的目標函數。必須采用 f(x, *args) 的形式,其中 x 是一維數組形式的參數,而 args 是完全指定函數所需的任何其他固定參數的元組。

bounds 序列或 Bounds

變量的界限。有兩種方法可以指定邊界:

  1. Bounds 類的實例。

  2. 序列(min, max)中每個元素的對x.

args 元組,可選

完全指定目標函數所需的任何其他固定參數。

maxiter 整數,可選

全局搜索迭代的最大次數。默認值為 1000。

minimizer_kwargs 字典,可選

要傳遞給本地最小化器( minimize )的額外關鍵字參數。一些重要的選項可能是:method 用於使用最小化方法,args 用於目標函數附加參數。

initial_temp 浮點數,可選

初始溫度,使用較高的值有助於更廣泛地搜索能量景觀,允許 dual_annealing 逃離它所困的局部最小值。默認值為 5230。範圍為 (0.01, 5.e4]。

restart_temp_ratio 浮點數,可選

在退火過程中,溫度在下降,當達到initial_temp * restart_temp_ratio時,觸發重新退火過程。比率的默認值為 2e-5。範圍是 (0, 1)。

visit 浮點數,可選

訪問分布參數。默認值為 2.62。值越高,訪問分布的尾部就越重,這使得算法跳到更遠的區域。取值範圍為 (1, 3]。

accept 浮點數,可選

驗收分布參數。它用於控製接受的概率。接受參數越低,接受的概率越小。默認值為 -5.0,範圍為 (-1e4, -5]。

maxfun 整數,可選

目標函數調用次數的軟限製。如果算法處於局部搜索的中間,將超過這個數字,算法將在局部搜索完成後停止。默認值為 1e7。

seed {無,int, numpy.random.Generator numpy.random.RandomState },可選

如果種子是無(或np.random), 這numpy.random.RandomState使用單例。如果種子是一個 int,一個新的RandomState使用實例,播種種子.如果種子已經是一個Generator或者RandomState實例然後使用該實例。指定種子用於可重複的最小化。用這個種子生成的隨機數隻影響訪問分布函數和新坐標的生成。

no_local_search 布爾型,可選

如果 no_local_search 設置為 True,則將執行傳統的廣義模擬退火,而不應用局部搜索策略。

callback 可調用的,可選的

帶有簽名 callback(x, f, context) 的回調函數,將為找到的所有最小值調用該函數。 xf是最近找到的最小值的坐標和函數值,context的值在[0,1,2],含義如下:

  • 0: minimum detected in the annealing process.

  • 1: detection occurred in the local search process.

  • 2: detection done in the dual annealing process.

如果回調實現返回 True,則算法將停止。

x0 ndarray,形狀(n,),可選

單個 N-D 起點的坐標。

返回

res OptimizeResult

優化結果表示為 OptimizeResult 對象。重要的屬性是:x 解決方案數組,fun 解決方案處的函數值,以及說明終止原因的message。有關其他屬性的說明,請參見 OptimizeResult

注意

該函數實現了雙重退火優化。這種源自 [3] 的隨機方法結合了 CSA(經典模擬退火)和 FSA(快速模擬退火)[1] [2] 的推廣,以及在已接受位置上應用局部搜索的策略 [4]。 [5] 中說明了相同算法的替代實現,[6] 中提供了基準。這種方法引入了一種先進的方法來改進廣義退火過程找到的解決方案。該算法使用扭曲的Cauchy-Lorentz訪問分布,其形狀由參數 控製

其中 是人工時間。該訪問分布用於生成變量 在人工溫度 下的試跳距離

從起點出發,調用訪問分布函數後,接受概率計算如下:

其中 是接受參數。對於 ,將零接受概率分配給以下情況

人工溫度 根據

其中 是訪問參數。

參考

[1]

Tsallis C. Boltzmann-Gibbs 統計數據的可能概括。統計物理學雜誌, 52, 479-487 (1998)。

[2]

Tsallis C,Stariolo DA。廣義模擬退火。物理學 A, 233, 395-406 (1996)。

[3]

向Y,孫DY,範W,龔XG。廣義模擬退火算法及其在湯姆遜模型中的應用。物理快報 A, 233, 216-220 (1997)。

[4]

向Y,龔XG.廣義模擬退火的效率。物理評論 E, 62, 4473 (2000)。

[5]

向 Y、Gubian S、Suomela B、Hoeng J. 用於高效全局優化的廣義模擬退火:R 的GenSA 包。R 雜誌,第 5/1 卷(2013 年)。

[6]

Mullen, K. R. 統計軟件雜誌中的連續全局優化,60(6), 1 - 45, (2014)。 DOI:10.18637/jss.v060.i06

例子

以下示例是一個 10 維問題,具有許多局部最小值。涉及的函數稱為 Rastrigin (https://en.wikipedia.org/wiki/Rastrigin_function)

>>> import numpy as np
>>> from scipy.optimize import dual_annealing
>>> func = lambda x: np.sum(x*x - 10*np.cos(2*np.pi*x)) + 10*np.size(x)
>>> lw = [-5.12] * 10
>>> up = [5.12] * 10
>>> ret = dual_annealing(func, bounds=list(zip(lw, up)))
>>> ret.x
array([-4.26437714e-09, -3.91699361e-09, -1.86149218e-09, -3.97165720e-09,
       -6.29151648e-09, -6.53145322e-09, -3.93616815e-09, -6.55623025e-09,
       -6.05775280e-09, -5.00668935e-09]) # random
>>> ret.fun
0.000000

相關用法


注:本文由純淨天空篩選整理自scipy.org大神的英文原創作品 scipy.optimize.dual_annealing。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。