설명
이 문제는 다음을 충족하는 최소 비용 배송 일정을 찾습니다. 시장의 요구사항과 공장의 공급품. 이 모델은 다양한 시나리오를 실행하는 방법을 보여줍니다. 슬롯 사이트 추천 그리드 기능을 사용하여 병렬 방식으로 수요를 처리합니다.
소형 모델 유형 :LP
카테고리 : 슬롯 사이트 추천 모델 라이브러리
메인 파일 : trnsgrid.gms
$title 그리드 운송 문제 (TRNSGRID,SEQ=315)
$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;
* 모델 인덱스를 제한하는 방법 시연
ij(i,j)를 설정합니다. ij(i,j) = 예;
방정식
비용 '규모의 경제로 목적 함수를 정의'
Supply(i) '공장 i의 공급 제한을 준수합니다.'
수요(j) '시장 j의 수요를 충족';
비용.. z =e= sum(ij(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.solveLink = %solveLink.asyncGrid%; //그리드 옵션을 켠다
Transport.limCol = 0;
Transport.limRow = 0;
Transport.solPrint = %solPrint.quiet%;
s '시나리오' 설정 / 1*5 /;
매개변수
dem(s,j) '임의 수요'
h(s) '인스턴스 핸들 저장';
dem(s,j) = b(j)*uniform(.95,1.15); // 임의의 요구사항 생성
루프(들,
b(j) = dem(s,j);
z를 최소화하는 lp를 사용하여 전송을 해결합니다.
h(s) = 운송.핸들; // 인스턴스 핸들 저장
);
$ifThen ETIME_LIMIT가 설정되지 않았습니다.
* jobTrace는 slvtest가 이 모델을 호출하는 지표로 사용됩니다.
$ "%슬롯 사이트 추천jobTrace%"가 아닌 경우 $set ETIME_LIMIT 10
$ "%슬롯 사이트 추천jobTrace%"인 경우 $set ETIME_LIMIT INF
$endIf
매개변수
etimeLim '수집 루프의 시간 제한' / %ETIME_LIMIT% /
repx(s,i,j) '솔루션 보고서'
'요약 보고서'를 답장하세요.
repy(s,'solvestat') = na;
repy(s,'modelstat') = na;
* 핸들 매개변수를 사용하여 솔루션이 수집되었음을 나타냅니다.
반복하다
루프(s$handlecollect(h(s))),
repx(s,i,j) = x.l(i,j);
repy(s,'solvestat') = Transport.solveStat;
repy(s,'modelstat') = Transport.modelStat;
repy(s,'resusd' ) = Transport.resUsd;
repy(s,'objval') = 전송.objVal;
display$handledelete(h(s)) '핸들 삭제 문제';
h(s) = 0; // 솔루션을 로드했음을 나타냅니다.
);
display$sleep(card(h)*0.2) '한동안 자고 있었습니다';
카드(h) = 0 또는 timeelapsed > etimeLim까지; // 모든 모델이 로드될 때까지 기다립니다.
응답 표시, 응답;
abort.noError$[card(h)>0] '그리드 수집 루프가 너무 느림', etimeLim, h;
abort$sum(s$(repy(s,'solvestat') = na),1) '일부 작업이 반환되지 않았습니다.';