설명
테스트 =g= 표시기 제약. 이 모델은 DICE를 기반으로 합니다. 슬롯 무료체험 모델 라이브러리. 기고자: Steve Dirkse, 2011년 11월
대형 모델 유형 :MIP
카테고리 : 슬롯 무료체험 테스트 라이브러리
메인 파일 : indic01.gms
$title =g= 표시기 제약 조건 테스트(INDIC01,SEQ=541)
$onText
=g= 표시기 제약 조건을 테스트합니다. 이 모델은 DICE를 기반으로 합니다.
슬롯 무료체험 모델 라이브러리.
Steve Dirkse 제공, 2011년 11월
$offText
주사위에 f개의 면을 설정합니다 / face1*face6 /
주사위 주사위 개수 / dice1*dice3 / ;
스칼라 플로 최저 액면가 / 1 /
ㅋㅋㅋ 액면가가 가장 높아
wn 승리 필요 - 가능한 한도;
fup = 카드(주사위) * 카드(f);
wn = 바닥(0.5 * sqr(카드(f))) + 1;
별칭(f,fp);
별칭(주사위,dicep);
변수 wnx '승리 횟수'
fval(dice,f) '주사위의 액면가 - 분수일 수 있음'
comp(dice,f,fp) '1은 f가 fp를 이긴다는 것을 의미합니다.' ;
이진 변수 comp;
fval.lo(주사위,f) = flo;
fval.up(dice,f) = fup;
fval.fx("dice1","face1") = flo;
* 약간의 속임수를 사용하고 값을 수정하여 작업 속도를 높일 수 있습니다.
* fval.fx("dice1","face2") = 10;
방정식 eq1(주사위) '승리 계산'
eq3(dice,f,fp) '비추이 관계 정의'
eq4(dice,f) '단일 주사위에 대해 서로 다른 액면가';
eq1(주사위).. sum((f,fp), comp(dice,f,fp)) =e= wnx;
eq3(주사위,f,fp) .. fval(주사위,f) =g= fval(주사위++1,fp) + 1;
eq4(주사위,f-1) .. fval(주사위,f-1) + 1 =l= fval(주사위,f);
모델 xdice /all /;
$onEcho > copt.o99
인덱스 eq3(주사위,f,fp)$comp(주사위,f,fp) 1
$offEcho
$onEcho > cplex.o99
인덱스 eq3(주사위,f,fp)$comp(주사위,f,fp) 1
$offEcho
$onEcho > gurobi.o99
인덱스 eq3(주사위,f,fp)$comp(주사위,f,fp) 1
$offEcho
$onEcho > gurobiold.o99
인덱스 eq3(주사위,f,fp)$comp(주사위,f,fp) 1
$offEcho
$onEcho > xpress.o99
인덱스 eq3(주사위,f,fp)$comp(주사위,f,fp) 1
$offEcho
$onEcho > xpressold.o99
인덱스 eq3(주사위,f,fp)$comp(주사위,f,fp) 1
$offEcho
$echo 슬롯 무료체험/indicatorfile = "cplex.o99" > scip.o99
xdice.optfile = 99;
* 모든 obj 값은 정수이므로 아주 작은 optcr도 작동합니다.
xdice.optcr = 1e-3;
* 이 공식이 분수 fval의 해를 허용하는지 의심된다면,
* 아래 변수 수정의 주석 처리를 제거하세요.
* fval.fx("dice3","face1") = 3.75;
mip max wnx를 사용하여 xdice를 해결합니다.
abort$[xdice.solvestat <> %solveStat.normalCompletion%] "잘못된 솔버 상태";
abort$[(xdice.modelstat <> %modelStat.optimal%) 및 (xdice.modelstat <> %modelStat.integerSolution%)] "잘못된 모델 상태";
* 청소하고 확인
매개변수
chk1(주사위)
nWins(dice) '승리 횟수, 주사위 대 주사위++1'
v(dice,f) '주사위의 액면가 - 정수가 됩니다'
chk3(주사위,f,fp)
dom(dice,f,fp) '하나는 (dice,f)가 (dice++1,fp)를 지배함을 의미합니다.'
;
v(주사위,f) = Floor(fval.l(주사위,f)+1e-3);
dom(주사위,f,fp) = round(comp.l(주사위,f,fp));
nWins(주사위) = sum(f,fp), dom(주사위,f,fp);
Execute_unload 'indic01_sol', v, dom, nWins;
abort$[abs(wnx.l - round(wnx.l)) > 1e-6] '정수가 아닌 목표', wnx.l;
chk1(주사위) = nWins(주사위) - round(wnx.l);
abort$card(chk1) '가짜 목표', nWins, wnx.l, dom;
chk3(주사위,f,fp) = abs(dom(주사위,f,fp) - comp.l(주사위,f,fp));
abort$[smax(dice,f,fp), chk3(dice,f,fp) > 1e-6] '정수가 아닌 comp가 반환됨', chk3, comp.l;
chk3(주사위,f,fp)$dom(주사위,f,fp) = [v(주사위,f) <= v(주사위++1,fp)];
abort$card(chk3) '가짜 comp 변수', comp.l, dom, chk3;