Keyword: 非線形計画
概要
本サンプルは非線形計画を行うFortranによるサンプルプログラムです。 本サンプルは以下に示される非線形関数を最小化する解を求めて出力します。
※本サンプルはnAG Fortranライブラリに含まれるルーチン e04ucf() のExampleコードです。本サンプル及びルーチンの詳細情報は e04ucf のマニュアルページをご参照ください。
ご相談やお問い合わせはこちらまで
入力データ
(本ルーチンの詳細はe04ucf のマニュアルページを参照)このデータをダウンロード |
E04UCF Example Program Data 4 1 2 :Values of N, NCLIN and NCNLN 1.0 1.0 1.0 1.0 :End of matrix A 1.0 1.0 1.0 1.0 -1.0E+25 -1.0E+25 25.0 :End of BL 5.0 5.0 5.0 5.0 20.0 40.0 1.0E+25 :End of BU 1.0 5.0 5.0 1.0 :End of X
- 1行目はタイトル行で読み飛ばされます。
- 2行目に変数の数(n=4)、線形制約の数(nclin=1)と非線形制約の数(ncnln=2)を指定しています。
- 3行目に一般線形制約の係数(a)を指定しています。
- 4行目に変数の下限と制約の下限(bl)を指定しています。
- 5行目に変数の上限と制約の上限(bu)を指定しています。
- 6行目にxの初期値を指定しています。
出力結果
(本ルーチンの詳細はe04ucf のマニュアルページを参照)この出力例をダウンロード |
E04UCF Example Program Results *** E04UCF Parameters ---------- Linear constraints..... 1 Variables.............. 4 Nonlinear constraints.. 2 Infinite bound size.... 1.00E+20 COLD start............. Infinite step size..... 1.00E+20 EPS (machine precision) 1.11E-16 Step limit............. 2.00E+00 Hessian................ NO Linear feasibility..... 1.05E-08 Crash tolerance........ 1.00E-02 Nonlinear feasibility.. 1.05E-08 Optimality tolerance... 3.26E-12 Line search tolerance.. 9.00E-01 Function precision..... 4.37E-15 Derivative level....... 3 Monitoring file........ -1 Verify level........... 0 Major iterations limit. 50 Major print level...... 10 Minor iterations limit. 50 Minor print level...... 0 Workspace provided is IWORK( 17), WORK( 185). To solve problem we need IWORK( 17), WORK( 185). Verification of the constraint gradients. ----------------------------------------- The constraint Jacobian seems to be ok. The largest relative error was 2.29E-07 in constraint 2 Verification of the objective gradients. ---------------------------------------- The objective gradients seem to be ok. Directional derivative of the objective 8.15250000E-01 Difference approximation 8.15249734E-01 Maj Mnr Step Merit Function Norm Gz Violtn Cond Hz 0 4 0.0E+00 1.738281E+01 7.1E-01 1.2E+01 1.0E+00 1 1 1.0E+00 1.703169E+01 4.6E-02 1.9E+00 1.0E+00 2 1 1.0E+00 1.701442E+01 2.1E-02 8.8E-02 1.0E+00 3 1 1.0E+00 1.701402E+01 3.1E-04 5.4E-04 1.0E+00 4 1 1.0E+00 1.701402E+01 7.0E-06 9.9E-08 1.0E+00 5 1 1.0E+00 1.701402E+01 1.1E-08 4.6E-11 1.0E+00 Exit from NP problem after 5 major iterations, 9 minor iterations. Varbl State Value Lower Bound Upper Bound Lagr Mult Slack V 1 LL 1.00000 1.00000 5.00000 1.088 . V 2 FR 4.74300 1.00000 5.00000 . 0.2570 V 3 FR 3.82115 1.00000 5.00000 . 1.179 V 4 FR 1.37941 1.00000 5.00000 . 0.3794 L Con State Value Lower Bound Upper Bound Lagr Mult Slack L 1 FR 10.9436 None 20.0000 . 9.056 N Con State Value Lower Bound Upper Bound Lagr Mult Slack N 1 UL 40.0000 None 40.0000 -0.1615 -3.5264E-11 N 2 LL 25.0000 25.0000 None 0.5523 -2.8791E-11 Exit E04UCF - Optimal solution found. Final objective value = 17.01402
- 14行目に変数の数が出力されています。
- 16行目に線形制約の数と非線形制約の数が出力されています。
- 8〜23行目に以下に示すプログラムのオプション引数が出力されています。
Linear constraints 線形制約の数。 Variables 変数の数。 Nonlinear constraints 非線形制約の数。 Infinte bound size 無限の境界。この値以上の上限は+∞と見なされます。またこの値を負に反転させた値以下の下限は−∞と見なされます。 Cold start 初期のワーキングセットがどのように選ばれるかを示しています。"Cold"は変数や制約の値に基づいて初期のワーキングセットが選ばれていることを意味します。 Infinite step size 無限解へのステップと見なされる変数の変化の大きさ。 EPS (machine precision) マシンの精度。 Step limit 行探索の最初のステップでの変数の変化の最大値。 Hessian 上三角行列Rの内容を制御します。"NO"はRが行列HQのコレスキー因子を含むことを意味しています。 Linear feasibility 実行可能解での許容可能な最大の線形制約違反。 Crash tolerance 初期のワーキングセットに含まれる不等式制約が境界値のこの範囲内にあることを示しています。 Nonlinear feasibility 実行可能解での許容可能な最大の非線形制約違反。 Optimality tolerance 最後の反復で解を近似する際の正確さ。 Line search tolerance 反復時に探索方向に進むステップがメリット関数の最小値を近似する際の正確さ。 Function precision 問題関数の正確さの度合い。 Derivative level どの導関数がユーザ提供サブルーチンで提供されているかを示します。"3"は目的関数の勾配と制約のヤコビ行列が提供されていることを意味します。 Monitoring file モニタリング情報が出力されるファイルの論理装置番号。"-1"はモニタリング情報が出力されないことを意味します。 Verify level 勾配のチェックのレベルを示します。"3"は、目的関数と制約の両方の勾配をチェックすることを意味します。 Major iterations limit 大きな反復の最大反復数。 Major print level 大きな反復によって生成される結果出力のレベル。"10"は最終解と各反復の結果を出力することを意味します。 Minor iterations limit 小さな反復の最大反復数。 Minor print level 小さな反復によって生成される結果の出力のレベル。"0"は何も出力しないことを意味します。 - 32〜34行目には制約の勾配の検証結果が出力されています。
- 32行目には制約のヤコビ行列に問題ないことが出力されています。
- 34行目には制約の最大の相対誤差が出力されています。
- 41〜44行目には目的関数の勾配の検証結果が出力されています。
- 41行目には目的関数の勾配に問題ないことが出力されています。
- 43行目には目的関数の勾配の方向導関数が出力されています。
- 44行目には差分近似が出力されています。
- 47〜53行目には以下が出力されています。
Maj 大きな反復の回数。 Mnr 実行可能解生成フェーズや最適化フェーズで必要とされる小さな反復の回数。 Step 探索方向に進んだステップ幅。 Merit Function ラグランジュメリット関数の値。 Norm Gz 予測される勾配のユークリッド・ノルム。 Violtn 違反した制約の残差のユークリッド・ノルム。 Cond Hz 予測されるヘッセ近似行列の条件数の下限。 - 55〜56行目にはNP問題を解くのに5回の大きな反復と9回の小さな反復が行われたことが示されています。
- 59〜64行目には以下が出力されています。
Varbl 変数を示す"V"、インデックス。 State 変数の状態(LLは下限であることを意味し、FRは下限も上限もワーキングセットにはないことを意味します)。 Value 最後の反復の変数の値。 Lower Bound 下限。 Upper Bound 上限。 Lagr Mult 関連する境界制約のラグランジュ乗数。 Slack スラック(変数の値と上限/下限の近いほうとの差)。 - 67から69行目には以下が出力されています。
L Con 線形制約を示す"L"、インデックス。 State 線形制約の状態(FRは下限も上限もワーキングセットにはないことを意味します)。 Value 最後の反復の制約の値。 Lower Bound 下限。 Upper Bound 上限。 Lagr Mult 関連する境界制約のラグランジュ乗数。 Slack スラック(制約の値と上限/下限の近いほうとの差)。 - 72〜75行目には以下が出力されています。
N Con 非線形制約を示す"N"、インデックス。 State 非線形制約の状態(ULは上限であることを意味し、LLは下限であることを意味します)。 Value 最後の反復の制約の値。 Lower Bound 下限。 Upper Bound 上限。 Lagr Mult 関連する境界制約のラグランジュ乗数。 Slack スラック(制約の値と上限/下限の近いほうとの差)。 - 77行目にNPの最適解が見つかったことが示されています。
- 79行目にNPの最終的な目的関数値が出力されています。
ソースコード
(本ルーチンの詳細はe04ucf のマニュアルページを参照)
※本サンプルソースコードは科学技術・統計計算ライブラリである「nAG Fortranライブラリ」のルーチンを呼び出します。
サンプルのコンパイル及び実行方法
このソースコードをダウンロード |
! E04UCF Example Program Text ! Mark 23 Release. nAG Copyright 2011. MODULE e04ucfe_mod ! E04UCF Example Program Module: ! Parameters and User-defined Routines ! .. Use Statements .. USE nag_library, ONLY : nag_wp ! .. Implicit None Statement .. IMPLICIT NONE ! .. Parameters .. INTEGER, PARAMETER :: nin = 5, nout = 6 CONTAINS SUBROUTINE objfun(mode,n,x,objf,objgrd,nstate,iuser,ruser) ! Routine to evaluate objective function and its 1st derivatives. ! .. Implicit None Statement .. IMPLICIT NONE ! .. Scalar Arguments .. REAL (KIND=nag_wp), INTENT (OUT) :: objf INTEGER, INTENT (INOUT) :: mode INTEGER, INTENT (IN) :: n, nstate ! .. Array Arguments .. REAL (KIND=nag_wp), INTENT (INOUT) :: objgrd(n), ruser(*) REAL (KIND=nag_wp), INTENT (IN) :: x(n) INTEGER, INTENT (INOUT) :: iuser(*) ! .. Executable Statements .. IF (mode==0 .OR. mode==2) THEN objf = x(1)*x(4)*(x(1)+x(2)+x(3)) + x(3) END IF IF (mode==1 .OR. mode==2) THEN objgrd(1) = x(4)*(2.0E0_nag_wp*x(1)+x(2)+x(3)) objgrd(2) = x(1)*x(4) objgrd(3) = x(1)*x(4) + 1.0E0_nag_wp objgrd(4) = x(1)*(x(1)+x(2)+x(3)) END IF RETURN END SUBROUTINE objfun SUBROUTINE confun(mode,ncnln,n,ldcj,needc,x,c,cjac,nstate,iuser,ruser) ! Routine to evaluate the nonlinear constraints and their 1st ! derivatives. ! .. Implicit None Statement .. IMPLICIT NONE ! .. Scalar Arguments .. INTEGER, INTENT (IN) :: ldcj, n, ncnln, nstate INTEGER, INTENT (INOUT) :: mode ! .. Array Arguments .. REAL (KIND=nag_wp), INTENT (OUT) :: c(ncnln) REAL (KIND=nag_wp), INTENT (INOUT) :: cjac(ldcj,n), ruser(*) REAL (KIND=nag_wp), INTENT (IN) :: x(n) INTEGER, INTENT (INOUT) :: iuser(*) INTEGER, INTENT (IN) :: needc(ncnln) ! .. Executable Statements .. IF (nstate==1) THEN ! First call to CONFUN. Set all Jacobian elements to zero. ! Note that this will only work when 'Derivative Level = 3' ! (the default; see Section 11.2). cjac(1:ncnln,1:n) = 0.0E0_nag_wp END IF IF (needc(1)>0) THEN IF (mode==0 .OR. mode==2) THEN c(1) = x(1)**2 + x(2)**2 + x(3)**2 + x(4)**2 END IF IF (mode==1 .OR. mode==2) THEN cjac(1,1) = 2.0E0_nag_wp*x(1) cjac(1,2) = 2.0E0_nag_wp*x(2) cjac(1,3) = 2.0E0_nag_wp*x(3) cjac(1,4) = 2.0E0_nag_wp*x(4) END IF END IF IF (needc(2)>0) THEN IF (mode==0 .OR. mode==2) THEN c(2) = x(1)*x(2)*x(3)*x(4) END IF IF (mode==1 .OR. mode==2) THEN cjac(2,1) = x(2)*x(3)*x(4) cjac(2,2) = x(1)*x(3)*x(4) cjac(2,3) = x(1)*x(2)*x(4) cjac(2,4) = x(1)*x(2)*x(3) END IF END IF RETURN END SUBROUTINE confun END MODULE e04ucfe_mod PROGRAM e04ucfe ! E04UCF Example Main Program ! .. Use Statements .. USE nag_library, ONLY : e04ucf, nag_wp USE e04ucfe_mod, ONLY : confun, nin, nout, objfun ! .. Implicit None Statement .. IMPLICIT NONE ! .. Local Scalars .. REAL (KIND=nag_wp) :: objf INTEGER :: i, ifail, iter, lda, ldcj, ldr, & liwork, lwork, n, nclin, ncnln, & sda, sdcjac ! .. Local Arrays .. REAL (KIND=nag_wp), ALLOCATABLE :: a(:,:), bl(:), bu(:), c(:), & cjac(:,:), clamda(:), objgrd(:), & r(:,:), work(:), x(:) REAL (KIND=nag_wp) :: ruser(1) INTEGER, ALLOCATABLE :: istate(:), iwork(:) INTEGER :: iuser(1) ! .. Intrinsic Functions .. INTRINSIC max ! .. Executable Statements .. WRITE (nout,*) 'E04UCF Example Program Results' FLUSH (nout) ! Skip heading in data file READ (nin,*) READ (nin,*) n, nclin, ncnln liwork = 3*n + nclin + 2*ncnln lda = max(1,nclin) IF (nclin>0) THEN sda = n ELSE sda = 1 END IF ldcj = max(1,ncnln) IF (ncnln>0) THEN sdcjac = n ELSE sdcjac = 1 END IF ldr = n IF (ncnln==0 .AND. nclin>0) THEN lwork = 2*n**2 + 20*n + 11*nclin ELSE IF (ncnln>0 .AND. nclin>=0) THEN lwork = 2*n**2 + n*nclin + 2*n*ncnln + 20*n + 11*nclin + 21*ncnln ELSE lwork = 20*n END IF ALLOCATE (istate(n+nclin+ncnln),iwork(liwork),a(lda,sda), & bl(n+nclin+ncnln),bu(n+nclin+ncnln),c(max(1, & ncnln)),cjac(ldcj,sdcjac),clamda(n+nclin+ncnln),objgrd(n),r(ldr,n), & x(n),work(lwork)) IF (nclin>0) THEN READ (nin,*) (a(i,1:sda),i=1,nclin) END IF READ (nin,*) bl(1:(n+nclin+ncnln)) READ (nin,*) bu(1:(n+nclin+ncnln)) READ (nin,*) x(1:n) ifail = 0 CALL e04ucf(n,nclin,ncnln,lda,ldcj,ldr,a,bl,bu,confun,objfun,iter, & istate,c,cjac,clamda,objf,objgrd,r,x,iwork,liwork,work,lwork,iuser, & ruser,ifail) END PROGRAM e04ucfe