indic01.gms : =g= 표시기 제약 조건 테스트

설명

테스트 =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;