1. 程式人生 > >python玄學建模(2):非線性規劃

python玄學建模(2):非線性規劃

view 求解 默認 非線性 優化問題 官方 賦值 url [1]

文檔url:https://docs.scipy.org/doc/scipy-0.18.1/reference/generated/scipy.optimize.minimize.html

本文還是對scipy官方文檔的翻譯及解釋(畢竟文檔寫的那麽好),使用的函數為scipy.optimize.minimize。

函數原型為:scipy.optimize.minimize(fun, x0, args=(), method=None, jac=None, hess=None, hessp=None, bounds=None, constraints=(), tol=None, callback=None, options=None

)

下面我就簡單地介紹幾個重要參數

fun:不用想了,就是優化的目標函數;

x0:非線性優化問題的求解並不是用解析的方法進行的,而是從初始值開始進行叠代,x0就是猜測的初始值,在很大程度上決定了算法的效果。另外要註意,如果是多元函數,那麽就要將x0視為一個向量,每一個分量都要單獨賦值;

args:可選項,如果目標函數有可設定的參數,可以用這種方式傳遞進去;

method:選用的優化算法,有12種可選項,比較常用的為SLSQP(Sequential Least Squares Programming),算法種類很多,這裏也不詳細說了(其實是我自己也不怎麽清楚,亂講怕坑人);有博客已經詳細講了一部分,第一部分的鏈接:https://blog.csdn.net/zhoudi2010/article/details/54584495

但是看發表時間,2017年就沒再更新過,應該是早就鴿了......不過寫的部分內容還是挺不錯的。

bounds:用法和linprog裏面的完全一樣,可以參考我的上一篇博客;

constraints:優化的約束條件,輸入為字典組成的元組,字典主要由‘type‘和‘fun‘組成,type可選‘eq‘和‘ineq‘,分別是等式約束和不等式約束,fun理所當然就是對應的約束條件,可以為lambda函數。例如,約束x0大於min的字典可以這樣寫:{‘type‘: ‘ineq‘, ‘fun‘: lambda x: x[0] - min}(x為輸入的數組,x[0]為第一個元素)可選的還有jac和args,在此就不展開說了。

tol:設定默認的誤差閾值,低於閾值就會停止叠代,一般而言設定的越小越精確,很多優化算法都會有這一設定項。

官方文檔裏給出了一些示例,比如無約束優化:

>>> from scipy.optimize import minimize, rosen, rosen_der
>>> x0 = [1.3, 0.7, 0.8, 1.9, 1.2]
>>> res = minimize(rosen, x0, method=‘Nelder-Mead‘, tol=1e-6)
>>> res.x
array([ 1.,  1.,  1.,  1.,  1.])  

這個例子裏用到了resen函數,也就是Rosenbrock函數,經常被用來測試最優化算法的性能,當自變量為二維時,在三維空間裏繪出函數圖像為:

技術分享圖片

(圖片來自wikipedia)

不過這不是本文要討論的重點,總而言之此處的參數rosen就是一個函數,和自己def的沒有本質區別,使用方法也是一樣的。

然後輸出結果就是優化得出的解。

有約束的規劃文檔中也給出了例子:

>>> from scipy.optimize import minimize
>>> fun = lambda x: (x[0] - 1)**2 + (x[1] - 2.5)**2
>>> cons = ({‘type‘: ‘ineq‘, ‘fun‘: lambda x:  x[0] - 2 * x[1] + 2},
...         {‘type‘: ‘ineq‘, ‘fun‘: lambda x: -x[0] - 2 * x[1] + 6},
...         {‘type‘: ‘ineq‘, ‘fun‘: lambda x: -x[0] + 2 * x[1] + 2})
>>> bnds = ((0, None), (0, None))
>>> res = minimize(fun, (2, 0), method=‘SLSQP‘, bounds=bnds,
...                constraints=cons)

該優化問題的理論解為(1.4, 1.7)。

以上就是minimize函數的基本用法。

python玄學建模(2):非線性規劃