NLopt中的無導數演算法

2021-10-24 09:18:15 字數 4435 閱讀 1498

無導數區域性最優演算法

(本文所涉及各量皆為c風格,即包含的標頭檔案是nlopt.h而非nlopt.hpp

首先說一下nlopt中演算法的命名規則,c風格的命名規則為nlopt__***x,其中g/l代表全域性最優與區域性最優,n/d代表無導數與有導數。例如nlopt_ln_cobyla則表示無導數區域性最優的cobyla演算法。

這裡的導數是我們算完之後填入

if

(grad)

中的,但是在很多情況下,當問題很複雜時,很難求解出其導數,這個時候就需要使用無導數的演算法。

這種演算法的命名為nlopt_gn_***x。最簡單的方法就是在編譯器中輸入nlopt_gn_,然後它會自己彈出來有哪些演算法,乙個乙個試,看哪個滿足自己的要求即可:)。

direct指的是dividing rectangles演算法。

首先是基本的nlopt_gn_directnlopt_gn_direct_l。其中nlopt_gn_direct將更多的精力放在了全域性,而nlopt_gn_direct_l演算法在區域性的表現會更好,其適用於沒有過多區域性最小值的函式。

其次是nlopt_gn_direct_l_rand,該變體加入了一點隨機性以幫助確定將哪個維度二等分。

由於direct演算法將各約束縮放為超立方體(與正方體類似,只是正方體為三維,而超立方體為指定維度),因此所有維度的搜尋權重是相同的。如果你要搜尋的空間與超立方體相差甚遠,則更適合用direct的變體nlopt_gnl_direct_noscal,nlopt_gn_direct_l_noscalnlopt_gn_direct_l_rand_noscal

同時,還可以使用基於原始的fortran語言寫的nlopt演算法nlopt_gn_orig_direct,nlopt_gn_orig_direct_l,在不同的情況下,這兩個的表現可能會更好,不過也可能會變差,需要實際嘗試。

crs演算法有點像遺傳演算法,它倆都是從一群隨機種群點開始,通過啟發式規則來隨機進化這些點。

crs的初始種群大小在n個維度上預設為10×(n+1),但這可以通過nlopt_set_population函式來改變;初始總體必須至少是n+1。同時,該演算法只支援有界約束問題。

具備區域性突變的crs演算法在nlopt中的名字為nlopt_gn_crs2_lm

mlsl都是一種「多啟動」演算法:它通過從隨機的或低差異的起始點執行一系列區域性優化(使用一些其他的區域性優化演算法)來工作。mlsl是有區別的,但是「聚類」啟發式幫助它避免重複搜尋相同的區域性最優解,並有一些理論保證在有限數量的區域性最小化中找到所有的區域性最優解。

mlsl的本地搜尋部分可以使用nlopt中的任何其他演算法,可以使用基於梯度(d)或無梯度演算法(n)。本地搜尋使用由nlopt_opt_set_local_optimizer設定的導數/非導數演算法。

基於lds的mlsl演算法被指定為nlopt_g_mlsl_lds,而原始的非lds原始mlsl(使用偽隨機數,目前通過mersenne twister演算法)由nlopt_g_mlsl表示。在這兩種情況下,都必須通過nlopt_opt_set_local_optimizer指定本地優化演算法(可以是基於梯度的,也可以是無衍生的)。

注意:如果使用者沒有設定停止容忍度,mlsl預設為ftol_rel=10−15,xtol_rel=10−7用於區域性搜尋。請注意,為這些本地搜尋設定乙個相對較大的容錯,執行mlsl,然後在最後執行另乙個容錯較低的本地優化(使用mlsl結果作為起點),將最優值「清除」到高精度,這是完全合理的。

預設情況下,mlsl的每次迭代都取樣4個隨機的新試驗點,但是這可以通過nlopt_set_population函式進行更改。

該演算法只支援有界約束的問題。

stogo是一種全域性優化演算法,其系統地把搜尋空間(必須是有界約束)分成小的超矩形(通過一種分支界定技術),然後通過乙個基於梯度的區域性搜尋演算法(一種bfgs變體)進行搜尋,可選地包括一些隨機性(因此「sto」代表「隨機」)。

stogo是用c++編寫的,這意味著只有在編譯啟用c++演算法才能包含它,在這種情況下(在unix上)必須鏈結到-lnlopt_cxx而不是-lnlopt

stogo在nlopt中由nlopt_gd_stogo指定,或nlopt_gd_stogo_rand指定其包含隨機性的變體。

該演算法只支援有界約束的問題。

(經本人試驗,該演算法在沒有約束的多維線性問題中表現良好,推薦使用)

該進化策略基於突變規則(具有對數正態步長更新和指數平滑)和微分變異(類似於nelder - meadist的更新規則)的組合。對於沒有非線性約束的問題,適應度排序簡單地通過目標函式進行,但當包含非線性約束時,採用runarsson和yao提出的隨機排序。isres的種群大小在n個維度中預設為20×(n+1),但這可以通過nlopt_set_population函式進行更改。

該方法除了支援約束外,還支援任意的非線性不等式和等式約束,並且在nlopt中指定為nlopt_gn_isres

這是一種改進的全域性優化進化演算法,該演算法只支援邊界約束,不支援非線性約束。在nlopt中指定為nlopt_gn_esch

在無導數區域性最優演算法中,目前只有cobyla演算法支援任意非線性不等式與等式約束,其他演算法只支援有界約束或無約束問題。(但是,通過與增廣拉格朗日方法相結合,它們中的任何乙個都可以應用於非線性約束問題。)

當使用區域性無導數演算法時,需要考慮的是優化器必須以某種方式決定初始步長。預設情況下,nlopt選擇這個初始步長,但這可能並不總是最好的選擇。如果不合適的話,可以修改初始步長。

該演算法通過n維n+1點的單純形構造目標函式和約束的連續線性逼近,並在每一步的信賴區域中優化這些逼近。

nlopt的版本在幾個方面進行了輕微的修改。首先,合併了所有的nlopt終止條件;其次,我們新增了對邊界約束的顯式支援(儘管原始的cobyla可以將邊界約束處理為線性約束,但它有時會採取違反邊界約束的步驟)。第三,我們允許cobyla增加信任區域半徑,如果**的改進是近似正確的和單純形是ok的,遵循乙個建議,在sas手冊的proc nlp似乎提高收斂速度。第四,我們在cobyla演算法中偽隨機化單純形步驟,通過避免不小心採取不能改善條件的步驟來提高魯棒性(這種情況有時似乎在主動約束中發生);然而,演算法仍然是確定性的(使用確定性種子)。此外,我們還支援不同引數的初始步長大小不相等(通過簡單的內部調整引數與初始步長成比例),這在不同引數具有非常不同的尺度時非常重要。

底層的cobyla**只支援不等式約束,然而等式約束被自動轉換為不等式約束對,因此在這個演算法中也可以使用等式約束。

該演算法在nlopt中指定為nlopt_ln_cobyla

因為bobyqa構造了目標的二次逼近,所以對於不能二次可微的目標函式,它可能執行得很差。

nlopt bobyqa介面支援不同引數中不相等的初始步長(通過簡單的內部調整引數與初始步長成比例),當不同引數具有相差懸殊的尺度時這點非常重要。

該演算法在nlopt中指定為nlopt_ln_bobyqa,且在很大程度上取代了下面的newuoa演算法,newuoa演算法是powell提出的相同思想的早期版本。

在nlopt中指定為nlopt_ln_praxis

該演算法最初是為無約束優化設計的。在nlopt中,在實踐中通過在違反約束時返回無窮大(inf)的簡單權能來「實現」繫結約束(這是自動完成的—您不必在自己的函式中這樣做)。如果您有約束條件,那麼最好使用cobyla或bobyqa。

在nlopt中指定為nlopt_ln_neldermead

這種方法很簡單,而且經久不衰,儘管後來發現它在一些函式中完全不收斂(在一些例子中,它可能收斂到不是區域性最小值的點)。坊間證據表明,即使在嘈雜和/或不連續的目標函式中,它也經常表現良好。然而,作者更推薦subplex方法(下面)。

在nlopt中指定為nlopt_ln_sbplx

subplex (nelder-mead的一種變體,它在子空間序列上使用nelder-mead)聲稱比最初的nelder-mead更有效、更可靠,同時保留了後者的設施,但目標不連續,根據我的經驗,這些說法在很多情況下似乎都是正確的。(然而,並沒有什麼證據表明subplex是全域性收斂的,也許它會在一些目標上失敗,比如nelder-mead)

導數中的恆成立問題 不含參

1.證明 x text x ln x x 1 geqslant 0 2.證明 text x 1 ln x 1 geqslant x 2 3.證明 x 2 text x 4 x ln x 0 4.證明 frac 2 cdot text x x ln x x 2 0 1.已知 t 是函式 f x x 2...

非阻塞 無鎖 無等待演算法的核心與區別

color blue size xx large 非阻塞 size color 阻塞是作業系統層面的概念,發生阻塞的準確含義為 當前執行上下文通過呼叫作業系統的介面,使自己進入等待某一事件發生的狀態。在這種等待中,該上下文將被從作業系統的排程佇列中移除,而將不獲得任何cpu執行時間。直到等待的事件發...

有監督演算法和無監督演算法的理解

無監督和有監督的理解方法有很多,主要可以從以下幾方面來理解 1 無監督與監督學習的區別在於乙個無教學值,乙個有教學值。但是,個人認為他們的區別在於無監督學習一般是採用聚簇等演算法來分類不同樣本。而監督學習一般是利用教學值與實際輸出值產生的誤差,進行誤差反向傳播修改權值來完成網路修正的。但是無監督學習...