설명
슬롯 게임 솔루션 열거자를 테스트합니다. 테스트하기 위해 우리는 다음의 변형을 사용합니다. 주사위 모델(동일한 내용이 여러 번 표현되지 않도록 조정됨) 솔루션). 테스트 모델은 15개의 솔루션을 갖춘 최대화 모델입니다. obj=21, obj=20인 솔루션 794개, obj=19인 솔루션이 많이 있습니다. 우리는 여러 가지를 테스트합니다: 1. 모든 최적의 솔루션을 반환합니다(예: obj = 21). 2. obj = 20 또는 21인 모든 해를 반환합니다. 3. 최고의 솔루션 15개 반환 4. 16가지 최고의 솔루션 반환 5. 150개의 최고의 솔루션 반환 6. 900개의 최고의 솔루션 반환 7. obj 20 또는 21을 사용하여 처음 20개의 솔루션을 반환합니다. 8. obj >= 18인 처음 200개 솔루션 반환 xpress05와 비교하여 병합된 솔루션 풀에서 솔루션을 읽습니다. 개별 포인트 파일이 아닌 파일. 기고자: Michael Bussieck/Steve Dirkse, 2013년 5월
소형 모델 유형 :MIP
카테고리 : 슬롯 게임 테스트 라이브러리
메인 파일 : xpress06.gms
$title 슬롯 게임 테스트 모음 - solnPoolMerge를 사용한 솔루션 열거자 예(XPRESS06,SEQ=612)
$onText
슬롯 게임 솔루션 열거자를 테스트합니다. 테스트하기 위해 우리는 다음의 변형을 사용합니다.
주사위 모델(동일한 내용이 여러 번 표현되지 않도록 조정됨)
솔루션). 테스트 모델은 15개의 솔루션을 갖춘 최대화 모델입니다.
obj=21, obj=20인 솔루션 794개, obj=19인 솔루션이 많이 있습니다.
우리는 여러 가지를 테스트합니다:
1. 모든 최적의 솔루션을 반환합니다(예: obj = 21).
2. obj = 20 또는 21인 모든 해를 반환합니다.
3. 최고의 솔루션 15개 반환
4. 16가지 최고의 솔루션 반환
5. 150개의 최고의 솔루션 반환
6. 900개의 최고의 솔루션 반환
7. obj 20 또는 21을 사용하여 처음 20개의 솔루션을 반환합니다.
8. obj >= 18인 처음 200개 솔루션 반환
xpress05와 비교하여 병합된 솔루션 풀에서 솔루션을 읽습니다.
개별 포인트 파일이 아닌 파일.
기고자: Michael Bussieck/Steve Dirkse, 2013년 5월
$offText
$ifThen %DEMOSIZE% == 1
$ log 이 테스트는 너무 커서 데모 모드에서 실행할 수 없습니다. 종료합니다.
$ 중단.noError
$endIf
$존재하지 않는 경우 mip06.gms $call testlib -q mip06
$onEcho > poolObj.gms
* 솔루션을 읽고 목표를 계산합니다.
세트
풀 '솔루션 생성'
d '주사위 수'
f '다이 페이스'
v '액면가'
map(d,f,v) '주사위 면을 값에 매핑'
win(d,f,f) 'faceVal(d,f)가 FaceVal(d++,fp)보다 크면 true입니다.'
;
별칭(f,fp),(d,dp);
매개변수
obj(풀)
faceVal(d,f) '다이 면의 값 - 정수가 됩니다.'
vals(v) '가능한 액면가'
chk(v)
;
스칼라 ok / 0 /;
매개변수
mapv(pool,d,f,v) '주사위 면을 값에 매핑'
;
$gdxIn 주사위Def
$load fd v vals
$gdxIn
$gdxIn %INFILE%
$load 풀=인덱스 mapv=맵
$gdxIn
Execute_unload '%OUTFILE%', 확인;
알았어 = 525;
루프풀,
map(d,f,v) = round(mapv(풀,d,f,v));
지도 표시;
chk(v) = 1 - 합계map(d,f,v), 1;
abort$card(chk) '잘못된 맵', chk, map;
FaceVal(d,f) = summap(d,f,v), vals(v);
win(d,f,fp) = [faceVal(d,f) > FaceVal(d++1,fp) + 0.5];
obj(풀) = smind, sumwin(d,f,fp), 1;
;
Execute_unload '%OUTFILE%', ok, pool, obj;
$offEcho
세트
풀 '가능한 해결책' /
test101_p1*test101_p999,
test102_p1*test102_p999,
test103_p1*test103_p999,
test104_p1*test104_p999,
test105_p1*test105_p999,
test106_p1*test106_p999,
test107_p1*test107_p999,
test108_p1*test108_p999
/
p(풀)
;
매개변수
obj(풀)
chk(풀)
;
스칼라 cnt;
* -----------------------------------------------
* 1. 모든 최적의 솔루션을 반환합니다(예: obj = 21).
$onEcho > 슬롯 게임101
solnpoolMerge diceSols101.gdx
solnpool접두사 테스트101
solnpoolDup정책 3
solnpoolPop 2
solnpool자세함 2
mipabscutoff 20.5
* 기본적으로 풀의 용량은 매우 큽니다.
$offEcho
$call gams mip06.gms mip=슬롯 게임 optfile=101 --SKIPCUTS=1 lo=%GAMS.lo%
$if errorlevel 1 $abort 슬롯 게임 열거자를 사용하여 실행 101에 대한 솔루션을 생성하지 못했습니다.
$call gams poolObj.gms --infile=diceSols101 --outfile=diceObjs101 lo=%GAMS.lo%
$if errorlevel 1 $abort 계산/확인 목표가 실패했습니다.
p(풀) = 아니오; obj(풀) = 0; chk(풀) = 0;
Execute_load 'diceObjs101', p=pool, obj;
abort$[card(p) <> 15] '테스트 101: 21의 15개 솔루션이 있어야 함', p, obj;
chk(p) = obj(p) - 21;
abort$[card(chk)] '테스트 101: 21의 15개 솔루션이 있어야 함', chk, p, obj;
* -----------------------------------------------
* 2. obj = 20 또는 21인 모든 해를 반환합니다.
$onEcho > 슬롯 게임102
solnpool병합 주사위Sols102.gdx
solnpool접두사 테스트102
solnpoolDup정책 3
solnpoolPop 2
solnpool자세함 2
mipabscutoff 19.5
* 기본적으로 풀의 용량은 매우 큽니다.
$offEcho
$call gams mip06.gms mip=슬롯 게임 optfile=102 --SKIPCUTS=1 lo=%GAMS.lo%
$if errorlevel 1 $abort 슬롯 게임 열거자를 사용하여 실행 102에 대한 솔루션을 생성하지 못했습니다.
$call gams poolObj.gms --infile=diceSols102 --outfile=diceObjs102 lo=%GAMS.lo%
$if errorlevel 1 $abort 계산/확인 목표가 실패했습니다.
* 809 솔 예상: obj=21일 때 15, obj=20일 때 794
p(풀) = 아니오; obj(풀) = 0; chk(풀) = 0;
Execute_load 'diceObjs102', p=pool, obj;
abort$[card(p) <> 809] '테스트 102: 809개의 솔루션이 있어야 합니다.', p, obj;
cnt = sump$[obj(p) = 21], 1;
abort$[cnt <> 15] '테스트 102: 21의 15개 솔루션이 있어야 합니다.', cnt, p, obj;
cnt = sump$[obj(p) = 20], 1;
abort$[cnt <> 794] '테스트 102: 20의 794개 솔루션이 있어야 함', cnt, p, obj;
* -----------------------------------------------
* 3. 최고의 솔루션 15개 반환
$onEcho > 슬롯 게임103
* 15개의 최고의 솔루션을 반환합니다.
* 고정된 용량이 있는 경우의 기본 동작입니다.
solnpool용량 15
solnpool병합 주사위Sols103.gdx
solnpool접두사 테스트103
solnpoolDup정책 3
solnpoolPop 2
solnpool자세함 2
$offEcho
$call gams mip06.gms mip=슬롯 게임 optfile=103 --SKIPCUTS=1 lo=%GAMS.lo%
$if errorlevel 1 $abort 슬롯 게임 열거자를 사용하여 실행 103에 대한 솔루션을 생성하지 못했습니다.
$call gams poolObj.gms --infile=diceSols103 --outfile=diceObjs103 lo=%GAMS.lo%
$if errorlevel 1 $abort 계산/확인 목표가 실패했습니다.
* obj=21일 때 15솔이 예상됩니다.
p(풀) = 아니오; obj(풀) = 0; chk(풀) = 0;
Execute_load 'diceObjs103', p=pool, obj;
abort$[card(p) <> 15] '테스트 103: 21의 15개 솔루션이 있어야 함', p, obj;
cnt = sump$[obj(p) = 21], 1;
abort$[cnt <> 15] '테스트 103: 21의 15개 솔루션이 있어야 합니다.', cnt, p, obj;
* -----------------------------------------------
* 4. 16개의 최고의 솔루션을 반환합니다.
$onEcho > 슬롯 게임104
* 16개의 최고의 솔루션을 반환합니다.
* 고정된 용량이 있는 경우의 기본 동작입니다.
solnpool용량 16
solnpool병합 주사위Sols104.gdx
solnpool접두사 테스트104
solnpoolDup정책 3
solnpoolPop 2
solnpool자세함 2
$offEcho
$call gams mip06.gms mip=슬롯 게임 optfile=104 --SKIPCUTS=1 lo=%GAMS.lo%
$if errorlevel 1 $abort 슬롯 게임 열거자를 사용하여 실행 104에 대한 솔루션을 생성하지 못했습니다.
$call gams poolObj.gms --infile=diceSols104 --outfile=diceObjs104 lo=%GAMS.lo%
$if errorlevel 1 $abort 계산/확인 목표가 실패했습니다.
* obj=21이면 15솔, obj=20이면 1솔이 예상됩니다.
p(풀) = 아니오; obj(풀) = 0; chk(풀) = 0;
Execute_load 'diceObjs104', p=pool, obj;
abort$[card(p) <> 16] '테스트 104: 16개의 솔루션이 있어야 합니다.', p, obj;
cnt = sump$[obj(p) = 21], 1;
abort$[cnt <> 15] '테스트 104: 21의 15개 솔루션이 있어야 합니다.', cnt, p, obj;
cnt = sump$[obj(p) = 20], 1;
abort$[cnt <> 1] '테스트 104: 20의 1개의 솔루션이 있어야 합니다.', cnt, p, obj;
* -----------------------------------------------
* 5. 150개의 최고의 솔루션을 반환합니다.
$onEcho > 슬롯 게임105
* 150개의 최고의 솔루션을 반환합니다.
* 고정된 용량이 있는 경우의 기본 동작입니다.
solnpool용량 150
solnpool병합 주사위Sols105.gdx
solnpool접두사 테스트105
solnpoolDup정책 3
solnpoolPop 2
solnpool자세함 2
$offEcho
$call gams mip06.gms mip=슬롯 게임 optfile=105 --SKIPCUTS=1 lo=%GAMS.lo%
$if errorlevel 1 $abort 슬롯 게임 열거자를 사용하여 실행 105에 대한 솔루션을 생성하지 못했습니다.
$call gams poolObj.gms --infile=diceSols105 --outfile=diceObjs105 lo=%GAMS.lo%
$if errorlevel 1 $abort 계산/확인 목표가 실패했습니다.
* obj=21이면 15솔, obj=20이면 135솔이 예상됩니다.
p(풀) = 아니오; obj(풀) = 0; chk(풀) = 0;
Execute_load 'diceObjs105', p=pool, obj;
abort$[card(p) <> 150] '테스트 105: 150개의 솔루션이 있어야 합니다.', p, obj;
cnt = sump$[obj(p) = 21], 1;
abort$[cnt <> 15] '테스트 105: 21의 15개 솔루션이 있어야 합니다.', cnt, p, obj;
cnt = sump$[obj(p) = 20], 1;
abort$[cnt <> 135] '테스트 105: 20의 135개 솔루션이 있어야 함', cnt, p, obj;
* -----------------------------------------------
* 6. 900개의 최고의 솔루션을 반환합니다.
$onEcho > 슬롯 게임106
* 900개의 최고의 솔루션을 반환합니다.
* 고정된 용량이 있는 경우의 기본 동작입니다.
solnpool용량 900
solnpool병합 주사위Sols106.gdx
solnpool접두사 테스트106
solnpoolDup정책 3
solnpoolPop 2
solnpool자세함 2
$offEcho
$call gams mip06.gms mip=슬롯 게임 optfile=106 --SKIPCUTS=1 lo=%GAMS.lo%
$if errorlevel 1 $abort 슬롯 게임 열거자를 사용하여 실행 106에 대한 솔루션을 생성하지 못했습니다.
$call gams poolObj.gms --infile=diceSols106 --outfile=diceObjs106 lo=%GAMS.lo%
$if errorlevel 1 $abort 계산/확인 목표가 실패했습니다.
* obj=21이면 15솔, obj=20이면 794솔, obj=19이면 91솔이 예상됩니다.
p(풀) = 아니오; obj(풀) = 0; chk(풀) = 0;
Execute_load 'diceObjs106', p=pool, obj;
abort$[card(p) <> 900] '테스트 106: 900개의 솔루션이 있어야 합니다.', p, obj;
cnt = sump$[obj(p) = 21], 1;
abort$[cnt <> 15] '테스트 106: 21의 15개 솔루션이 있어야 합니다.', cnt, p, obj;
cnt = sump$[obj(p) = 20], 1;
abort$[cnt <> 794] '테스트 106: 20의 794개 솔루션이 있어야 함', cnt, p, obj;
cnt = sump$[obj(p) = 19], 1;
abort$[cnt <> 91] '테스트 106: 19의 91개 솔루션이 있어야 합니다.', cnt, p, obj;
* -----------------------------------------------
* 7. obj 20 또는 21을 사용하여 처음 20개의 솔루션 반환
$onEcho > 슬롯 게임107
* obj >= 20인 처음 10개의 해를 반환합니다.
* cullRounds = 0으로 설정하면 풀이 가득 차자마자 열거가 중지됩니다.
mipabscutoff 19.5
solnpool용량 20
solnPoolCullRounds 0
solnpool병합 주사위Sols107.gdx
solnpool접두사 테스트107
solnpoolDup정책 3
solnpoolPop 2
solnpool자세함 2
$offEcho
$call gams mip06.gms mip=슬롯 게임 optfile=107 --SKIPCUTS=1 lo=%GAMS.lo%
$if errorlevel 1 $abort 슬롯 게임 열거자를 사용하여 실행 107에 대한 솔루션을 생성하지 못했습니다.
$call gams poolObj.gms --infile=diceSols107 --outfile=diceObjs107 lo=%GAMS.lo%
$if errorlevel 1 $abort 계산/확인 목표가 실패했습니다.
* obj >= 20인 경우 20솔이 예상됩니다.
p(풀) = 아니오; obj(풀) = 0; chk(풀) = 0;
Execute_load 'diceObjs107', p=pool, obj;
abort$[card(p) <> 20] '테스트 107: 20개의 솔루션이 있어야 합니다.', p, obj;
chk(p) = [obj(p) < 20];
abort$[card(chk)] '테스트 107: obj >= 20인 솔루션이 20개 있어야 합니다.', chk, p, obj;
* -----------------------------------------------
* 8. obj >= 18인 처음 200개의 솔루션 반환
$onEcho > 슬롯 게임108
* obj >= 18인 처음 200개의 해를 반환합니다.
* cullRounds = 0으로 설정하면 풀이 가득 차자마자 열거가 중지됩니다.
mipabscutoff 17.5
solnpool용량 200
solnPoolCullRounds 0
solnpool병합 주사위Sols108.gdx
solnpool접두사 테스트108
solnpoolDup정책 3
solnpoolPop 2
solnpool자세함 2
$offEcho
$call gams mip06.gms mip=슬롯 게임 optfile=108 --SKIPCUTS=1 lo=%GAMS.lo%
$if errorlevel 1 $abort 슬롯 게임 열거자를 사용하여 실행 108에 대한 솔루션을 생성하지 못했습니다.
$call gams poolObj.gms --infile=diceSols108 --outfile=diceObjs108 lo=%GAMS.lo%
$if errorlevel 1 $abort 계산/확인 목표가 실패했습니다.
* obj >= 18인 경우 200솔이 예상됩니다.
p(풀) = 아니오; obj(풀) = 0; chk(풀) = 0;
Execute_load 'diceObjs108', p=pool, obj;
abort$[card(p) <> 200] '테스트 108: 200개의 솔루션이 있어야 합니다.', p, obj;
chk(p) = [obj(p) < 18];
abort$[card(chk)] '테스트 108: obj >= 18인 200개의 솔루션이 있어야 합니다.', chk, p, obj;
* -----------------------------------------------
* 디버깅을 위해 정리를 건너뛸 수 있습니다. o/w 이 테스트는 엉망이 됩니다.
* $goTo 모두 완료
'rm -f 슬롯 게임10?'을 실행합니다.
'rm -f diceDef.gdx diceSols10?.gdx diceObjs10?.gdx'를 실행합니다.
$label alldone