mpec08.gms : 단순 MPEC 고유 솔루션 LB가 정수 var와 일치함

설명

몇 가지 유용한 기능을 갖춘 매우 간단한 MPEC 모델:
 a) 독특한 해결책이 있다
 b) 일치하는 모든 변수는 하한입니다.
 c) 정수 var를 포함합니다.

기고자: Steve Dirkse, 2013년 9월

소형 모델 유형 :MPEC


카테고리 : 크레이지 슬롯 테스트 라이브러리


메인 파일 : mpec08.gms

$title 단순 MPEC 고유 솔루션 LB는 정수 var와 일치합니다(MPEC08,SEQ=619)

$onText
  몇 가지 유용한 기능을 갖춘 매우 간단한 MPEC 모델:
   a) 독특한 해결책이 있다
   b) 일치하는 모든 변수는 하한입니다.
   c) 정수 var를 포함합니다.

기고자: Steve Dirkse, 2013년 9월
$offText

$설정되지 않은 경우 TESTTOL $set TESTTOL 1e-4

스칼라
  톨 / %TESTTOL% /
  c1 / -1.5 /
  c2 / -3 /
  ;
양의 변수 x1, x2;
정수 변수 y / lo 0, 최대 10 /;
자유 변수 z;
방정식 f1, f2, o;

f1 .. 2*x1 + x2 + y + c1 =N= 0;
f2 .. x1 + 2*x2 + y + c2 =G= 0;
o .. sqr(x1-2) + sqr(x2-2) + sqr(y-2) =E= z;

모델 m / f1.x1, f2.x2, o /;

스칼라 r1, r2;
파일 로그 / '' /;

* -----------------------------------------------------------------

rmpec min z를 사용하여 m을 해결합니다.

if (m.solvestat = %solveStat.capabilityProblems%),
  abort$[m.modelstat <> %modelStat.noSolutionReturned%] '잘못된 상태 코드',
    m.solvestat, m.modelstat;
  abort.noerror '해결 방법이 없습니다. 더 이상 확인할 필요가 없습니다.';
그렇지 않으면
  abort$[not((m.solvestat = %solveStat.normalCompletion%) 및 (m.modelstat = %modelStat.optimal% 또는
              m.modelstat = %modelStat.locallyOptimal% 또는 m.modelstat = %modelStat.feasibleSolution%))] '잘못된 상태 코드',
    m.solvestat, m.modelstat;
;

r1 = 2*x1.l + x2.l + y.l + c1;
r2 = x1.l + 2*x2.l + y.l + c2;
putclose 로그
 ' ' /
 '** RMPEC: y = ', y.L:6:2 /
 'F1 :=', r1:6:2, ' perp x1 ', x1.lo:8:2, ' <= ', x1.L:6:2 ' <= ', x1.up:6:2 /
 'F2 :=', r2:6:2, ' perp x2 ', x2.lo:8:2, ' <= ', x2.L:6:2 ' <= ', x2.up:6:2 /
 ' ' / ;

abort$(abs(x1.l-0 ) > tol) 'var x1.l은 0이어야 합니다.' , x1.l;
abort$(abs(x2.l-0.8) > tol) 'var x2.l은 0.8이어야 합니다.', x2.l;
abort$(abs( y.l-1.4) > tol) 'var y.l은 1.4여야 합니다.', y.l;
abort$(abs( z.l-5.8) > tol) 'var z.l은 5.8이어야 합니다.', z.l;

abort$(abs(f1.l-0.7) > tol) 'equ f1.l은 0.7이어야 합니다.', f1.l;
abort$(abs(f2.l-3.0) > tol) 'equ f2.l은 3.0이어야 합니다.', f2.l;
abort$(abs( o.l-0 ) > tol) 'equ o.l은 0이어야 합니다.' , o.l;

* -----------------------------------------------------------------

mpec min z를 사용하여 m을 해결합니다.

if (m.solvestat = %solveStat.capabilityProblems%),
  abort$[m.modelstat <> %modelStat.noSolutionReturned%] '잘못된 상태 코드',
    m.solvestat, m.modelstat;
  abort.noerror '해결 방법이 없습니다. 더 이상 확인할 필요가 없습니다.';
그렇지 않으면
  abort$[not(m.solvestat = %solveStat.normalCompletion%) 및
              [m.modelstat = %modelStat.optimal% 또는
               m.modelstat = %modelStat.locallyOptimal% 또는
               m.modelstat = %modelStat.integerSolution%
              ]  ] '잘못된 상태 코드', m.solvestat, m.modelstat;
;

r1 = 2*x1.l + x2.l + y.l + c1;
r2 = x1.l + 2*x2.l + y.l + c2;
putclose 로그
 ' ' /
 '** MPEC: y = ', y.L:6:2 /
 'F1 :=', r1:6:2, ' perp x1 ', x1.lo:8:2, ' <= ', x1.L:6:2 ' <= ', x1.up:6:2 /
 'F2 :=', r2:6:2, ' perp x2 ', x2.lo:8:2, ' <= ', x2.L:6:2 ' <= ', x2.up:6:2 /
 ' ' / ;

abort$(abs(x1.l-0 ) > tol) 'var x1.l은 0이어야 합니다.' , x1.l;
abort$(abs(x2.l-1.0) > tol) 'var x2.l은 1.0이어야 합니다.', x2.l;
abort$(abs( y.l-1.0) > tol) 'var y.l은 1.0이어야 합니다.', y.l;
abort$(abs( z.l-6.0) > tol) 'var z.l은 6.0이어야 합니다.', z.l;

abort$(abs(f1.l-0.5) > tol) 'equ f1.l은 0.5여야 합니다.', f1.l;
abort$(abs(f2.l-3.0) > tol) 'equ f2.l은 3.0이어야 합니다.', f2.l;
abort$(abs( o.l-0 ) > tol) 'equ o.l은 0이어야 합니다' , o.l;