설명
이러한 모델 중 일부에는 거대한 시나리오 트리가 있습니다. 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