trnsgrid.gms : 그리드 운송 문제

설명

이 문제는 다음을 충족하는 최소 비용 배송 일정을 찾습니다.
시장의 요구사항과 공장의 공급품.

이 모델은 다양한 시나리오를 실행하는 방법을 보여줍니다.
슬롯 사이트 추천 그리드 기능을 사용하여 병렬 방식으로 수요를 처리합니다.

소형 모델 유형 :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) '일부 작업이 반환되지 않았습니다.';