gussgrid.gms : 간단한 GUSS 그리드 예시

설명

GUSS는 관련 컬렉션의 최적화를 촉진하는 프로시저입니다.
해당 문제의 데이터를 수정하는 데 문제가 있습니다. 24.3 GUSS까지 결합 불가
피망 슬롯 그리드 기능을 사용합니다. 피망 슬롯 그리드 기능을 사용하면 데이터를 쉽게 분할할 수 있습니다.
여러 세트로 설정된 시나리오(예: 실행 중인 CPU/코어 수)
기계) 병렬 기계 전력을 활용합니다.

소형 모델 유형 :LP


카테고리 : 피망 슬롯 모델 라이브러리


메인 파일 : gussgrid.gms

$title 간단한 GUSS 그리드 예(GUSSGRID,SEQ=400)

$onText
GUSS는 관련 컬렉션의 최적화를 촉진하는 절차입니다.
해당 문제의 데이터를 수정하는 데 문제가 있습니다. 24.3 GUSS까지 결합 불가
피망 슬롯 그리드 기능을 사용합니다. 피망 슬롯 그리드 기능을 사용하면 데이터를 쉽게 분할할 수 있습니다.
여러 세트로 설정된 시나리오(예: 실행 중인 CPU/코어 수)
기계) 병렬 기계 전력을 활용합니다.

Bussieck, MR, Ferris, MC 및 Lohmann, T, GUSS: 데이터 수집 해결
피망 슬롯 내의 관련 모델. Kallrath, J, Ed, 대수 모델링 시스템:
실제 최적화 문제 모델링 및 해결. 스프링거, 베를린
하이델베르그, 2012, pp. 35-56.

키워드: 선형 계획법, 운송 문제, 스케줄링, GUSS, 시나리오
          분석, 그리드 시설
$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.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);

모델 운송 / 모두 /;

$whatrun을 설정하지 않은 경우 $set whatrun 4_100
$goTo %whatrun%

$라벨 4_10000
세트
   ScenariosToRun '시나리오' / s1*s10000 /
   CPU '실행할 그리드 작업' / cpu1*cpu4 /
   scpu(cpu,ScenariosToRun) / cpu1.( s1* s2500)
                              CPU2.(s2501* s5000)
                              CPU3.(s5001* s7500)
                              CPU4.(s7501*s10000) /;

$goTo 계속
$라벨 4_100
세트
   ScenariosToRun '시나리오' / s1*s100 /
   CPU '실행할 그리드 작업' / cpu1*cpu4 /
   scpu(cpu,실행할 시나리오) / cpu1.( s1* s25)
                                 CPU2.(s26* s50)
                                 CPU3.(s51* s75)
                                 CPU4.(s76*s100) /;

$goTo 계속
$레이블 1_10000
세트
   ScenariosToRun '시나리오' / s1*s10000 /
   CPU '실행할 그리드 작업' / CPU1 /
   scpu(cpu,ScenariosToRun) / cpu1.(s1*s10000) /;

$goTo 계속
$label 계속
별칭(ScenariosToRun,s)

매개변수
   newsupply(s,*) '업데이터'
   newdemand(s,*) 'b에 대한 업데이트'
   resultantx(s,i,j) 'x 레벨에 대한 수집기';

새로운 수요(s,j) = 정상(b(j),0.1);
newsupply(s,i) = Normal(a(i),0.1);

* 우리가 실행 불가능하게 되지 않도록 하세요
newdemand(s,'total') = sum(j,newdemand(s,j));
newsupply(s,'total') = sum(i,newsupply(s,i));
newsupply(s,i)$(newdemand(s,'total') > newsupply(s,'total')) =
                newsupply(s,i)*(newdemand(s,'total') + 1)/newsupply(s,'total');

* 총계를 지우세요. 그렇지 않으면 GUSS에서 일치하지 않는 기록을 얻습니다.
새로운 수요(들,'총') = 0;
newsupply(s,'total') = 0;

세트
   gs(s) 'GUSS 실행당 시나리오'
   dict / gs. 시나리오.''
           가.  매개변수 .newsupply
           b.  매개변수 .newdemand
           x.  레벨 .resultantx /;

매개변수 h(cpu) '그리드 핸들';
Transport.solveLink = %solveLink.asyncGrid%;

옵션 limRow = 0, limCol = 0;

$eolCom //
루프(CPU,
   gs(s) = scpu(cpu,s);
   z 시나리오 dict를 최소화하는 lp를 사용하여 전송을 해결합니다.
   h(cpu) = 전송.핸들;  // 인스턴스 핸들 저장
);

$ifThen ETIME_LIMIT가 설정되지 않았습니다.
* jobTrace는 slvtest가 이 모델을 호출하는 지표로 사용됩니다.
$ "%피망 슬롯jobTrace%"가 아닌 경우 $set ETIME_LIMIT 30
$ "%피망 슬롯jobTrace%"인 경우 $set ETIME_LIMIT INF
$endIf
스칼라 etimeLim '수집 루프의 시간 제한' / %ETIME_LIMIT% /;

* 핸들 매개변수를 사용하여 솔루션과 시나리오를 나타냅니다.
* 결과가 수집되었습니다. 기본적으로(solvopt 옵션으로 변경) 다음을 수행합니다.
* 솔루션과 시나리오 결과의 병합
반복하다
   루프(cpu$handlecollect(h(cpu))),
      display$handledelete(h(cpu)) '핸들 삭제 문제';
      시간(CPU) = 0;   // 솔루션을 로드했음을 나타냅니다.
   );
   display$sleep(card(h)*0.2) '한동안 자고 있었습니다';
카드(h) = 0 또는 timeelapsed > etimeLim까지;  // 모든 모델이 로드되거나 시간 제한에 도달할 때까지 기다립니다.
abort.noError$[card(h)>0] '수집 루프의 시간 제한 적중', etimeLim, h;

x수집된 항목을 설정합니다.

옵션 xcollected < 결과x;
abort$(card(xcollected) <> card(ScenariosToRun)) '모든 시나리오가 수집되지는 않음',
                                                  x수집, 결과x;