tr20.gms : 확률론적 수요와 비용을 고려한 확장된 운송 모델

설명

이러한 모델 중 일부에는 거대한 시나리오 트리가 있습니다. DECIS는 이를 다음과 같이 해결합니다.
일부 내부 샘플링 루틴은 DE와 LINDO는 다음으로 종료되어야 합니다.
유용한 오류 메시지. DECISC를 실행하려면 명령줄 매개변수를 제공하세요.
--RUNDECISLP=1

대형 모델 유형 :SP


카테고리 : 슬롯 나라 EMP 라이브러리


메인 파일 : tr20.gms

$title 확률론적 수요와 비용을 갖는 확장된 운송 모델 (tr20,SEQ=84)

* 이러한 모델 중 일부에는 거대한 시나리오 트리가 있습니다. DECIS는 이를 다음과 같이 해결합니다.
* 일부 내부 샘플링 루틴, DE와 LINDO는 다음으로 종료되어야 합니다.
* 유용한 오류 메시지. DECISC를 실행하려면 명령줄 매개변수를 제공하세요.
* --RUNDECISLP=1

세트 c
    ck(c) 센터
    cc(c) 도시
    stoch / 발, prob /
    r / l, m, h /;

매개변수 coord(c,*);
매개변수 dist(c,c);
매개변수 b(c,c);
매개변수 rv(stoch,r)
별칭(c,cp);

$gdxIn tr20_scen
$load c ck cc coord dist b rv

매개변수 한 대 트럭의 최대 용량 / 10.0 /
           cf 마일당 및 트럭당 운송 비용 - 완전 주행 / 0.2 /
           ce 마일당 및 트럭당 운송비 - 공회전 / 0.18 /
           b(c,c) 중심지와 도시의 수요
           maxt 최대 트럭 수;

dnet(c,c) 설정; dnet(ck,cc) = 예; dnet(cc,ck) = 예;
enet(c,c)를 설정합니다. enet(c,cp) = 동일하지 않음(c,cp);

maxt=sum(dnet(c,cp), b(dnet));

매개변수
      df(c,c) 임의 수요율
      cr(c,c) 마일당 상환 비용(트럭 임대)
      crr(c,r) cr의 확률적 결과;

$로드 crr

* ----------------------------------
* 핵심 모델 정의
* ----------------------------------

무료 가변 z 총 비용;

양수 변수 f(c,c) 전체 실행
                   e(c,c) 빈 실행
                   y(c,c) 의지
                   a(c) 할당
                   stayat(c) c에 머무르는 트럭 - 즉, 가득 차거나 비어 있는 운행이 없습니다.

방정식
         tcosts는 목적 함수를 정의합니다.
         수요(c,c)는 중심지와 모든 도시의 수요를 충족시킵니다.
         node(c) 트럭에 대한 노드 제약 조건
         maxtruck 할당할 최대 트럭 수;

tcosts .. z =e= sum(dnet(c,cp), dist(dnet)*(cf*f(dnet) + cr(dnet)*y(dnet)))
                 + sum(enet(c,cp), ce*dist(enet)*e(enet));

수요(dnet(c,cp)).. f(dnet)*cap + y(dnet) =g= df(dnet)*b(dnet);

node(c) .. sum(dnet(c,cp), f(c,cp)) + sum(enet(c,cp), e(enet)) + stayat(c)
           =e= a(c) + sum(enet(cp,c), e(enet));

maxtruck.. cap*sum(c, a(c)) =l= 0.9*maxt;

모델 전송 /tcosts,수요,노드,maxtruck/;

s 시나리오 설정 / s1*s100 /;

매개변수 s_df(s,c,c);
dict/s .scenario를 설정하세요.''
           df.randvar. s_df/;

df(dnet) = 1;
cr(dnet(c,cp)) = crr(c,'m');

파일 emp / '%emp.info%' /; put emp '* 문제 %슬롯 나라i%';
루프(dnet,
   put / 'randvar ' df.tn(dnet) ' 이산 '
   loop(r, put rv('prob',r):5:2 rv('val',r):5:2));
   put / '2단계 df f e y 수요 노드 유지';
닫다;

emp 시나리오 dict를 사용하여 전송 최소 z를 해결합니다.

$설정되지 않은 경우 RUNDECISLP $set RUNDECISLP 0
$ifThen %RUNDECISLP%==1
a.stage(c) = 1;
e.stage(enet) = 2;
f.stage(dnet) = 2;
y.stage(dnet) = 2;
stayat.stage(c) = 2;

maxtruck.stage = 1;
수요.단계(dnet) = 2;
node.stage(c) = 2;

* ----------------------------------
* 확률론적 파일 출력
* ----------------------------------

파일 stg / MODEL.STG /;
stg를 넣어;
"INDEP DISCRETE"를 입력하세요. /;
루프(dnet(c,cp),
  루프(r,
    put "RHS 수요 ", c.tl:6," ", cp.tl:6, (b(c,cp)*rv("val",r)), " period2", rv("prob", r)/;
  );
  "*" 넣기 /;
);
putclose stg;
* ----------------------------------
* 모델을 해결
* ----------------------------------

옵션 lp=결정;
z를 최소화하는 lp를 사용하여 전송을 해결합니다.
옵션 lp=기본값;
$endIf

* 샘플링
스칼라 h1;

루프(들,
  루프(dnet,
    h1=균일(0,1);
    if( h1<rv('prob','l') ,
      s_df(s,dnet)=rv('val','l');
    elseif h1<=(rv('prob','l')+rv('prob','m')),
      s_df(s,dnet)=rv('val','m');
    그렇지 않으면
      s_df(s,dnet)=rv('val','h');
    );
  );
);

put emp '* 문제 %슬롯 나라i%';
넣다 / 'jrandvar'
loop(dnet, put df.tn(dnet));
루프(들,
  넣다 (1/카드):8:6;
  loop(dnet, put s_df(s,dnet):5:2; );
);
put / '2단계 df f e y 수요 노드 유지';
닫다;

emp 시나리오 dict를 사용하여 전송 최소 z를 해결합니다.

매개변수 s_cr(s,c,c);

dict2 / s .scenario를 설정하세요.''
            df.randvar. s_df
            cr.randvar. s_cr/;

put emp '* 문제 %슬롯 나라i%';
루프(dnet(c,cp),
   put / 'jrandvar ' df.tn(dnet) ' ' cr.tn(dnet)
   loop(r, put rv('prob',r):5:2 rv('val',r):5:2 crr(c,r):6:3));
   put / '2단계 df cr f e y stayat 수요 노드';
닫다;

emp 시나리오 dict2를 사용하여 전송 최소 z를 해결합니다.

$설정되지 않은 경우 RUNDECISLP $set RUNDECISLP 0
$ifThen %RUNDECISLP%==1
* ----------------------------------
* 확률론적 파일 출력
* ----------------------------------

stg를 넣어;
"BLOCK DISCRETE"를 입력하세요. /;
스칼라 blkcnt /1/
루프(dnet(c,cp),
   루프(r,
      put 'BL ' blkcnt:0:0 '_' r.tl ' PERIOD2 ' rv("prob", r):8:6/;
      put 'y ',c.tl:6 ' ', cp.tl:6 ' tcosts ',crr(c,r):12:6/;
      "RHS 수요", c.tl:6," ", cp.tl:6, (b(c,cp)*rv("val",r)):12:6/;
   );
   blkcnt = blkcnt+1;
   "*" 넣기 /;
);
putclose stg;
* ----------------------------------
* 모델을 해결
* ----------------------------------

옵션 lp=결정;
z를 최소화하는 lp를 사용하여 전송을 해결합니다.
$endIf