설명
이 모델은 솔버와 해당 기능을 비교합니다. 원래의 솔버 기능 데이터베이스를 갖춘 실제 시스템. 그런 다음 글로벌 데이터베이스에 알려진 솔버를 사용하여 모든 조합을 실행합니다. 슬롯 커뮤니티 실행의 반환 코드가 0인지 확인합니다. 모든 예외는 비교 보고서에 캡처됩니다. 보고서가 비어 있지 않으면 모델이 실행 오류로 종료됩니다. 키워드: 슬롯 커뮤니티 언어 기능
소형 모델 유형 :슬롯 커뮤니티
카테고리 : 슬롯 커뮤니티 모델 라이브러리
메인 파일 : gsolver.gms
$title 실제 시스템을 원래 솔버 데이터베이스(GSOLVER,SEQ=311)와 비교
$onText
이 모델은 솔버와 해당 기능을 비교합니다.
원래의 솔버 기능 데이터베이스를 갖춘 실제 시스템.
그런 다음 글로벌 데이터베이스에 알려진 솔버를 사용하여 모든 조합을 실행합니다.
슬롯 커뮤니티 실행의 반환 코드가 0인지 확인합니다.
모든 예외는 비교 보고서에 캡처됩니다. 보고서가 비어 있지 않으면
모델이 실행 오류로 종료됩니다.
키워드: 슬롯 커뮤니티 언어 기능
$offText
세트
ModelTypes / system.ModelTypes /
SolverNames / system.SolverNames /
플랫폼 / 시스템.플랫폼 /
빌드코드 /'%system.buildcode%' /
glbSolverDB(SolverNames,ModelTypes,Platforms) / system.SolverTypePlatformMap /;
세트
s(SolverNames) '이 플랫폼에 사용할 수 있는 솔버'
glbSolverCapabilities(SolverNames,ModelTypes) '원래 솔버 모델 유형 맵';
매개변수 comprep '보고서 비교';
s(SolverNames) = sum(glbSolverDB(SolverNames,ModelTypes,'%system.platform%'), yes);
glbSolverCapability(s,ModelTypes) = sum(glbSolverDB(s,ModelTypes,'%system.platform%'), yes);
* 실제 시스템에서는 솔버/기능 쌍이 누락되었습니다.
comprep(s,ModelTypes,'missing') = glbSolverCapability(s,ModelTypes) 및
SolverCapability(s,ModelTypes)가 아닙니다.
* 실제 시스템의 추가 솔버/기능 쌍
comprep(s,ModelTypes,'additional') = glbSolverCapability(s,ModelTypes)가 아님 및
SolverCapability(s,ModelTypes);
$onEmpty
세트
Skiplist '건너뛸 솔버 목록'
/드
Decisc
단호함
황조롱이
$if %system.buildcode% == DEG 샷 'stdout으로의 CPLEX 출력을 리디렉션할 수 없습니다'
/
skim '건너뛴 모델 유형 목록' / emp /
Skipsm(*,*) '건너뛴 솔버/모델 유형 조합 목록' /
(gurobi,gurobiold,mosek).(nlp,rminlp,dnlp,minlp) '이 테스트에 사용된 ((r)mi/d)nlp 종류를 풀 수 없습니다.'
/;
$off비어 있음
* 테스트를 실행하고 구성할 슬롯 커뮤니티 프로그램을 생성합니다.
* 모델(마지막에 표시). 각 솔버 모델 유형 조합에 대해
* 다음과 같은 프로그램을 실행하겠습니다.
*
* $call =슬롯 커뮤니티 <스크래치 디렉터리>m.%슬롯 커뮤니티scrext% lo=0 --mtype=rmip --solver=conopt
* $ifE errorLevel<>0 $abort "해결자 conopt가 rmip를 해결해야 합니다.";
*
* 보고서 세트 tuple comprep의 'fail' 열에 예외를 기록합니다.
$set mname '"%슬롯 커뮤니티scrdir%m.%슬롯 커뮤니티scrext%"'
파일 fx / rungslv.gms /; fx.lcase = 1;
파일 플로그 / '' /; flog.ps = 1;
$set 싱글런
$set lo lo=0
$if set 솔버 $set lo lo=3
$if set 솔버 $set Singlerun and sameas('%solver%',s)
$if set modeltype $set Singlerun %singlerun% 및 sameas('%modeltype%',Modeltypes)
loop(SolverCapability(s,ModelTypes)$([skipsm(s,ModelTypes) 아님] 및 [sumskiplist(s),1=0] 및 [sum(skipm(ModelTypes),1)=0] %singlerun%),
putClose fx '$call =슬롯 커뮤니티 %mname% %lo% --mtype=' ModelTypes.tl:0 ' --solver=' s.tl:0
/ '$ifE errorLevel<>0 $abort "' s.tl:0 ' 해결 프로그램은 ' ModelTypes.tl:0을 해결해야 합니다.
put flog '--- 모델 유형 ' ModelTypes.tl:0 /에서 솔버 ' s.tl:0 ' 실행 중;
'=슬롯 커뮤니티 rungslv.gms %lo%'를 실행합니다.
comprep(s,ModelTypes,'fail')$errorLevel = yes;
);
$if set 솔버 $goTo modeldump
파일 ff / gslvfail.gms /;
loop((s,ModelTypes)$comprep(s,ModelTypes,'fail'),
put ff '$call 슬롯 커뮤니티 gsolver --Solver ' s.tl:0 ' --ModelType ' ModelTypes.tl:0 /;
);
* comprep 보고서에 항목이 있으면 실행 오류가 발생합니다.
abort$card(comprep) comprep;
$label 모델 덤프
* 아래는 실행될 테스트 프로그램입니다. 우리는
* 이름 확장자를 사용하여 모델을 스크래치 디렉터리에 복사합니다.
* .%슬롯 커뮤니티scext%. 이 파일은 게임을 할 때 자동으로 제거됩니다.
* 종료합니다.
$onEchoV > %mname%
* 다양한 모델 유형에 대한 작은 테스트 모델
* $setDDList(Double Dash List)는 모든 항목을 정의합니다.
* '법적' --이름.
$설정되지 않은 경우 mtype $error --mtype=xxxx 누락
$해결자가 설정되지 않은 경우 $error --solver=xxxx 누락
$setDDList mtype 솔버
변수 z;
양수 변수 w, x, y;
x.up = 200;
x.l = 1; y.l = 1; z.l = 1;
정수 변수 xi, yi;
xi.up = 100; xi.1 = 1;
yi.up = 100; yi.l = 1;
방정식 lpe1, nlpe1, dnlpe1, mipe1, minlpe1, lpo, qcpo, nlpo, mipo, miqcpo, minlpo
cnse1, cnse2, mcpe1, mpeco, dece1, 데코;
* LP QCP NLP MIP MIQCP MINLP
lpe1.. x + y =l= 2.2;
nlpe1..exp(x+y) =l= 4.1;
dnlpe1..abs(x*y) =l= 4.1;
mipe1..xi + yi =l= 3.5;
minlpe1..exp(xi*yi) =l= 4.6;
lpo.. z =e= -3*x - 4*y;
qcpo.. z =e= 2*sqr(x - 3.4) + 3*sqr(y - 2.9);
nlpo.. z =e= exp(3*x + 2*y);
미포.. z =e= -3*xi - 4*yi;
miqcpo.. z =e= 2*sqr(xi - 3.4) + 3*sqr(yi - 2.9);
minlpo.. z =e= exp(3*xi + 2*yi);
* 중추신경계
cnse1..sqr(x-3) + sqrt(y+4) =e= 3.7;
cnse2.. x + 3.1*y =e= 3.5;
* MPEC 및 MCP
mcpe1.. 0.5*x + 2*y =g= 100;
mpeco.. z =e= 0.5*sqr(x) + 0.5*x*y - 95*x;
* 결정
dece1.. x =e= y + w;
데코.. z =e= 24*y -2.49*x - 4*w;
모델
m_lp / lpe1, lpo /
m_qcp / lpe1, qcpo /
m_nlp / nlpe1, nlpo /
m_dnlp / dnlpe1, nlpo /
m_rmip / mipe1, 미포 /
m_mip / mipe1, 미포 /
m_rmiqcp / mipe1, miqcpo /
m_miqcp / mipe1, miqcpo /
m_rminlp / minlpe1, minlpo /
m_minlp / minlpe1, minlpo /
m_cns / cnse1, cnse2 /
m_mpec / mcpe1.y, mpeco /
m_rmpec / mcpe1.y, mpeco /
m_mcp / mcpe1.y /
m_decis / dece1, 데코 /;
옵션 %mtype% = %solver%, optCr = 0;
* 특별한 요구 사항이 있는 솔버의 특수 처리
$ifI %solver% == decisc $goTo DECIS
$ifI %solver% == 결정론 $goTo DECIS
$ifI %solver% == guss $goTo GUSS
* 목적이 없는 모델 유형에 대한 특수 처리
$ifI %mtype% == cns $goTo CNS
$ifI %mtype% == mcp $goTo MCP
%mtype% min z를 사용하여 m_%mtype%를 해결합니다.
abort$(m_%mtype%.solveStat <> %solveStat.normalCompletion%) '솔버 반환이 정상이 아닙니다.';
$exit
$라벨 CNS
cns를 사용하여 m_cns를 해결합니다.
abort$(m_cns.solveStat <> %solveStat.normalCompletion%) '솔버 반환이 정상이 아닙니다.';
$exit
$레이블 MCP
x.fx = 200;
mcp를 사용하여 m_mcp를 해결합니다.
abort$(m_mcp.solveStat <> %solveStat.normalCompletion%) '솔버 반환이 정상이 아닙니다.';
$exit
$label DECIS
y.up = 160;
x.스테이지 = 1;
dece1.stage = 2;
y.스테이지 = 2;
파일 FX / MODEL.STG /
fy / MINOS.SPC /;
putClose fx '블록 분리'
/ 'BL 블록1 기간2 0.25'
/ 'UP BND y 150'
/ 'BL 블록1 기간2 0.75'
/ 'UP BND y 160';
putClose fy '시작'
/ '행 250'
/ '열 250'
/ '요소 10000'
/ '끝';
%mtype% max z를 사용하여 m_decis를 해결합니다.
abort$(m_decis.solveStat <> %solveStat.normalCompletion%) '솔버 반환이 정상이 아닙니다.';
$exit
$라벨 거스
i / d1*d2 /, j / i1, o1 /, ji(j) / i1 /, jo(j) / o1 / 설정;
매개변수 ds(i,j) / d1.i1 3, d1.o1 5, d2.i1 2.5, d2.o1 4.5 /;
매개변수 d(j);
변수 z;
양수변수 v(ji), u(jo);
방정식 deao, deae1, deae2;
deao.. z =e= sum(jo, u(jo)*d(jo));
deae1..sum(ji, v(ji)*d(ji)) =e= 1;
deae2.. sum(jo, u(jo)*d(jo)) =l= sum(ji, v(ji)*d(ji));
모델 m_scen / deao, deae1, deae2 /;
dict(*,*,*) / i.scenario.'' 1, d.param.ds 2 / 설정;
d(j) = ds('d1',j);
옵션 lp = soplex;
z 시나리오 dict를 최소화하는 lp를 사용하여 m_scen을 해결합니다.
abort$(m_scen.solveStat <> %solveStat.normalCompletion%) '솔버 반환이 정상이 아닙니다.';
$exit
$offEcho