tgridmix.gms: 단일 제출 및 수집 루프로 인한 그리드 전송 문제

설명

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

이 모델은 다양한 시나리오를 실행하는 방법을 보여줍니다.
슬롯 무료체험 비동기 그리드를 사용하여 병렬 방식으로 수요를
스레드 시설. 이 모델은 단일 작업으로 작업을 제출하고 수집합니다.
루프. 이를 통해 작업 중에 활성 작업의 총 수를 제어할 수 있습니다.
전체 실행.

소형 모델 유형 :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;
);
응답 표시, 응답;