最適化セミナーのご案内

3.4 実行例

 さて,サンプルコードuseSolveQPの実行モジュールを作成して実行してみましょう.

  • VC++
    プロジェクト「useSolveQP」を選択後,VC++のメニューの「プロジェクト」から「スタートアッププロジェクトに設定」を選び,プロジェクトを選択します.なおuseSolveQPの構成は「Release」に設定してあります.
    続いて「ビルド」メニューから「useSolveQPのビルド」:

    を選択するとuseSolveQP.cppがコンパイル,Numerical Optimizerのライブラリとリンクされて,実行モジュールのuseSolveQP.exeが作成されます注1.引数としてknapsack.txtを与えるように「プロジェクト」→「プロパティ」→「構成プロパティ」→「デバッグ」の項目で,「コマンド引数」に「knapsack.txt」と入力します.

    つづいて「デバッグ」メニューから

    と実行すると,実行経過表示ウィンドウが現れ,その中に以下のような出力が得られます.solveLPがコールされて出力が成されます.

    [About Numerical Optimizer]
    MSI Numerical Optimizer x.x.x  (NLP/LP/IP/SDP module)
             <with META-HEURISTICS engine "wcsp"/"rcpsp">
             <with GLOBAL-OPTIMIZATION add-on "global">
             <with DERIVATIVE-FREE-OPTIMIZATION add-on "DFO">
            , Copyright (C) 1991 NTT DATA Mathematical Systems Inc.
    
    [Problem and Algorithm]
    PROBLEM_NAME                                          anon.LP
    NUMBER_OF_VARIABLES                                        10
    (#INTEGER/DISCRETE)                                        10
    NUMBER_OF_FUNCTIONS                                         2
    PROBLEM_TYPE                                     MAXIMIZATION
    METHOD                                                SIMPLEX
    
    [Progress]
    <preprocess begin>.........<preprocess end>
    <iteration begin>
    
    #1                  lo:          -0                  time:  0.0s:mem(MB)=3/6:ava
    il(MB)=1991/1991
                                                         llen:0 #prob:0 #piv:0
    
    === begin wcsp ===
    # (hard/soft) = 0/111
    # iteration = 1000
    # time =  0.00 (s), succ = 1
    === end wcsp ===
    #2                  lo:         242                  time:  0.1s:mem(MB)=2/6:ava
    il(MB)=1991/1991
                                                         llen:0 #prob:0 #piv:0
    
    ----- breakdown -----
    BB        :     0.0(sec), call=1, succ=2
    wcsp      :     0.0(sec), call=1, succ=1
    _____ breakdown _____
    
    <iteration end>
    
    [Result]
    STATUS                                                OPTIMAL
    VALUE_OF_OBJECTIVE                                        242
    SIMPLEX_PIVOT_COUNT                                         0
    RESIDUAL                                                    1
    ELAPSED_TIME(sec.)                                       0.07
    SOLUTION_FILE                                      solver.sol
    optimalValue = 2.4200000000e+002
    X:
    [  1] 1.000e+000 [  2] 0.000e+000 [  3] 0.000e+000 [  4] 0.000e+000
    [  5] 0.000e+000 [  6] 1.000e+000 [  7] 1.000e+000 [  8] 1.000e+000
    [  9] 0.000e+000 [ 10] 1.000e+000
    F:
    [  1] 1.210e+002
    続行するには何かキーを押してください . . .
    上に挙げた内容はNumerical Optimizerからの求解に関する出力です.問題の変数の数(NUMBER_OF_VARIABLES)や目的関数の値(VALUE_OF_OBJECTIVE)を知ることができます.Numerical Optimizerの標準出力の内容については「Numerical Optimizer/SIMPLEマニュアル」(別冊)をご覧ください.

    Numerical Optimizerの出力を抑制するには,

    nuoptParam myParam; // 宣言

    として,パラメータを宣言したのち,

    myParam.outputMode = "silent";

    とします.また,デフォルトで出力されるNumerical Optimizerの求解レポートである解ファイルsolver.solの出力を抑制するには

    myParam.outfilename = "_NULL_";

    と設定し,solveQP()の最初の引数として渡します.useSolveQP.cpp(.cc)の以下のコメントを取ると,その設定になり,Numerical Optimizerからの出力が抑制されて,useSolveQPが出力する表示のみになります.

           ..
           nuoptParam myParam;
        // Numerical Optimizerの出力と解ファイルの出力を抑制する.
        myParam.outputMode = "silent";
        myParam.outfilename = "_NULL_";
    if ( nQelem || nQCelem ) { // 2次の係数があるのならsolveQP
         qpres = solveQP(&myParam
                 ,n,m
         ..
    再びビルドメニューから

    とすると,コンパイルが自動的に実行されます.

  • UNIX

    Prompt% make useSolveQP

    とすると,useSolveQP.ccがコンパイル,Numerical OptimizerのライブラリとリンクされてuseSolveQPが作成されます.引数としてknapsack.txtを与えてロードモジュールを実行します.
    次は,ナップサック問題に対応するknapsack.txtをこの設定で実行したときの出力です.

    Prompt% ./useSolveQP knapsack.txt
    ...
    optimalValue = 2.4200000000e+002
    X:
    [  1] 1.000e+000 [  2] 0.000e+000 [  3] 0.000e+000 [  4] 0.000e+000
    [  5] 0.000e+000 [  6] 1.000e+000 [  7] 1.000e+000 [  8] 1.000e+000
    [  9] 0.000e+000 [ 10] 1.000e+000
    F:
    [  1] 1.210e+002
    prompt%
  • Windows・UNIX共通
    knapsack.txtと同じ場所に別のuseSolveQP.cpp(.cc)の入力ファイル

    (VC++版):

    (Numerical Optimizerのインストール場所)\samples\appにあるzipファイルを解凍した中にあるuseSolveQP\qp312.txt

    (UNIX版):

    (Numerical Optimizerのインストール場所)/userapp/qp312.txt

    があります.このデータは二次計画問題で

    \[\begin{array}{@{}lll@{}}
  \mbox{最小化・最大化} & \displaystyle \sum_{j} c_{j} \cdot x_{j} + \frac{1}{2} \sum_{(j,k)} Q_{j,k} \cdot x_{j} \cdot x_{k} & \displaystyle \begin{array}{@{}l@{}} j=1,\cdots,m \\ k=1,\cdots,m \end{array} \\
  \mbox{条件}           & \displaystyle cu_{i} \ge \sum_{j} A_{i,j} \cdot x_{j} + \frac{1}{2} \sum_{j,k} Q_{j,k}^{i} \cdot x_{j} \cdot x_{k} \ge cl_{i} & \displaystyle \begin{array}{@{}l@{}} i=1,\cdots,n \\ j=1,\cdots,m \\ k=1,\cdots,m \end{array} \\
                        & bu_{j} \ge x_j \ge bl_{j} & j=1,\cdots,m\\
                        & (x_{j} \in Z & j\in I)
\end{array}\]

    という定式で,次のように設定したものに対応します.2変数,3制約の問題で,制約式には二次の項はありません.

    \[\begin{array}{@{}l@{}}
  c = ( \begin{matrix} -3 & 1 \end{matrix} ) \\
  \displaystyle Q = \left( \begin{matrix} 11 & 0 \\ 0 & 22 \end{matrix} \right),\ Q^{i} = 0 \\
  cu = ( \begin{matrix} 1000 & 1000 & 1000 \end{matrix} ) \\
  cl = ( \begin{matrix} -1 & -2 & 2 \end{matrix} ) \\
  \displaystyle A = \left( \begin{matrix} -1 & 0.1 \\ -0.2 & -1 \\ 2 & 1 \end{matrix} \right) \\
  bu = ( \begin{matrix} 1 & 2 \end{matrix} ) \\
  bl = ( \begin{matrix} 0 & 0 \end{matrix} )
\end{array}\]

    (VC++版):
    VC++のGUIで「プロジェクト」→「設定」→「デバッグ」タブで,「プログラムの引数」を

    qp312.txt

    として再び実行してみてください.

    (UNIX版):

    prompt% ./useSolveQP qp312.txt

    とします.

    今度はuseSolveQPsolveQPをコールして,次のような解が出力されます.
    optimalValue = 2.3181818248e+000
    X:
    [  1] 9.394e-001 [  2] 1.212e-001
    F:
    [  1] -9.273e-001 [  2] -3.091e-001 [  3] 2.000e+000
    次のデータ(Windows版のみ):

    (Numerical Optimizerのインストール場所)\samples\appにあるzipファイルを解凍した中にあるuseSolveQP\qp312I.txt

    はこの二次計画問題の変数を連続変数ではなく,整数変数という指定をつけたもので,二次の整数計画問題となります.これを入力として実行すると

    optimalValue = 2.5000000000e+000
    X:
    [  1] 1.000e+000 [  2] 0.000e+000
    F:
    [  1] -1.000e+000 [  2] -2.000e-001 [  3] 2.000e+000

    のような解が出力されます.
    さらに,次のデータ(Windows版のみ):

    (Numerical Optimizerのインストール場所)\samples\appにあるzipファイルを解凍した中にあるuseSolveQP\hs23.txt

    は制約条件の中に二次式が含まれる問題となります.なお,このデータは[1]のNo.23を記述したものであり,次のような設定に対応します.

    \[\begin{array}{@{}l@{}}
  c = ( \begin{matrix} 0 & 0 \end{matrix} ) \\
  \displaystyle Q = \left( \begin{matrix} 2 & 0 \\ 0 & 2 \end{matrix} \right),\\
  Q^{1} = \left( \begin{matrix} 0 & 0 \\ 0 & 0 \end{matrix} \right),\ Q^{2} = \left( \begin{matrix} 2 & 0 \\ 0 & 2 \end{matrix} \right),\ Q^{3} = \left( \begin{matrix} 18 & 0 \\ 0 & 2 \end{matrix} \right),\ Q^{4} = \left( \begin{matrix} 2 & 0 \\ 0 & 0 \end{matrix} \right),\ Q^{5} = \left( \begin{matrix} 0 & 0 \\ 0 & 2 \end{matrix} \right)\\
  cu = ( \begin{matrix} \infty & \infty & \infty & \infty & \infty \end{matrix} ) \\
  cl = ( \begin{matrix} 1 & 1 & 9 & 0 & 0 \end{matrix} ) \\
  \displaystyle A = \left( \begin{matrix} 1 & 1 \\ 0 & 0 \\ 0 & 0 \\ 0 & -1 \\ -1 & 0 \end{matrix} \right) \\
  bu = ( \begin{matrix} 50 & 50 \end{matrix} ) \\
  bl = ( \begin{matrix} -50 & -50 \end{matrix} )
\end{array}\]

    これを入力として実行すると

    optimalValue = 2.0000000009e+000
    X:
    [  1] 1.000e+000 [  2] 1.000e+000
    F:
    [  1] 2.000e+000 [  2] 2.000e+000 [  3] 1.000e+001 [  4] 2.133e-010
    [  5] 2.133e-010

    のような解が出力されます.

注1)「ビルド」メニューが表示されていない場合は「ツール」→「設定」にある「上級者用の設定」をクリックしてください(Visual C++ 2010 Express Editionの場合).


 

 

上に戻る