설명
바이너리 변수를 포함하도록 QCP04에서 수정됨 기여자: Toni Lastusilta
소형 모델 유형 :MIQCP
카테고리 : 슬롯 게임 테스트 라이브러리
메인 파일 : miqcp03.gms
$title 테스트 modsolstat 및 솔루션 정확성 - 여러 QCon 및 바이너리 (MIQCP03,SEQ=603)
$onText
이진 변수를 포함하도록 QCP04에서 수정됨
기여자: Toni Lastusilta
$offText
$설정되지 않은 경우 DEMOSIZE $set DEMOSIZE 0
$설정되지 않은 경우 GLOBALSIZE $set GLOBALSIZE 0
$%DEMOSIZE%가 아닌 경우 == 0 $set DEMOSIZE 1
$%GLOBALSIZE%가 아닌 경우 == 0 $set GLOBALSIZE 1
* 라이센스 및 솔버 유형에 따라 기본값 N 설정
$if %DEMOSIZE%%GLOBALSIZE% == 00 $set NN 25
$if %DEMOSIZE%%GLOBALSIZE% == 01 $set NN 6
$if %DEMOSIZE%%GLOBALSIZE% == 10 $set NN 14
$if %DEMOSIZE%%GLOBALSIZE% == 11 $set NN 3
$설정되지 않은 경우 N $set N %NN%
$설정되지 않은 경우 MTYPE $set MTYPE miqcp
$설정되지 않은 경우 TESTTOL $set TESTTOL 1e-5
스칼라 mchecks / 0 /;
$설정되지 않은 경우 QCPMCHECKS $goTo qpmchecks
$%QCPMCHECKS%가 아닌 경우 == 0 mchecks = 1;
$goTo 완료확인
$label qpmchecks
$%QPMCHECKS%가 아닌 경우 == 0 mchecks = 1;
$label Donmcheck
$eolCom //
내가 설정 /1*%N%/;
변수 x(i), y(i), z;
이진변수 b(i);
스칼라 bigM /100/;
매개변수 xp(i), yp(i);
xp(i) = 균일(0,1);
yp(i) = 균일(0,1);
* 전역 솔버를 만족시키기 위해 일부 비활성 경계를 설정합니다.
x.lo(i) = -1.1; x.up(i) = 1.1;
y.lo(i) = -1.1; y.up(i) = 1.1;
방정식 defc, defz, awew;
defc(i).. sqr(x(i)) + sqr(y(i)) =L= 1 + bigM*b(i);
defz.. z =E= sum(i,xp(i)*x(i) + yp(i)*y(i));
약간.. sum(i, b(i)) =l= max(2,card(i)*0.01);
모델 m /all/;
m.limrow=0; m.limcol=0;
옵션 optcr = 0;
%MTYPE%를 사용하여 m min z를 해결합니다.
* 사용 가능한 한계가 없으면 mcheck를 비활성화합니다.
if(m.marginals가 아님, mchecks = 0);
스칼라
vtol / 1e-8 /,
톨 / %TESTTOL% /,
목표;
매개변수
dLdx(i) 'd랑랑어/dx',
dLdy(i) 'd랑랑어/dy';
* 기능 문제는 OK 반품입니다.
if (m.solvestat = %solveStat.capabilityProblems%),
abort$(m.modelstat <> %modelStat.noSolutionReturned%) '기능 오류에 대한 잘못된 modelstat';
'해석 기능 오류: 추가 테스트가 억제됨'을 표시합니다.
그렇지 않으면
abort$(m.modelstat <> %modelStat.optimal% and m.modelstat <> %modelStat.locallyOptimal% and m.modelstat <> %modelStat.feasibleSolution% and m.modelstat <> %modelStat.integerSolution%) '실행 가능한 솔루션이 없습니다.';
* 원문제 해결 가능성 확인
objval = sum(i,xp(i)*x.l(i) + yp(i)*y.l(i));
abort$(abs(z.l-objval) > tol) '불량 z.l';
중단$(abs(defz.l) > tol) '잘못된 defz.l';
중단$(smaxi,defc.l(i) - 1 > tol) '잘못된 defc.l';
만약 mchecks,
* 이중 솔루션 타당성을 확인하십시오.
abort$(abs(z.m) > tol) '나쁜 z.m';
중단$(abs(defz.m-1) > tol) '잘못된 defz.m';
중단$(smaxi,defc.m(i) > tol) '잘못된 defc.m';
* 1차 최적성 조건을 확인합니다(b가 고정되어 있다고 가정).
dLdx(i) = (xp(i) - defc.m(i) * 2 * x.l(i))$(b.l(i)<0.5);
dLdy(i) = (yp(i) - defc.m(i) * 2 * y.l(i))$(b.l(i)<0.5);
dLdx, dLdy를 표시합니다.
abort$(smaxi,abs(dLdx(i)) > tol) '불량 dLdx';
중단$(smaxi,abs(dLdy(i)) > tol) '불량 dLdy';
;
'모든 테스트 통과'를 표시합니다.
;