ドキュメンテーション センター

  • 評価版
  • 製品アップデート

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

ktrlink: KNITRO ライブラリへのインターフェイス

ktrlink とは

ktrlink は最適化を実行するために、Ziena 最適化の KNITRO® ライブラリを呼び出します。ktrlink は制約なし問題と制約付き問題に対応できます。ktrlink を使用するには、Ziena Optimization, Inc. (http://www.ziena.com/) から KNITRO ライブラリを購入しなければなりません。

他の Optimization Toolbox™ の関数と同じように ktrlink を使用してください。

ktrlink の構文は fmincon の構文と同じです。主な違いは以下になります。

  • ktrlink には KNITRO ライブラリのオプション入力を受け入れることができるように追加オプションがあります。

  • ktrlink は、KNITRO ソフトウェアがヘッセ行列や勾配を出力しないため、それらの戻り値を取得することはできません。

  • スパース行列の表現は KNITRO ソフトウェアと MATLAB® 間で異なります。

また、出力される多くのフラグとメッセージは KNITRO ライブラリから直接返されるため、fmincon のものとは異なります。

インストールと設定

MATLAB と KNITRO ソフトウェアのシステム要求は異なる可能性があります。ktrlink を使用する前に、両製品のシステム要求を確認してください。最新の MATLAB プラットフォームと今後の対応に関しては以下を参照してください。

http://www.mathworks.com/support/sysreq/roadmap.html

Optimization Toolbox の Version 6 は KNITRO ライブラリの Version 6、7、8 に対応します。KNITRO ライブラリの他のバージョンに関して質問がある場合は、Ziena Optimization, Inc. (http://www.ziena.com/) に問い合わせてください。

ktrlink を使用するために、以下の手順に従ってシステムを構成します。

  1. MATLAB と KNITRO ライブラリをシステムにインストールします。

  2. システム パスを設定して KNITRO ライブラリをインクルードします (「KNITRO ライブラリをインクルードするためのシステム パスの設定」を参照してください)。MATLAB を起動する前にこの手順を実行するようにしてください。

  3. MATLAB を起動します。

KNITRO ライブラリをインクルードするためのシステム パスの設定

ktrlink を使用するには、KNITRO バイナリ ファイル (libknitro.solibknitro.dylibknitro.dll または同様のファイル) の場所を MATLAB に知らせる必要があります。システム環境変数を設定してこれを行います。以下のシステム レベルのコマンドを入力します。<file_absolute_path> を KNITRO ライブラリの絶対パス名に置き換えます。

  • Linux:

    setenv LD_LIBRARY_PATH <file_absolute_path>:$LD_LIBRARY_PATH
  • Macintosh:

    1. [ターミナル] ([アプリケーション]、[ユーティリティ]) を起動します。

    2. シェルの決定:

      echo $SHELL
    3. パスの設定:

      • シェルが bash の場合:

        export DYLD_LIBRARY_PATH=<file_absolute_path>:$DYLD_LIBRARY_PATH
      • シェルが cshtcsh の場合:

        setenv DYLD_LIBRARY_PATH=<file_absolute_path>:$DYLD_LIBRARY_PATH
    4. [ターミナル]matlab を入力して MATLAB を起動します (アイコンをクリックして MATLAB を起動すると、KNITRO バイナリ ファイルへのパスを失う可能性があります)。

    オプション: パスの永久的な設定:

    • bash では、手順 3export 行を $HOME/.profile に追加します。

    • cshtcsh では、手順 3setenv 行を $HOME/.cshrc に追加します。

  • Windows:

    1. Windows デスクトップで [マイ コンピューター] (Windows XP) または [コンピューター] (Vista または Windows 7) を右クリックします。

    2. [プロパティ] を選択します。

    3. [詳細設定] (Windows XP) タブまたは [システムの詳細設定] (Vista または Windows 7) をクリックします。

    4. [環境変数] をクリックします。

    5. [システム環境変数][Path] 変数を編集し、KNITRO ライブラリ フォルダーを追加します。

MATLAB を起動して以下のコマンドを実行し、インストールが成功したことを確認します。

[x fval] = ktrlink(@(x)cos(x),1)

エラー メッセージが表示された場合は、システム パスを確認して KNITRO ライブラリがこのパス上にあることを確認します。正しくインストールされた場合、ktrlink から x = 3.1416, fval = -1 で終わる長いメッセージが返されます。

ktrlink を使用した最適化

  1. この例は 非線形制約 の例と同じ制約関数を使用します。制約関数は、放物線の上の領域と楕円内部の共有部分を示します。

    function [c ceq gradc gradceq]=ellipseparabola(x)
    % Inside the ellipse bounded by (-3<x<3),(-2<y<2)
    % Above the line y=x^2-1
    c(1) = x(1)^2/9 + x(2)^2/4 - 1;% ellipse
    c(2) = x(1)^2 - x(2) - 1;% parabola
    ceq = [];
    
    if nargout > 2
        gradc = [2*x(1)/9, 2*x(1);...
                 x(2)/2, -1];
        gradceq = [];
    end
  2. 目的関数は傾いた sinh です。

    function [f gradf]=sinhtilt(x)
    
    A=[2,1;1,2];
    m=[1,1];
    f=sinh(x'*A*x/100) + sinh(m*A*x/10);
    
    if nargout > 1
        gradf=cosh(x'*A*x/100)*(A*x)/50;
        gradf=gradf+cosh(m*A*x/10)*[3;3]/10;
    end
  3. ktrlink が反復を表示し、目的関数と制約関数に含まれる勾配を使用して計算するようにオプションを設定します。

    ktropts = optimoptions('ktrlink','Display','iter',...
              'GradConstr','on','GradObj','on');
  4. ktropts オプションを使用し、[0;0] から最適化を実行します。

    [x fval flag] = ktrlink(@sinhtilt,[0;0],...
               [],[],[],[],[],[],@ellipseparabola,ktropts)

KNITRO ソフトウェアが次の出力を返します。

======================================
  Trial Ziena License (NOT FOR COMMERCIAL USE)
             KNITRO 8.1.0
          Ziena Optimization
======================================

KNITRO presolve eliminated 0 variables and 0 constraints.

algorithm:            1
hessopt:              2
honorbnds:            1
maxit:                10000
outlev:               4
KNITRO changing bar_switchrule from AUTO to 2.
KNITRO changing bar_murule from AUTO to 4.
KNITRO changing bar_initpt from AUTO to 2.
KNITRO changing bar_penaltyrule from AUTO to 2.
KNITRO changing bar_penaltycons from AUTO to 1.
KNITRO changing linsolver from AUTO to 2.

Problem Characteristics
-----------------------
Objective goal:  Minimize
Number of variables:                     2
    bounded below:                       0
    bounded above:                       0
    bounded below and above:             0
    fixed:                               0
    free:                                2
Number of constraints:                   2
    linear equalities:                   0
    nonlinear equalities:                0
    linear inequalities:                 0
    nonlinear inequalities:              2
    range:                               0
Number of nonzeros in Jacobian:          4
Number of nonzeros in Hessian:           3

  Iter     fCount     Objective      FeasError   OptError    ||Step||    CGits 
--------  --------  --------------  ----------  ----------  ----------  -------
       0         1   0.000000e+000  0.000e+000
       1         2  -1.701203e-001  0.000e+000  1.969e-001  4.111e-001        0
       2         3  -4.135676e-001  2.440e-001  1.356e-001  6.054e-001        0
       3         4  -3.631949e-001  2.037e-002  4.434e-002  1.423e-001        0
       4         5  -3.608513e-001  3.776e-003  1.680e-002  8.094e-002        0
       5         6  -3.604610e-001  1.216e-003  1.494e-003  4.870e-002        0
       6         7  -3.601203e-001  2.694e-006  1.630e-004  3.329e-003        0
       7         8  -3.601196e-001  0.000e+000  4.840e-007  1.241e-005        0

EXIT: Locally optimal solution found.

Final Statistics
----------------
Final objective value               = -3.60119566305939e-001
Final feasibility error (abs / rel) =   0.00e+000 / 0.00e+000
Final optimality error  (abs / rel) =   4.84e-007 / 4.84e-007
# of iterations                     =          7 
# of CG iterations                  =          0 
# of function evaluations           =          8
# of gradient evaluations           =          8
Total program time (secs)           =       0.097 (     0.218 CPU time)
Time spent in evaluations (secs)    =       0.067

===============================================================================

x =
   -0.5083
   -0.7416

fval =
   -0.3601

flag =
           0

    メモ:   終了フラグは ktrlinkfmincon では異なった意味をもちます。KNITRO ライブラリのフラグ 0 は 1 次の最適性条件が満たされたことを意味します。fmincon で相当するフラグは 1 です。出力に関する詳細は、http://www.ziena.com/ で KNITRO ドキュメンテーションを参照してください。

オプションの設定

ktrlink は 2 つのオプション入力を受け入れます。1 つは fmincon の形式で、もう 1 つは KNITRO 形式です。一方または両方のタイプのオプションを使用できます。両方のタイプのオプションを使用する場合、MATLAB は次の 4 つの fmincon 形式のオプションのみを読み込みます。すなわち、HessFcnHessMultHessPattern および JacobPattern です。KNITRO オプションは fmincon 形式のオプションをオーバーライドします。

KNITRO オプションを使用するには、オプションのテキスト ファイルを作成します。この形式は KNITRO ドキュメンテーションに記載されています。たとえば、knitropts という名前の KNITRO オプション ファイルと ktropts という名前の fmincon 形式の options 構造体がある場合、ktrlink を以下のように呼び出すことで両方を渡すことができます。

[x fval] = ktrlink(@bigtoleft,[-1,-1,-1],...
           [],[],[],[],[],[],@twocone,ktropts,'knitropts')

knitropts が別のフォルダーにある場合はファイルにパスを渡します。以下に例を示します。

[x fval] = ktrlink(@bigtoleft,[-1,-1,-1],...
            [],[],[],[],[],[],@twocone,ktropts,...
            'C:\Documents\Knitro\knitropts')

以下は fmincon 形式のオプションがどのように KNITRO オプションにマッピングされているかを示します。

fmincon のオプションKNITRO オプション既定値
Algorithmalgorithm'interior-point'
AlwaysHonorConstraintshonorbounds'bounds'
Displayoutlev'none'
FinDiffTypegradopt'forward'
GradConstrgradopt'off'
GradObjgradopt'off'
HessFcnhessopt[ ]
MaxItermaxit10000
TolFunopttol1.00E–06
TolXxtol1.00E–15
HessianLBFGS ペアhessopt, lmsize'bfgs'
HessMulthessopt[ ]
HessPattern [ ]
InitBarrierParambar_initmu0.1
InitTrustRegionRadiusdeltasqrt(numberOfVariables)
JacobPattern [ ]
MaxProjCGItermaxcgit2*(numberOfVariables–numberOfEqualities)
ObjectiveLimitobjrange–1.0E20
ScaleProblemscale'obj-and-constr'
SubProblemAlgorithmalgorithm'ldl-factorization'
TolConfeastol1.00E-06

    メモ:   KNITRO ライブラリは、目的関数とすべての非線形制約の勾配、または勾配なしのいずれかを同時に渡すことができます。そのため GradObj = 'on'GradConstr = 'off' の設定は矛盾します。矛盾したオプションを渡そうとすると、ktrlink は警告を出力し、すべての勾配が渡されていないものとして処理します。

スパース行列の考慮事項

ラグランジュ行列のヘッセ行列がスパースである場合や非線形制約のヤコビ行列がスパースである場合、ktrlink はスパース構造を利用して最適化を高速化し、少ないメモリを利用して計算を行います。

ktrlink は他の MATLAB 関数とは異なる方法でスパース行列を処理します。スパース行列を使用する場合、ktrlink は非線形制約のヤコビ行列とヘッセ行列のスパース パターンを必要とします。次の 2 節は非線形制約のヤコビ行列とヘッセ行列のスパース パターンの詳細を説明します。

非線形制約のスパース パターン

制約付きヤコビ行列のスパース パターンは行列です。JacobPattern オプションとして行列を渡します。行列の構造は以下になります。

c は m の非線形不等式制約ベクトルを示し、ceq は m2 の非線形等式制約のベクトルを示すものとします。n 次元ある場合、ヤコビ行列は (m + m2) 行 n 列の行列です。ヤコビ行列パターン J は

です。言い換えると、ヤコビ行列パターンの i 番目の行は ci の勾配に対応します。不等式勾配は等式勾配の上にあります (これらの行数は少ないです)。

ヤコビ行列のパターンで最も重要なことは全体がゼロであるかどうかです。単精度数、倍精度数、論理値の true や false を渡すことができます。また、MATLAB のスパース行列としてスパース パターンを渡すことができます。制約が大規模なスパース行列である場合は、パターンをスパース行列として渡した方が効率的です。線形制約行列は自動的にスパース行列として渡されます。

制約関数で計算された制約勾配は、ヤコビ行列パターンの転置行列になります。制約勾配の形式に関する情報は 非線形制約 を参照してください。

ヘッセ行列のスパース パターン

ヘッセ行列は以下のラグランジュ行列の 2 次導関数の行列です。

ゼロと非ゼロ要素のスパース行列または非スパース行列として行列 H を与えます。この要素は単精度数、倍精度数、論理値の true や false にすることができます。

ヘッセ行列は対称行列です。上三角行列のパターンまたは行列全体のパターンを渡すことができます。

この情報は役に立ちましたか?