설명
몇 가지 유용한 기능을 갖춘 매우 간단한 MPEC 모델: a) 독특한 해결책이 있다 b) 일치하는 모든 변수는 이중으로 제한됩니다. 기고자: Steve Dirkse, 2013년 9월
소형 모델 유형 :MPEC
카테고리 : 슬롯 머신 테스트 라이브러리
메인 파일 : mpec07.gms
$title 단순 MPEC 고유 솔루션 이중 경계 일치(MPEC07,SEQ=618)
$onText
몇 가지 유용한 기능을 갖춘 매우 간단한 MPEC 모델:
a) 독특한 해결책이 있다
b) 일치하는 모든 변수는 이중으로 제한됩니다.
기고자: Steve Dirkse, 2013년 9월
$offText
$설정되지 않은 경우 TESTTOL $set TESTTOL 1e-4
스칼라
톨 / %TESTTOL% /
c1 / -4 /
c2 / 8 /
c3 / 8 /
;
자유 변수
x1 / lo -1, 위로 1 /
x2 / lo 1, 최대 3 /
x3 / lo -100, 최대 100 /
y / 위로 0 /
;
자유 변수 z;
방정식 f1, f2, f3, o;
f1 .. 3*x1 + x2 + y + c1 =N= 0;
f2 .. x1 + 3*x2 + x3 + y + c2 =G= 0;
f3 .. x2 + 3*x3 + y + c3 =N= 0;
o .. sqr(x1-5) + sqr(x2-2) + sqr(x3-2) + sqr(y) =E= z;
모델 m / f1.x1, f2.x2, f3.x3, o /;
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.feasibleSolution%))] '잘못된 상태 코드',
m.solvestat, m.modelstat;
;
스칼라 r1, r2, r3;
r1 = 3*x1.l + x2.l + y.l + c1;
r2 = x1.l + 3*x2.l + x3.l + y.l + c2;
r3 = x2.l + 3*x3.l + y.l + c3;
파일 로그 / '' /;
putclose 로그
' ' /
'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 /
'F3 :=', r3:6:2, ' perp x3 ', x3.lo:8:2, ' <= ', x3.L:6:2 ' <= ', x3.up:6:2 /
' y = ', y.L:6:2 /
' ' / ;
abort$(abs(x1.l-1.0) > tol) 'var x1.l은 1.0이어야 합니다.', x1.l;
abort$(abs(x2.l-1.0) > tol) 'var x2.l은 1.0이어야 합니다.', x2.l;
abort$(abs(x3.l+2.5) > tol) 'var x3.l은 -2.5여야 합니다.', x3.l;
abort$(abs( y.l+1.5) > tol) 'var y.l은 -1.5여야 합니다.', y.l;
abort$(abs( z.l-39.5)> tol) 'var z.l은 39.5여야 합니다.', z.l;
abort$(abs(f1.l+1.5) > tol) 'equ f1.l은 -1.5여야 합니다.', f1.l;
abort$(abs(f2.l-0.0) > tol) 'equ f2.l은 0.0이어야 합니다.', f2.l;
abort$(abs(f3.l-0.0) > tol) 'equ f3.l은 0.0이어야 합니다.', f3.l;
abort$(abs( o.l-0 ) > tol) 'equ o.l은 0이어야 합니다' , o.l;