설명
이 문제는 다음을 충족하는 최소 비용 배송 일정을 찾습니다. 시장의 요구사항과 공장의 공급품. 이 모델은 다양한 시나리오를 실행하는 방법을 보여줍니다. 슬롯 비동기 그리드를 사용하여 병렬 방식으로 수요를 스레드 시설. 이 모델은 단일 작업으로 작업을 제출하고 수집합니다. 루프. 이를 통해 작업 중에 활성 작업의 총 수를 제어할 수 있습니다. 전체 실행.
소형 모델 유형 :LP
카테고리 : 슬롯 모델 라이브러리
메인 파일 : tgridmix.gms
단일 제출 및 수집 루프로 인한 $title Grid/MT 전송 문제(TGRIDMIX,SEQ=391)
$onText
이 문제는 다음을 충족하는 최소 비용 배송 일정을 찾습니다.
시장의 요구사항과 공장의 공급품.
이 모델은 다양한 시나리오를 실행하는 방법을 보여줍니다.
슬롯 비동기 그리드를 사용하여 병렬 방식으로 수요를
스레드 시설. 이 모델은 단일 작업으로 작업을 제출하고 수집합니다.
루프. 이를 통해 작업 중에 활성 작업의 총 수를 제어할 수 있습니다.
전체 실행.
Dantzig, GB, 3.3장. 선형 프로그래밍 및 확장.
프린스턴 대학 출판부, 뉴저지주 프린스턴, 1963년.
키워드: 선형 계획법, 운송 문제, 스케줄링, 시나리오 분석
$offText
세트
i '통조림 식물' / 시애틀, 샌디에이고 /
j 'markets' / 뉴욕, 시카고, 토피카 /;
매개변수
a(i) '경우에 따라 식물 i의 용량'
/시애틀 350
샌디에이고 600 /
b(j) '경우에 따라 시장 j의 수요'
/ 뉴욕 325
시카고 300
토피카 275 /;
테이블 d(i,j) '거리(천 마일)'
뉴욕 시카고 토피카
시애틀 2.5 1.7 1.8
샌디에고 2.5 1.8 1.4;
스칼라 f '1,000마일당 케이스당 운임(달러)' / 90 /;
매개변수 c(i,j) '케이스당 운송 비용(단위: 수천 달러)';
c(i,j) = f*d(i,j)/1000;
변수
x(i,j) '케이스의 선적 수량'
z '총 운송 비용(천 달러)';
양수 변수 x;
방정식
비용 '목적 함수 정의'
Supply(i) '공장 i의 공급 제한을 준수합니다.'
수요(j) '시장 j의 수요를 충족';
비용.. z =e= sum((i,j), c(i,j)*x(i,j));
공급(i).. sum(j, x(i,j)) =l= a(i);
수요(j)..sum(i, x(i,j)) =g= b(j);
모델 운송 / 모두 /;
$eolCom //
Transport.limCol = 0;
Transport.limRow = 0;
Transport.solPrint = %solPrint.quiet%;
$스레드를 설정하지 않은 경우 $set 스레드 4
옵션 threadAsync = %threads%;
세트
$numscen을 설정하지 않은 경우 $set numscen 10
'시나리오' / 1*%numscen% /
sl '해결 링크'
submit(s) '제출할 작업 목록'
done(s) '완료된 작업 목록';
$ifThen ETIME_LIMIT가 설정되지 않았습니다.
* jobTrace는 slvtest가 이 모델을 호출하는 지표로 사용됩니다.
$ "%슬롯jobTrace%"가 아닌 경우 $set ETIME_LIMIT 10
$ if "%슬롯jobTrace%" $set ETIME_LIMIT 9e9
$endIf
매개변수
$ifThen 비동기 유형을 설정하지 않음
slnum(sl<)'solvelink 번호' / 스레드 %solveLink.asyncThreads%
그리드 %solveLink.asyncGrid% /
$else
slnum(sl<)'solvelink 번호' / %asynctype% /
$endif
dem(s,j) '임의 수요'
h(s) '인스턴스 핸들을 저장합니다'
repx '솔루션 보고서'
'요약 보고서' 답장
maxS '최대 활성 작업 수' / %threads% /
etimeLim '수집 루프의 시간 제한' / %ETIME_LIMIT% /
t'타임 스탬프' 시작;
dem(s,j) = b(j)*uniform(.95,1.15); // 임의의 요구사항 생성
루프(sl,
tStart = jnow;
repy(sl,s,'solvestat') = na;
repy(sl,s,'modelstat') = na;
완료 = 아니요;
h(s) = 0;
Transport.solveLink = slnum(sl);
반복하다
제출 = 아니요;
loop(s$(not (완료 또는 h(들))), submit(s) = yes$(card(submit) + 카드(h) < maxS));
루프(제출,
b(j) = dem(s,j);
$if 수면 설정 표시$sleep(%sleep%) '조금만 자세요';
z를 최소화하는 lp를 사용하여 전송을 해결합니다.
h(s) = 운송.핸들;
);
display$readyCollect(h) '다음 인스턴스가 완료되기를 기다리는 중';
루프(s$handleCollect(h(s))),
repx(sl,s,i,j) = x.l(i,j);
repy(sl,s,'solvestat') = Transport.solveStat;
repy(sl,s,'modelstat') = Transport.modelStat;
repy(sl,s,'resusd' ) = Transport.resUsd;
repy(sl,s,'objval') = 전송.objVal;
display$handleDelete(h(s)) '핸들 삭제 문제';
완료 = 예;
h(s) = 0;
);
카드(완료) = 카드 또는 경과 시간 > etimeLim까지; // 모든 모델 결과가 수집되거나 시간 제한이 있을 때까지 기다립니다.
abort.noError$[card(done) <> 카드] '그리드 수집 루프가 너무 느림', etimeLim, h, repy;
repy(sl,'time','elapsed') = (jnow - tStart)*3600*24;
abort$sum(s$(repy(sl,s,'solvestat') = na 또는 repy(sl,s,'solvestat') = %solveStat.licensingProblems%),1) '일부 작업이 반환되지 않았거나 라이센스 문제가 있었습니다.', h, repy;
);
응답 표시, 응답;