설명
키워드: 혼합 정수 선형 계획법, 주사위 설계, 수학,
비전이적 주사위, 분해, 무료 슬롯 사이트 그리드 기능
대형 모델 유형 :MIP
카테고리 : 무료 슬롯 사이트 모델 라이브러리
메인 파일 : dicegrid.gms
$title MIP 분해 및 평행 그리드 제출 - DICE 예(DICEGRID,SEQ=330)
$onText
키워드: 혼합 정수 선형 계획법, 주사위 설계, 수학,
비전이적 주사위, 분해, 무료 슬롯 사이트 그리드 기능
$offText
$eolCom //
* 무료 슬롯 사이트 모델 라이브러리에서 모델 주사위를 검색하고 모델 소스를 포함합니다.
$call gamslib -q 주사위
$set nosolve yes // 주사위 모델 소스에 Solve 문을 건너뛰도록 지시합니다.
$include dice.gms
* 코드를 객관적인 방향과 어느 정도 독립적으로 만드는 일부 매크로 정의
$set gt '>' $set 컷오프 'cutlo' $set incumbentInit -INF
* 최소화 문제는 아래 줄을 사용하십시오.
*$set gt '<' $set 컷오프 'cutup' $set incumbentInit +INF
$onText
파일 및 컨테이너 이름
무료 슬롯 사이트 하위 프로그램
writeincb.gms 새로운 재직자가 나타날 때마다 무료 슬롯 사이트/Cplex가 호출하는 무료 슬롯 사이트 프로그램
Cplex 작업자가 발견했습니다.
checkincb.gms 마스터가 자주 호출하는 무료 슬롯 사이트 프로그램
Cplex 직원이 전반적으로 더 나은 재직자를 찾았습니다.
새로운 재임자의 경우, 이 프로그램은 다음 사항을 전달합니다.
모든 Cplex 작업자에 대한 기준으로 재직 값입니다.
무료 슬롯 사이트/Cplex 옵션 파일
cplex.opt 분해를 생성하는 'dumptree' 옵션을 포함합니다.
순차 제출의 경우 cplex.op2 작업자 옵션 파일
컷오프 옵션으로 사용되는 cplex.op3(checkincb.gms에서 작성, 작업자가 읽음)
userjobid가 있는 작업자에 대한 cplex.XXX XXX=100+userjobid(UJI) 옵션 파일
텍스트 파일
t%UJI%.trg 무료 슬롯 사이트/Cplex 작업에 cplex.op3을 읽도록 지시하는 트리거 이름
incb%UJD%.txt 현재 근로자 재직자 값
allincb.txt checkincb.gms에서 사용되는 작업 재직 값을 수집하기 위한 임시 파일
GDX 파일
bnd%UJI%.gdx 'dumptree' 옵션으로 생성된 분해 바운드 파일
기존 값 및 솔루션 값에 대한 incb.gdx 컨테이너 이름
bchout_i%UJI%.gdx 작업자 재직 솔루션은 writeincb.gms에 의해 처리됩니다.
$offText
* 원래 변수를 분해할 이진 변수 수 설정(참고: 2**nvars 작업)
$set nvars 4
$eval nsub 전력(2,%nvars%)
세트
s_grid '하위 문제' / 1*%nsub% /
nvars '시나리오에 대한 이진 변수' / 1*%nvars% /
up_down '바이너리 변수의 위/아래' / 위, 아래 /
bndUpdate(s_grid,nvars,up_down) '하위 문제에서 수정할 바이너리 변수' / system.PowerSetRight /;
파일
flog '로그에 쓸 파일 핸들' / '' /
fopt '옵션 파일을 쓰기 위한 파일 핸들' / 'cplex.opt' /;
$sTitle Parallel 병렬로 제출 및 해결
$onText
각 작업에 대한 Cplex 옵션 파일을 만듭니다. 이 옵션 파일은 다음을 지시합니다.
무료 슬롯 사이트/Cplex 작업자가 무료 슬롯 사이트 프로그램 writeincb.gms를 호출합니다.
(userincbicall) 근로자가 찾은 재직자를 구하기 위해. 그것은 또한
무료 슬롯 사이트/Cplex 작업에 트리거 파일(iatriggerfile)을 찾도록 지시합니다.
파일이 존재하는 경우 무료 슬롯 사이트/Cplex는 트리거 파일을 제거하고 읽습니다.
옵션 파일(iafile) 무료 슬롯 사이트/Cplex가 트리거 파일을 찾는 시간
(iatriggertime)은 1초로 설정되어 있는데, 이는 매우 작은 값이므로
더 어려운 문제의 경우 크게 증가했습니다.
이름 충돌로 인해 모든 통신 파일에는 다음이 붙습니다.
userjobid이며 무료 슬롯 사이트 작업 디렉터리가 앞에 붙습니다.
이전 버전에서는 무료 슬롯 사이트/Cplex 옵션 dumptree를 사용하여 다음을 수행할 수 있었습니다.
검색 공간을 분해합니다. 새로운 일반 제품으로
Cplex의 콜백은 더 이상 불가능하므로 생성해야 합니다.
다른 분해 방식. 여기서는 여러 변수를 선택합니다.
다양한 시나리오에서는 이를 0 또는 1로 수정합니다.
nsub+1 작업은 원래 문제에 대해 실행되고 찾는 데 중점을 둡니다.
좋은 실행 가능한 솔루션.
$offText
세트
selbvar(dice,f,fp) '분해할 변수를 선택했습니다'
bnvarmap(nvars,dice,f,fp) 'nvars와 selbvar 간의 매핑';
스칼라
diceOffSet, fOffSet, fpOffSet;
* 모델에서 무작위로 일부 이진 변수를 선택합니다.
반복하다
diceOffSet =uniformInt(0,card(dice)-1);
fOffSet =uniformInt(0,card(f)-1);
fpOffSet =uniformInt(0,card(fp)-1);
loop((dice,f,fp)$(sameas('dice1',dice) 및 sameas('face1',f) 및 sameas('face1',fp)),
selbvar(dice+diceOffSet,f+fOffSet,fp+fpOffSet) = yes);
카드(selbvar)>=%nvars%까지;
옵션 bnvarmap(nvars:selbvar);
* 파일을 제거하여 깨끗하게 시작하세요
$hiddenCall rm -f bch*.gdx t*.trg best_incumbent.gdx GMSbch*.*
스칼라 cnt;
for(cnt = 1 ~ %nsub%+1,
put_utility fopt 'ren' / 'cplex.' (100+CNT):0:0;
'userincbicall updateincb.gms lo=2appendLog=1'을 입력하세요.
/ 'userjobid' cnt:0:0
/ 'interactive 1' / 'iafile cplex.op3' / 'iatriggertime 1'
/ 'iatriggerfile t' cnt:0:0 '.trg'
/ '미페파시스 3';
put$(cnt=%nsub%+1) / '미페파시스 1';
);
putclose fopt;
* 고유한 뮤텍스 ID 생성
$eval mtxID round(frac(jnow)*24*60*60*1000)
$funcLibIn mtxlib mtxcclib
기능
생성 / mtxlib. 생성 /
timedLock / mtxlib.TimedLock /
잠금 해제 / mtxlib.Unlock /
삭제 / mtxlib.삭제 /;
abort$create(%mtxID%) '뮤텍스 생성 문제';
* 현재 가장 좋은 GDX 파일을 초기화합니다.
wnx.l = %incumbentInit%; Execute_unload 'best_incumbent.gdx', wnx; wnx.l = 0;
xdice.solveLink = %solveLink.asyncGrid%; // 무료 슬롯 사이트 그리드 제출을 사용합니다.
매개변수
h(s_grid) '작업 핸들';
옵션 optCr = 0, optCa = 0, solPrint = 자동, mip = cplex, limRow=0, limCol = 0, 스레드 = 1;
CNT = 0;
* 이제 업데이트된 범위를 사용하여 nsub 작업을 비동기식으로 제출합니다.
루프(s_grid,
CNT = CNT + 1;
xdice.optFile = 100 + cnt;
loop((bndUpdate(s_grid,nvars,'up') ,bnvarmap(nvars,selbvar)), comp.fx(selbvar) = 1);
loop((bndUpdate(s_grid,nvars,'down'),bnvarmap(nvars,selbvar)), comp.fx(selbvar) = 0);
mip max wnx를 사용하여 xdice를 해결합니다.
h(s_grid) = xdice.handle;
comp.lo(selbvar) = 0; comp.up(selbvar) = 1; // 경계 복원
);
* 실행 가능한 좋은 솔루션을 찾는 데 중점을 두고 직무를 제출하세요. 우리는
* 이 작업이 완료될 때까지 기다리지 않고 현재 사용하는 작업만 수행합니다.
* 조기에 좋은 컷오프 값을 갖습니다. 모든 하위 작업이 돌아온 후
* 재직 검색 작업이 계속 실행되면 종료가 트리거됩니다.
* 컷오프 업데이트를 트리거하는 것과 같은 방식입니다.
스칼라 feahandle;
xdice.optFile = 100+%nsub%+1;
mip max wnx를 사용하여 xdice를 해결합니다.
feashhandle = xdice.handle;
$ifThen ETIME_LIMIT가 설정되지 않았습니다.
* jobTrace는 slvtest가 이 모델을 호출하는 지표로 사용됩니다.
$ "%무료 슬롯 사이트jobTrace%"가 아닌 경우 $set ETIME_LIMIT 150
$ "%무료 슬롯 사이트jobTrace%"인 경우 $set ETIME_LIMIT INF
$endIf
매개변수
대표 '시대와 해결방안 보고'
etimeLim '수집 루프의 시간 제한' / %ETIME_LIMIT% /
;
* 수집
담당자(s_grid,'mstat') = na;
담당자(s_grid,'sstat') = na;
반복하다
loop(s_grid$handlecollect(h(s_grid)), // 작업이 완료되면 수집합니다.
담당자(s_grid,'time') = xdice.resUsd;
담당자(s_grid,'mstat') = xdice.modelStat;
담당자(s_grid,'sstat') = xdice.solveStat;
담당자(s_grid,'obj') = xdice.objVal;
display$handledelete(h(s_grid)) '핸들 삭제 문제';
h(s_grid) = 0;
);
display$sleep(card(h)*0.2) '한동안 자고 있었습니다';
카드(h) = 0 또는 timeelapsed > etimeLim까지;
스칼라 최적 '최적성 지표';
최적 = sum(s_grid$(rep(s_grid,'sstat')=1),1) = %nsub%;
채찍질하다;
put '*** 경과 시간 =' timeelapsed:7:2 /;
putclose$(card(h)>0) '*** ' 카드(h):0:0 ' 뛰어난 작업이 있습니다.' /;
abort.noError$[card(h)>0] '그리드 수집 루프가 너무 느림', etimeLim;
put$(notoptimal) '*** 일부 작업이 솔버 상태 <> 1로 반환되었습니다. 최적성은 보장되지 않습니다.' /;
abort$timedLock(%mtxID%,10000) '뮤텍스에 대한 잠금 획득 오류';
Execute_load 'best_incumbent.gdx', wnx;
abort$unlock(%mtxID%) '뮤텍스 잠금 해제 오류';
if(mapval(wnx.l)이 아님, // INF 또는 -INF가 아님
put$optimal '*** 최적의 솔루션을 찾았습니다: ' wnx.l /;
put$(notoptimal) '*** 가장 잘 수집된 솔루션: ' wnx.l /;
그렇지 않으면
put$optimal '*** 문제 발생 불가능' /;
put$(notoptimal) '*** 해법을 찾을 수 없음' /;
);
디스플레이 담당자;
* mipemphasis=1로 작업 종료
if(handlecollect(feahandle)가 아님,
put_utility 'shell' / 'echo tilim 0 > cplex.op3'
put_utility 'exec' / 'touch t' (%nsub%+1):0:0 '.trg'
display$sleep(3) '잠자기';
);
display$handledelete(feashhandle) '삭제 시도 중';
display$delete(%mtxID%) '뮤텍스 삭제 문제';
* 컴파일 시간 변수 userjobid(아마도 명령줄에서 설정)를 삭제하여
* updateincb.gms에는 %userjobid%가 그대로 있고 대체되지 않습니다.
$drop 사용자 작업 ID
$onEcho > updateincb.gms
$title best_incumbent.gdx를 업데이트하기 위한 %userjobid% 작업자의 코드
$onText
이는 기존 BCH 기능을 사용합니다. 무료 슬롯 사이트/Cplex는 전체를 내보냅니다.
bchout_i%userjobid%.gdx라는 GDX 컨테이너에 있습니다. 우리만
객관적인 변수가 필요합니다. 만약 소유자가 소유자보다 나은 경우
지금까지 가장 잘 알려진 재직자에 대해 우리는 다른 모든 직무에 새로운 컷오프를 알립니다.
$offText
변수 wnx /L 0/, wnx_bi /L 0/;
$gdxIn bchout_i%userjobid%.gdx
$loadM wnx
$gdxIn
$funcLibIn mtxlib mtxcclib
기능
timedLock / mtxlib.TimedLock /
잠금 해제 / mtxlib.Unlock /;
스칼라 cnt;
abort$timedLock(%mtxID%,10000) '뮤텍스에 대한 잠금 획득 오류';
Execute_load 'best_incumbent.gdx', wnx_bi=wnx;
if (wnx.l %gt% wnx_bi.l,
put_utility 'log' / '작업 %userjobid%가 ' wnx_bi.l:8:2 '에서 ' wnx.l:8:2'로 목표를 업데이트했습니다.
put_utility 'exec' / 'mv -f bchout_i%userjobid%.gdx best_incumbent.gdx';
* 무료 슬롯 사이트/Cplex 옵션 파일 cplex.op3을 새로운 컷오프 값으로 업데이트
put_utility 'shell' / 'echo %cutoff% ' wnx.l:18:8 ' > cplex.op3';
* 작업자가 새 컷오프 값을 읽을 수 있도록 트리거 파일을 만듭니다.
(cnt=1 ~ %nsub%+1,
put_utility$(cnt<>%userjobid%) 'exec' / 'touch t' cnt:0:0 '.trg'
);
)
abort$unlock(%mtxID%) '뮤텍스 잠금 해제 오류';
$offEcho