miqcp03.gms : modsolstat 및 솔루션 정확성 테스트 - 여러 QCon 및 바이너리

설명

바이너리 변수를 포함하도록 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';
  ;
  '모든 테스트 통과'를 표시합니다.
;