설명
슬롯 무료체험 솔루션 열거자를 테스트합니다. 테스트하기 위해 우리는 다음의 변형을 사용합니다. 주사위 모델(동일한 내용이 여러 번 표현되지 않도록 조정됨) 솔루션). 테스트 모델은 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개 솔루션 반환 기고자: Steve Dirkse, 2012년 1월
소형 모델 유형 :MIP
카테고리 : 슬롯 무료체험 테스트 라이브러리
메인 파일 : xpress05.gms
$title 슬롯 무료체험 테스트 모음 - 솔루션 열거자 예(XPRESS05,SEQ=554)
$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개 솔루션 반환
기고자: Steve Dirkse, 2012년 1월
$offText
$ifThen %DEMOSIZE% == 1
$ log 이 테스트는 너무 커서 데모 모드에서 실행할 수 없습니다. 종료합니다.
$ 중단.noError
$endIf
$존재하지 않는 경우 mip06.gms $call testlib -q mip06
$onEcho > poolObj.gms
* 솔루션을 읽고 목표를 계산합니다.
세트
풀 '솔루션 생성'
p2(풀)
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(d,f,v) '주사위 면을 값에 매핑'
;
$gdxIn 주사위Def
$load fd v vals
$gdxIn
$gdxIn %INFILE%
$로드 풀=인덱스
$gdxIn
Execute_unload '%OUTFILE%', 확인;
알았어 = 525;
파일 fpool;
루프풀,
p2(풀) = 아니요; p2(풀) = 예;
put_utility fpool 'gdxin' / pool.te(pool);
Execute_loadpoint mapv=map;
map(d,f,v) = round(mapv.l(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
세트
풀 '가능한 솔루션' / file1*file999 /
p(풀)
;
매개변수
obj(풀)
chk(풀)
;
스칼라 cnt;
* -----------------------------------------------
* 1. 모든 최적의 솔루션을 반환합니다(예: obj = 21).
$onEcho > 슬롯 무료체험101
솔풀 주사위Sols101.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
솔풀 주사위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
솔풀 주사위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
솔풀 주사위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
솔풀 주사위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
솔풀 주사위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인 처음 20개의 해를 반환합니다.
* cullRounds = 0으로 설정하면 풀이 가득 차자마자 열거가 중지됩니다.
mipabscutoff 19.5
solnpool용량 20
solnPoolCullRounds 0
솔풀 주사위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;
* abort$[card(p) > 11] '테스트 107: 10(아마도 11)개의 솔루션이 있어야 합니다.', 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
솔풀 주사위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 test10?_dice_p*.gdx'를 실행합니다.
'rm -f diceDef.gdx diceSols10?.gdx diceObjs10?.gdx'를 실행합니다.
$label alldone