日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯網營銷解決方案
Python中的盆地跳躍(BasinHopping)優(yōu)化

 Python中文社區(qū)(ID:python-china)

成都創(chuàng)新互聯公司堅持“要么做到,要么別承諾”的工作理念,服務領域包括:做網站、網站設計、企業(yè)官網、英文網站、手機端網站、網站推廣等服務,滿足客戶于互聯網時代的渠縣網站設計、移動媒體設計的需求,幫助企業(yè)找到有效的互聯網解決方案。努力成為您成熟可靠的網絡建設合作伙伴!

盆地跳躍是一種全局優(yōu)化算法。它是為解決化學物理學中的問題而開發(fā)的,盡管它是一種適用于具有多個最優(yōu)條件的非線性目標函數的有效算法。

在本教程中,您將發(fā)現盆地跳躍全局優(yōu)化算法。完成本教程后,您將知道:

  •  盆地跳躍優(yōu)化是一種全局優(yōu)化,它使用隨機擾動來跳躍盆地,并使用局部搜索算法來優(yōu)化每個盆地。
  •  如何在python中使用盆地跳躍優(yōu)化算法API。
  •  使用流域跳躍來解決具有多個最優(yōu)解的全局優(yōu)化問題的示例。

教程概述

本教程分為三個部分:他們是:

  •  盆地跳躍優(yōu)化
  •  盆地跳躍API
  •  盆地跳躍的例子 局部最優(yōu)的多峰優(yōu)化 具有多個全局最優(yōu)的多峰優(yōu)化

盆地跳躍優(yōu)化

Basin Hopping是為化學物理領域開發(fā)的一種全局優(yōu)化算法。局部優(yōu)化是指旨在為單變量目標函數定位最優(yōu)值或在認為存在最優(yōu)值的區(qū)域中運行的優(yōu)化算法。而全局優(yōu)化算法旨在將單個全局最優(yōu)定位在潛在的多個局部(非全局)最優(yōu)之中。David Wales和Jonathan Doye在1997年的論文中描述了“盆地跳躍”,題目是“通過盆地跳躍進行的全局優(yōu)化和包含110個原子的Lennard-Jones團簇的最低能級結構”。

該算法包括循環(huán)兩個步驟,一個是好的候選解的擾動,另一個是將本地搜索應用于被擾動的解。

擾動允許搜索算法跳到搜索空間的新區(qū)域,并可能找到導致不同最優(yōu)值的新盆地,例如技術名稱中的“跳槽”。局部搜索使算法可以遍歷新盆地達到最佳狀態(tài)。新的最優(yōu)值可以作為新的隨機擾動的基礎,否則將被丟棄。保留新解決方案的決策是由具有“溫度”變量的隨機決策函數控制的,這與模擬退火非常相似。溫度根據算法的迭代次數進行調整。這樣可以在高溫時在運行的早期就接受任意解決方案,而更嚴格的策略是在低溫時在搜索的后期僅接受質量更好的解決方案。這樣,該算法非常類似于具有不同(擾動)起始點的迭代局部搜索。該算法運行指定的迭代次數或函數求值,并且可以多次運行以提高對找到全局最優(yōu)值或找到相對好的解決方案的信心。

現在,我們已經從較高的層次熟悉了基本的跳變算法,下面讓我們看一下Python中用于盆地跳變的API。

盆地跳躍API

在Python中,可以通過Basinhopping()SciPy函數來進行盆地跳躍。   

 
 
 
 
  1. # perform the basin hopping search  
  2. result = basinhopping(objective, pt)  

另一個重要的超參數是通過“ niter”參數運行搜索集的迭代次數,默認為100??梢詫⑵湓O置為數千次迭代或更多次迭代。 

 
 
 
 
  1. # perform the basin hopping search  
  2. result = basinhopping(objective, pt, niter=10000) 

可以通過“步長”控制應用于候選解的擾動量,該“步長”定義了在問題域的邊界范圍內施加的最大變化量。默認情況下,將其設置為0.5,但應在域中將其設置為合理的值,以允許搜索找到新的盆地。例如,如果搜索空間的合理范圍是-100到100,則步長為5.0或10.0個單位可能是合適的(例如,域的2.5%或5%)。 

 
 
 
 
  1. # perform the basin hopping search  
  2. result = basinhopping(objective, pt, stepsize=10.0) 

默認情況下,使用的本地搜索算法是“ L-BFGS-B”算法??梢酝ㄟ^將“ minimizer_kwargs”參數設置為關鍵字為“ method”且值作為要使用的本地搜索算法的名稱(例如“ nelder-mead”)的目錄來更改此設置??梢允褂肧ciPy庫提供的任何本地搜索算法。 

 
 
 
 
  1. # perform the basin hopping search  
  2. result = basinhopping(objective, pt, minimizer_kwargs={'method':'nelder-mead'})  

搜索的結果是一個OptimizeResult對象,可以在其中像字典一樣訪問屬性??梢酝ㄟ^“成功”或“消息”鍵來訪問搜索的成功與否。

可以通過“ nfev”訪問功能評估的總數,并且可以通過“ x”鍵訪問為搜索找到的最佳輸入。

現在,我們已經熟悉了Python中的盆地跳躍API,下面我們來看一些可行的示例。

盆地跳躍的例子

在本節(jié)中,我們將研究在多模態(tài)目標函數上使用盆地跳躍算法的一些示例。多峰目標函數是具有多個最優(yōu)值的函數,例如全局最優(yōu)值和許多局部最優(yōu)值,或者具有相同目標函數輸出的多個全局最優(yōu)值。我們將在這兩個函數上查看流域跳躍的示例。

局部最優(yōu)的多峰優(yōu)化

Ackley函數是目標函數的一個示例,該目標函數具有單個全局最優(yōu)值和多個局部最優(yōu)值,可能會在其中陷入局部搜索。因此,需要全局優(yōu)化技術。這是一個二維目標函數,其全局最佳值為[0,0],其值為0.0。下面的示例實現了Ackley,并創(chuàng)建了一個三維表面圖,顯示了全局最優(yōu)值和多個局部最優(yōu)值。 

 
 
 
 
  1. # ackley multimodal function  
  2.   from numpy import arange  
  3.   from numpy import exp  
  4.   from numpy import sqrt  
  5.   from numpy import cos  
  6.   from numpy import e  
  7.   from numpy import pi  
  8.   from numpy import meshgrid  
  9.   from matplotlib import pyplot  
  10.   from mpl_toolkits.mplot3d import Axes3D  
  11.   # objective function  
  12.   def objective(x, y):  
  13.       return -20.0 * exp(-0.2 * sqrt(0.5 * (x**2 + y**2))) - exp(0.5 * (cos(2 * pi * x) + cos(2 * pi * y))) + e + 20  
  14.   # define range for input  
  15.   r_min, r_max = -5.0, 5.0  
  16.   # sample input range uniformly at 0.1 increments  
  17.   xaxis = arange(r_min, r_max, 0.1)  
  18.   yaxis = arange(r_min, r_max, 0.1)  
  19.   # create a mesh from the axis  
  20.   x, y = meshgrid(xaxis, yaxis)  
  21.   # compute targets  
  22.   results = objective(x, y)  
  23.   # create a surface plot with the jet color scheme  
  24.   figure = pyplot.figure()  
  25.   axis = figure.gca(projection='3d')  
  26.   axis.plot_surface(x, y, results, cmap='jet')  
  27.   # show the plot  
  28.   pyplot.show() 

運行示例將創(chuàng)建Ackley函數的表面圖,以顯示大量的局部最優(yōu)值。

我們可以將盆地跳躍算法應用于Ackley目標函數。

在這種情況下,我們將使用從-5到5之間的輸入域繪制的隨機點開始搜索。 

 
 
 
 
  1. # define the starting point as a random sample from the domain  
  2. pt = r_min + rand(2) * (r_max - r_min) 

我們將使用0.5的步長,200次迭代和默認的本地搜索算法。經過一番嘗試和錯誤后,才選擇此配置。 

 
 
 
 
  1. # perform the basin hopping search  
  2. result = basinhopping(objective, pt, stepsize=0.5, niter=200) 

搜索完成后,它將報告搜索狀態(tài),執(zhí)行的迭代次數以及通過評估發(fā)現的最佳結果。 

 
 
 
 
  1. # summarize the result  
  2.  print('Status : %s' % result['message'])  
  3.  print('Total Evaluations: %d' % result['nfev'])  
  4.  # evaluate solution  
  5.  solution = result['x']  
  6.  evaluation = objective(solution)  
  7.  print('Solution: f(%s) = %.5f' % (solution, evaluation)) 

結合在一起,下面列出了將盆地跳躍應用于Ackley目標函數的完整示例。   

 
 
 
 
  1. # basin hopping global optimization for the ackley multimodal objective function  
  2.    from scipy.optimize import basinhopping  
  3.    from numpy.random import rand  
  4.    from numpy import exp  
  5.    from numpy import sqrt  
  6.    from numpy import cos  
  7.    from numpy import e  
  8.    from numpy import pi  
  9.    # objective function  
  10.    def objective(v):  
  11.        x, y = v 
  12.        return -20.0 * exp(-0.2 * sqrt(0.5 * (x**2 + y**2))) - exp(0.5 * (cos(2 * pi * x) + cos(2 * pi * y))) + e + 20  
  13.    # define range for input  
  14.    r_min, r_max = -5.0, 5.0  
  15.    # define the starting point as a random sample from the domain  
  16.    pt = r_min + rand(2) * (r_max - r_min)  
  17.    # perform the basin hopping search  
  18.    result = basinhopping(objective, pt, stepsize=0.5, niter=200) 
  19.    # summarize the result  
  20.    print('Status : %s' % result['message'])  
  21.    print('Total Evaluations: %d' % result['nfev'])  
  22.    # evaluate solution  
  23.    solution = result['x']  
  24.    evaluation = objective(solution)  
  25.    print('Solution: f(%s) = %.5f' % (solution, evaluation)) 

運行示例將執(zhí)行優(yōu)化,然后報告結果。

注意:由于算法或評估程序的隨機性,或者數值精度的不同,您的結果可能會有所不同。考慮運行該示例幾次并比較平均結果。

在這種情況下,我們可以看到該算法將最優(yōu)值定位為非常接近零的輸入,并且目標函數的評估值實際上為零。我們可以看到,該算法的200次迭代產生了86,020個函數求值。 

 
 
 
 
  1. Status: ['requested number of basinhopping iterations completed successfully']  
  2.  Total Evaluations: 86020  
  3.  Solution: f([ 5.29778873e-10 -2.29022817e-10]) = 0.00000 

具有多個全局最優(yōu)的多峰優(yōu)化

Himmelblau函數是具有多個全局最優(yōu)值的目標函數的示例。

具體來說,它具有四個最優(yōu)值,并且每個都有相同的目標函數評估。這是一個二維目標函數,其全局最佳值分別為[3.0,2.0],[-2.805118、3.113112],[-3.779310,-3.283186],[3.584428,-1.848126]。這意味著全局優(yōu)化算法的每次運行都可能找到不同的全局最優(yōu)值。下面的示例實現了Himmelblau并創(chuàng)建了一個三維表面圖,以直觀地說明目標函數。 

 
 
 
 
  1. # himmelblau multimodal test function  
  2. from numpy import arange  
  3. from numpy import meshgrid  
  4. from matplotlib import pyplot  
  5. from mpl_toolkits.mplot3d import Axes3D  
  6. # objective function  
  7. def objective(x, y):  
  8.     return (x**2 + y - 11)**2 + (x + y**2 -7)**2  
  9. # define range for input  
  10. r_min, r_max = -5.0, 5.0  
  11. # sample input range uniformly at 0.1 increments  
  12. xaxis = arange(r_min, r_max, 0.1)  
  13. yaxis = arange(r_min, r_max, 0.1)  
  14. # create a mesh from the axis  
  15. x, y = meshgrid(xaxis, yaxis)  
  16. # compute targets  
  17. results = objective(x, y)  
  18. # create a surface plot with the jet color scheme  
  19. figure = pyplot.figure()  
  20. axis = figure.gca(projection='3d')  
  21. axis.plot_surface(x, y, results, cmap='jet')  
  22. # show the plot  
  23. pyplot.show() 

運行示例將創(chuàng)建Himmelblau函數的表面圖,該圖將四個全局最優(yōu)值顯示為深藍色盆地。

我們可以將盆地跳躍算法應用于Himmelblau目標函數。

與前面的示例一樣,我們將使用從-5到5之間的輸入域繪制的隨機點開始搜索。

我們將使用0.5的步長,200次迭代和默認的本地搜索算法。搜索結束時,我們將報告最佳位置的最佳輸入。 

 
 
 
 
  1. # basin hopping global optimization for the himmelblau multimodal objective function  
  2.   from scipy.optimize import basinhopping  
  3.   from numpy.random import rand  
  4.   # objective function  
  5.   def objective(v):  
  6.       x, y = v  
  7.       return (x**2 + y - 11)**2 + (x + y**2 -7)**2  
  8.   # define range for input  
  9.   r_min, r_max = -5.0, 5.0  
  10.   # define the starting point as a random sample from the domain  
  11.   pt = r_min + rand(2) * (r_max - r_min)  
  12.   # perform the basin hopping search  
  13.   result = basinhopping(objective, pt, stepsize=0.5, niter=200)  
  14.   # summarize the result  
  15.   print('Status : %s' % result['message'])  
  16.   print('Total Evaluations: %d' % result['nfev'])  
  17.   # evaluate solution  
  18.   solution = result['x']  
  19.   evaluation = objective(solution)  
  20.   print('Solution: f(%s) = %.5f' % (solution, evaluation)) 

運行示例將執(zhí)行優(yōu)化,然后報告結果。

在這種情況下,我們可以看到該算法在[3.0,2.0]處確定了一個最佳值。

我們可以看到,該算法的200次迭代產生了7,660個函數評估。 

 
 
 
 
  1. Status : ['requested number of basinhopping iterations completed successfully']  
  2.  Total Evaluations: 7660  
  3.  Solution: f([3. 1.99999999]) = 0.00000 

如果我們再次運行搜索,則可能期望找到其他全局最優(yōu)值。

例如,下面,我們可以看到一個最佳值位于[-2.805118,3.131312]處,與之前的運行不同。 

 
 
 
 
  1. Status : ['requested number of basinhopping iterations completed successfully']  
  2. Total Evaluations: 7636  
  3. Solution: f([-2.80511809 3.13131252]) = 0.00000  

分享題目:Python中的盆地跳躍(BasinHopping)優(yōu)化
文章來源:http://www.5511xx.com/article/ccopdcc.html