empdisj3.gms : not(동등성)을 사용하여 분리 테스트

설명

기고자: Jan-H. Jagla, 2011년 1월

소형 모델 유형 :메가 슬롯


카테고리 : 메가 슬롯 테스트 라이브러리


메인 파일 : empdisj3.gms

$title not(동등성)을 사용하여 분리 테스트(EMPDISJ3,SEQ=507)

$onText
기여자: Jan-H. 자글라, 2011년 1월
$offText

$onEchoV > testm1.inc
abort$(abs(%1.objval-(-2.0))>1e-6) '목표 값이 잘못되었습니다 [%1,%2]' , %1.objval;
abort$(abs(b.l-0.0) >1e-6) 'b.l 잘못됨 [%1,%2]' , b.l ;
abort$(abs(x.l-2.0) >1e-6) 'x.l 잘못됨 [%1,%2]' , x.l ;
$offEcho

$onEchoV > testm2.inc
abort$(abs(%1.objval-(-2.1))>1e-6) '목표 값이 잘못되었습니다 [%1,%2]' , %1.objval;
abort$(abs(b.l-1.0) >1e-6) 'b.l 잘못됨 [%1,%2]' , b.l ;
abort$(abs(x.l-1.0) >1e-6) 'x.l 잘못됨 [%1,%2]' , x.l ;
$offEcho

변수 z,x;
이진변수 b;
방정식 obj1,obj2,e1,e2;

obj1.. z =e= -0.9*b - x;
obj2.. z =e= -1.1*b - x;
e1..x =l= 1;
e2..x =e= 1;

x.up = 2;

$onEcho > jams.opt
파일 이름 mymodel.gms
mydoc.txt 받아쓰기
$offEcho

모델 m1 / obj1,e1 /; m1.optcr=0; m1.optfile=1;
모델 m2 / obj2,e1 /; m2.optcr=0; m2.optfile=1;
모델 m1e / obj1,e2 /; m1e.optcr=0; m1e.optfile=1;
모델 m2e / obj2,e2 /; m2e.optcr=0; m2e.optfile=1;

* ConvexHull로 테스트(기본 재구성)
'에코 분리 chull b e1 else not e1 > "%emp.info%"'를 실행합니다.
m1 us emp min z를 푼다;
$batInclude testm1.inc m1 CHull
m2 us emp min z를 풀어보세요;
$batInclude testm2.inc m2 CHull
$onText 평등 방정식에 대한 볼록 껍질 개혁이 현재 허용되지 않기 때문에 다음은 현재 비활성화되어 있습니다.
'echo disjunction chull b e2 else not e2 > "%emp.info%"'를 실행합니다.
m1e us emp min z를 풀어보세요;
$batInclude testm1.inc m1e CHull
m2e us emp min z를 풀어보세요;
$batInclude testm2.inc m2e CHull
$offText

* bigM으로 테스트
'에코 분리 bigM b e1 else not e1 > "%emp.info%"'를 실행합니다.
m1 us emp min z를 푼다;
$batInclude testm1.inc m1 BigM
m2 us emp min z를 풀어보세요;
$batInclude testm2.inc m2 BigM
'에코 분리 bigM b e2 else not e2 > "%emp.info%"'를 실행합니다.
m1e us emp min z를 풀어보세요;
$batInclude testm1.inc m1e BigM
m2e us emp min z를 풀어보세요;
$batInclude testm2.inc m2e BigM

* bigM 및 임계값 0으로 테스트합니다(동등성이 결코 분할되지 않음을 의미).
* 완전성을 위한 m1/m2 테스트(임계값은 불평등에 영향을 미치지 않음)
'에코 분리 bigM 1e4 1e-4 0 b e1 else not e1 > "%emp.info%"'를 실행합니다.
m1 us emp min z를 푼다;
$batInclude testm1.inc m1 BigM2
m2 us emp min z를 풀어보세요;
$batInclude testm2.inc m2 BigM2
'에코 분리 bigM 1e4 1e-4 0 b e2 else not e2 > "%emp.info%"'를 실행합니다.
m1e us emp min z를 풀어보세요;
$batInclude testm1.inc m1e BigM2
m2e us emp min z를 풀어보세요;
$batInclude testm2.inc m2e BigM2

$ 해결되지 않은 경우 cplex $goTo CPLEX_SKIP
* 표시기 및 CPLEX를 사용한 테스트
옵션 밉=cplex;
'echo disjunction indic b e1 else not e1 > "%emp.info%"'를 실행합니다.
m1 us emp min z를 푼다;
$batInclude testm1.inc m1 인도어
m2 us emp min z를 풀어보세요;
$batInclude testm2.inc m2 인도어
'echo disjunction indic b e2 else not e2 > "%emp.info%"'를 실행합니다.
m1e us emp min z를 풀어보세요;
$batInclude testm1.inc m1e 인도어
m2e us emp min z를 풀어보세요;
$batInclude testm2.inc m2e 인도어
$label CPLEX_SKIP

$아니면 SOLVER gurobi $goTo GUROBI_SKIP
* 구로비가 MIP를 해결할 수 있는지 먼저 확인하세요.
옵션 밉=구로비;
m1 us mip min z를 풀어보세요;

if (m1.solvestat <> %solveStat.licensingProblems%),

* 지표와 구로비를 이용한 테스트
'echo disjunction indic b e1 else not e1 > "%emp.info%"'를 실행합니다.
m1 us emp min z를 푼다;
$batInclude testm1.inc m1 인도어
m2 us emp min z를 풀어보세요;
$batInclude testm2.inc m2 인도어
'echo disjunction indic b e2 else not e2 > "%emp.info%"'를 실행합니다.
m1e us emp min z를 풀어보세요;
$batInclude testm1.inc m1e 인도어
m2e us emp min z를 풀어보세요;
$batInclude testm2.inc m2e 인도어