`uncon_conjgrd_comp`から`handle_solve_bounds_foas`への移行

nAG Library for Python Example集

このページは、nAGライブラリのJupyterノートブックExampleの日本語翻訳版です。オリジナルのノートブックはインタラクティブに操作することができます。

uncon_conjgrd_compからhandle_solve_bounds_foasへの移行

このノートブックは、ソルバーuncon_conjgrd_compE04DG)からnAGライブラリのMark 27で導入されたhandle_solve_bounds_foasE04KF)へのアップグレードに必要な手順を説明しています。

使用の観点から、ソルバー間の主な違いはユーザーコールバックにあります。 uncon_conjgrd_comp目的関数勾配の評価を返すことができる単一のユーザーコールバックを持っていますが、handle_solve_bounds_foasは2つの別々のユーザーコールバックを持っています。 1つは目的関数用、もう1つは目的関数の勾配用です。

このノートブックでは、2次元のRosenbrock問題を両方のソルバーで解き、handle_solve_bounds_foasへの移行に必要な変更点を示しています。この問題の解は(1, 1)です。

# nAG 著作権 2020年。
from naginterfaces.base import utils
from naginterfaces.library import opt
import numpy as np
# E04DG ユーザーコールバックを定義する
def objfun_e04dg(mode, x, _nstate, _data=None):
    objf = (1. - x[0])**2 + 100.*(x[1] - x[0]**2)**2
    if mode == 2:
        fdx = [
            2.*x[0] - 400.*x[0]*(x[1]-x[0]**2) - 2.,
            200.*(x[1]-x[0]**2),
        ]
        return objf, fdx
    return objf, np.zeros(len(x))
# E04KFのユーザーコールバックを定義する
def objfun_e04kf(x, inform, _data=None): 
    """Return the objective function value"""
    objf = (1. - x[0])**2 + 100.*(x[1] - x[0]**2)**2
    return objf, inform

def objgrd_e04kf(x, fdx, inform, _data=None):
    """The objective's gradient. Note that fdx has to be updated IN-PLACE"""
    fdx[:] = [
        2.*x[0] - 400.*x[0]*(x[1]-x[0]**2) - 2.,
        200.*(x[1]-x[0]**2),
    ]
    return inform
# 初期推定値
x = [-1.5, 1.9]

# 省略された反復出力のために明示的なI/Oマネージャーを使用する
iom = utils.FileObjManager(locus_in_output=False)

uncon_conjgrd_compで問題を解く

comm = opt.nlp1_init('uncon_conjgrd_comp')
slv = opt.uncon_conjgrd_comp(objfun_e04dg, x, comm, io_manager=iom)
print('Solution: \n', slv.x)
<ipython-input-5-a8bdc418615c>:2: NagDeprecatedWarning: (nAG Python関数naginterfaces.library.opt.uncon_conjgrd_comp)
この関数は非推奨です。
代替として以下のアドバイスが提供されています:
代わりにhandle_solve_bounds_foasを使用してください。
詳細は https://www.nag.com/numeric/py/nagdoc_latest/replace.html を参照してください
  slv = opt.uncon_conjgrd_comp(objfun_e04dg, x, comm, io_manager=iom)

解: [1.00000676 1.00001354]

次に新しいソルバー handle_solve_bounds_foas で解きます

# 問題用の空のハンドルを作成する
nvar = len(x)
handle = opt.handle_init(nvar)

# ハンドル内で非線形目的関数を定義する
# 長さnvarの勾配ベクトルを設定する
opt.handle_set_nlnobj(handle, idxfd=list(range(1, nvar+1)))

# アルゴリズムのオプションをいくつか設定する
for option in [
        'Print Options = No',      # print Options?
        'Print Solution = Yes',    # print on the screen the solution point X
        'Print Level = 1',         # print details of each iteration (screen)
]:
    opt.handle_opt_set(handle, option)
    
# 問題を解いて解答を出力する
opt.handle_solve_bounds_foas(handle, x, objfun=objfun_e04kf, objgrd=objgrd_e04kf,
        io_manager=iom)

# ハンドルを破棄し、割り当てられたメモリを解放する
opt.handle_free(handle)
 E04KF, First order method for bound-constrained problems

 Status: converged, an optimal solution was found
 Value of the objective             2.12807E-15
 Norm of gradient                   3.67342E-08

 Primal variables:
   idx   Lower bound       Value       Upper bound
     1       -inf        1.00000E+00        inf
     2       -inf        1.00000E+00        inf
関連情報
MENU
Privacy Policy  /  Trademarks