설명
기본적으로 sqr(x) + sqr(y) <= 8이 되도록 x+y를 최대화합니다. 따라서 x = y = 2입니다. 그러나 원뿔형 제약 조건을 테스트하기 위해 제약 조건을 작성합니다. sqr(x) + sqr(y) <= sqr(z), 0 <= z <= sqrt(8)입니다. 기여자: Stefan Vigerske
소형 모델 유형 :QCP
카테고리 : 슬롯 무료체험 테스트 라이브러리
메인 파일 : qcp11.gms
$title SOCP 이중 솔루션 테스트
$onText
기본적으로 sqr(x) + sqr(y) <= 8이 되도록 x+y를 최대화합니다.
따라서 x = y = 2입니다.
그러나 원뿔형 제약 조건을 테스트하기 위해 제약 조건을 작성합니다.
sqr(x) + sqr(y) <= sqr(z), 0 <= z <= sqrt(8)입니다.
기여자: Stefan Vigerske
$offText
$설정되지 않은 경우 TESTTOL $set TESTTOL 1e-6
스칼라 mchecks / 0 /;
$%QPMCHECKS%가 아닌 경우 == 0 $%QCPMCHECKS%가 아닌 경우 == 0 mchecks = 1;
변수 x, y, z, objvar;
방정식 e1, e2, obj;
e1..sqr(x) + sqr(y) =L= sqr(z);
e2.. -sqr(x) - sqr(y) =G= -sqr(z);
z.lo = 0;
z.up = sqrt(8);
obj..objvar =E= x + y;
모델 m1 / e1, obj /;
모델 m2 / e2, obj /;
* 슬롯 무료체험가 솔루션을 엉망으로 만들지 마십시오.
m1.tolproj = 0;
m2.tolproj = 0;
* 글로벌 솔버들로부터 최적의 솔루션을 원합니다
m1.optcr = 0;
m2.optcr = 0;
* 로컬 솔버의 경우 문제가 볼록하지 않은 것처럼 보일 수 있으므로 최적에 가깝게 시작하겠습니다.
x.l = 1.9;
y.l = 1.9;
z.l = sqrt(sqr(x.l) + sqr(y.l));
QCP를 사용하여 m1 max objvar를 해결합니다.
abort$(m1.solvestat <> %solveStat.normalCompletion%) '해결 상태가 정상이 아닙니다.';
abort$(m1.modelstat <> %modelStat.locallyOptimal% 및 m1.modelstat <> %modelStat.optimal%) '모델 상태가 (로컬) 최적성을 나타내지 않습니다.';
abort$(abs(x.l - 2) > sqrt(%TESTTOL%)) 'x에 대한 잘못된 기본 솔루션, 예상되는 2';
abort$(abs(y.l - 2) > sqrt(%TESTTOL%)) 'y에 대한 잘못된 원초 솔루션, 예상되는 2';
abort$(abs(z.l - sqrt(8)) > sqrt(%TESTTOL%)) 'z에 대한 원시 값이 잘못되었습니다. sqrt(8)가 필요합니다.';
abort$(abs(objvar.l - 4) > %TESTTOL%) '최적 값이 잘못되었습니다. 4가 예상됩니다.';
abort$(abs(e1.l) > %TESTTOL%) 'e1에 대한 잘못된 활동, 예상되는 0';
if( m1.marginals 및 mchecks,
abort$(abs(x.m) > %TESTTOL%) 'x에 대한 잘못된 이중 솔루션, 예상되는 0';
abort$(abs(y.m) > %TESTTOL%) 'y에 대한 잘못된 이중 솔루션, 예상되는 0';
abort$(abs(z.m - sqrt(2)) > %TESTTOL%) 'z에 대한 잘못된 이중 솔루션, 예상되는 sqrt(2)';
abort$(abs(e1.m - 0.25) > %TESTTOL%) 'e1에 대한 잘못된 이중 솔루션, 예상되는 0.25';
);
QCP를 사용하여 m2 max objvar를 해결합니다.
abort$(m2.solvestat <> %solveStat.normalCompletion%) '해결 상태가 정상이 아닙니다.';
abort$(m2.modelstat <> %modelStat.locallyOptimal% 및 m2.modelstat <> %modelStat.optimal%) '모델 상태가 (로컬) 최적성을 나타내지 않습니다.';
abort$(abs(x.l - 2) > sqrt(%TESTTOL%)) 'x에 대한 잘못된 기본 솔루션, 예상되는 2';
abort$(abs(y.l - 2) > sqrt(%TESTTOL%)) 'y에 대한 잘못된 원초 솔루션, 예상되는 2';
abort$(abs(z.l - sqrt(8)) > sqrt(%TESTTOL%)) 'z에 대한 원시 값이 잘못되었습니다. sqrt(8)가 필요합니다.';
abort$(abs(objvar.l - 4) > %TESTTOL%) '최적 값이 잘못되었습니다. 4가 예상됩니다.';
abort$(abs(e2.l) > %TESTTOL%) 'e2에 대한 잘못된 활동, 예상되는 0';
if( m2.marginals 및 mchecks,
abort$(abs(x.m) > %TESTTOL%) 'x에 대한 잘못된 이중 솔루션, 예상되는 0';
abort$(abs(y.m) > %TESTTOL%) 'y에 대한 잘못된 이중 솔루션, 예상되는 0';
abort$(abs(z.m - sqrt(2)) > %TESTTOL%) 'z에 대한 잘못된 이중 솔루션, 예상되는 sqrt(2)';
abort$(abs(e2.m + 0.25) > %TESTTOL%) 'e2에 대한 잘못된 이중 솔루션, 예상되는 -0.25';
);
* SOCP 제약 조건 e1이 활성화되지 않아야 하는 m1의 또 다른 해석을 수행합니다.
* 해는 x = y = 1이고 일부 z >= 2여야 합니다. 따라서 sqr(x) + sqr(y) = 2 < 4 <= sqr(z)
x.up = 1;
y.up = 1;
z.lo = 2;
QCP를 사용하여 m1 max objvar를 해결합니다.
abort$(m1.solvestat <> %solveStat.normalCompletion%) '해결 상태가 정상이 아닙니다.';
abort$(m1.modelstat <> %modelStat.locallyOptimal% 및 m1.modelstat <> %modelStat.optimal%) '모델 상태가 (로컬) 최적성을 나타내지 않습니다.';
abort$(abs(x.l - 1) > sqrt(%TESTTOL%)) 'x에 대한 잘못된 원시 솔루션, 예상되는 1';
abort$(abs(y.l - 1) > sqrt(%TESTTOL%)) 'y에 대한 잘못된 기본 해법, 1이 예상됨';
abort$(abs(objvar.l - 2) > %TESTTOL%) '최적 값이 잘못되었습니다. 예상 값은 2입니다.';
abort$(e1.l > -2 + %TESTTOL%) 'e1에 대한 잘못된 활동, 최대 -2 예상';
if( m1.marginals 및 mchecks,
abort$(abs(x.m - 1) > %TESTTOL%) 'x에 대한 잘못된 이중 솔루션, 예상되는 1';
abort$(abs(y.m - 1) > %TESTTOL%) 'y에 대한 잘못된 이중 솔루션, 예상되는 1';
abort$(abs(z.m) > %TESTTOL%) 'z에 대한 잘못된 이중 솔루션, 예상되는 0';
abort$(abs(e1.m) > %TESTTOL%) 'e1에 대한 잘못된 이중 솔루션, 예상되는 0';
);