크레이지 슬롯gms : 확률론적 프로그래밍 시나리오 축소

설명

정제소는 원자재를 혼합하여 다양한 제품을 만들 수 있습니다. 현재,
경영진은 각 원자재의 양을 결정하려고 노력하고 있습니다.
수요를 충족시키기 위해 혼합될 수 있도록 구매하고 비축하는 것
미래 기간의 제품에 대해. 수요는 완전히 있어야합니다
만족하며, 원자재 부족시 제품을 생산할 수 있습니다.
더 높은 비용으로 아웃소싱합니다. 재고에 제약이 있어서
원자재를 전체적으로 비축할 수 있습니다.

Kall, P 및 Wallace, SW, 확률론적 프로그래밍. 존 와일리 앤 선즈,
1994년 영국 치체스터.

키워드: 선형 계획법, 확률론적 계획법, 혼합 문제

소형 모델 유형 :LP


카테고리 : 크레이지 슬롯 모델 라이브러리


메인 파일 : 크레이지 슬롯gms

$title 확률론적 프로그래밍 시나리오 축소(크레이지 슬롯SEQ=248)

$onText
정유소에서는 원자재를 혼합하여 다양한 제품을 만들 수 있습니다. 현재,
경영진은 각 원자재의 양을 결정하려고 노력하고 있습니다.
수요를 충족시키기 위해 혼합될 수 있도록 구매하고 비축하는 것
미래 기간의 제품에 대해. 수요는 완전히 있어야합니다
만족하며, 원자재 부족시 제품을 생산할 수 있습니다.
더 높은 비용으로 아웃소싱합니다. 재고에 제약이 있어서
원자재를 전체적으로 비축할 수 있습니다.

Kall, P 및 Wallace, SW, 확률론적 프로그래밍. 존 와일리 앤 선즈,
1994년 영국 치체스터.

키워드: 선형 계획법, 확률론적 계획법, 혼합 문제
$offText

세트
   i '원재료' / raw-1, raw-2 /
   j '제품' / p-1,p-2 /
   t '기간' / 시간-1, 시간-2 /
   n '노드' / n-0*n-12 /;

별칭(n,nn);

매개변수 c(i) '현재 원자재 가격' / raw-1 2, raw-2 3/;

테이블 a(j,i) '수익률'
         원시-1 원시-2
   p-1 2 6
   p-2 3 3.4;

표 f(j,t) '아웃소싱 비용'
         시간-1 시간-2
   p-1 7 10
   p-2 12 15;

스칼라 b '재고 용량' / 50 /;

테이블 stdat(n,*) '시나리오 트리 데이터'
          문제 p-1 p-2
   n-1 .3 200 180
   n-2 .4 180 160
   n-3 .3 160 140
   n-4 .2 200 180
   n-5 .5 180 160
   n-6 .3 160 140
   n-7 .3 200 180
   n-8 .4 180 160
   n-9 .3 160 140
   n-10 .4 200 180
   n-11 .4 180 160
   n-12 .2 160 140;

세트
   tn(t,n) '시간 노드 매핑' / time-1.(n-1*n-3), time-2.(n-4*n-12) /
   tree(n,n) / n-0.(n-1*n-3), n-1.(n-4*n-6), n-2.(n-7*n-9), n-3.(n-10*n-12) /
   sn(n) '축소된 하위 트리에 있는 노드의 하위 집합'
   leaf(n) '원래 트리의 리프 노드';

leaf(n)$(sum(tn('time-2',n), 1)) = 예;
디스플레이 리프;

매개변수
   dem(j,n) '확률적 수요'
   prob(n) '노드 확률'
   sprob(n) '축소 트리의 노드 확률';

dem(j,n) = stdat(n,j);
prob('n-0') = 1;
prob(n)$tn('time-1',n) = stdat(n,'prob');
prob(n)$tn('time-2',n) = sum(tree(nn,n), stdat(nn,'prob')*stdat(n,'prob'));

디스플레이 문제;

변수
   x(i,t) 't 시간에 사용하기 위해 구매한 원자재'
   y(j,t,n) '아웃소싱 제품'
   비용;

양수 변수 x, y;

방정식
   obj '총 비용 정의'
   발 '구매 한도'
   dembal(j,t,n) '수요 잔액';

obj.. 비용 =e= sum((i,t), c(i)*x(i,t)) + sum((j,tn(t,sn)), sprob(sn)*f(j,t)*y(j,tn));

bal..sum((i,t), x(i,t)) =l= b;

dembal(j,tn(t,sn))..sum(i, a(j,i)*x(i,t)) + y(j,tn) =g= dem(j,sn);

* SPOSL 시스템을 사용하려면 더미 링크를 삽입해야 합니다.
* 2단계와 3단계 사이. 이러한 링크가 없으면 SPOSL 시스템은
* 서로 다른 하위 문제 구조를 가진 2단계 문제만 식별합니다.
* EPS 값은 숫자 값이 포함된 제약 항목을 삽입하는 데 사용됩니다.
* 0입니다.

방정식 dembalx(j,t,n) '백링크를 포함하도록 수정된 수요 잔액';

dembalx(j,tn(t,sn)).. sum(i, a(j,i)*x(i,t)) + y(j,tn) =g= dem(j,sn) + eps*sum(tree(nn,sn), y(j,t-1,nn));

모델 크레이지 슬롯 / obj, bal, dembalx /;

$if noscenred로 설정됨 $goTo noscenreduction

* 이제 ScenRed를 실행할 준비를 합니다.
* 여기에는 Scenred I/O에 사용되는 일부 세트 및 매개변수가 포함됩니다.
$libInclude cenred.gms

스칼라 psum, rc, runCount, runMax;

세트
   실행 / run1*run9 /
   method '사용된 감소 방법' / '0-default', '1-fastback'
                                    '2-패스트백+앞으로', '3-패스트백+뒤로' /;

매개변수 보고서(method,run,*);

Set rleaf(method,run,n) '축소된 트리의 리프 세트';

runMax = inf;
$if set runmax runMax = %runmax%;

ScenRedParms('report_level') = 0;
실행카운트 = 0;
loop(메소드$(runCount < runMax),
   ScenRedParms('reduction_method') = ord(method) - 1;
   loop(run$(runCount < runMax),
* 이 매개변수는 ScenRed의 트리 출력을 제어합니다.
* 다음 두 매개변수 중 하나 이상이 필요합니다.
      ScenRedParms('red_num_leaves') = ord(run);
* ScenRedParms('red_percentage') = 0.5;

$ libInclude scenred kandw scen_red n tree prob na sprob dem

      sn(n) = sprob(n);
      ScenRedParms, ScenRedReport, sprob, sn을 표시합니다.

      psum = sumleaf(sn), sprob(sn);
      abort$[abs(psum-1) > 1e-8] "축소된 트리에 오류가 있습니다. 리프 확률의 합이 1이 아닙니다.";

      lp를 사용하여 크레이지 슬롯 최소 비용을 해결합니다.
      runCount = runCount + 1;

      보고서(방법,실행, 'obj') = 크레이지 슬롯objval;
      Report(method,run, 'red_percentage') = ScenRedReport('red_percentage');
      Report(method,run, 'reduction_method') = ScenRedReport('reduction_method');
      Report(method,run, 'run_time') = ScenRedReport('run_time');
      rleaf (메소드, 실행, 리프(sn)) = 예;
   );
);

보고서 표시, rleaf;

$onText
* 여기에서 다른 전략을 실험해 보세요.
* 크기가 아닌 거리 측면에서 원하는 축소를 설정합니다.
* 또한 원래 트리를 두 번 이상 버릴 필요가 없습니다.
ScenRedParms('red_num_leaves') = 0;

매개변수 보고서2(method,run,*);

Set rleaf2(method,run,n) '축소된 트리의 리프 세트';

실행카운트 = 0;
loop(메소드$(runCount < runMax),
   ScenRedParms('reduction_method') = ord(method) - 1;
   loop(run$((runCount < runMax) and (ord(run) <= 5)),
      ScenRedParms('red_percentage') = ord(run)/4;

$ libInclude scenred kandw scen_red n tree prob na sprob dem

      sn(n) = sprob(n);
      ScenRedParms, ScenRedReport 표시, sprob 표시, sn;

      psum = sum leaf(sn), sprob(sn);
      abort$[abs(psum-1) > 1e-8] "축소된 트리에 오류가 있습니다. 리프 확률의 합이 1이 아닙니다.";

      lp를 사용하여 크레이지 슬롯 최소 비용을 해결합니다.
      runCount = runCount + 1;

      Report2(method,run, 'obj') = 크레이지 슬롯objval;
      Report2(method,run, 'red_percentage') = ScenRedReport('red_percentage');
      Report2(method,run, 'red_leaves') = ScenRedReport('red_leaves');
      Report2(method,run, 'reduction_method') = ScenRedReport('reduction_method');
      Report2(method,run, 'run_time') = ScenRedReport('run_time');
      rleaf2 (메소드, 실행, 리프(sn)) = 예;
   );
);

보고서2, rleaf2를 표시합니다.
$offText

$goTo 모두 완료

$label NoScenReduction
* "축소된 트리"를 전체 트리로 설정
sn(n) = 예;
sprob(n) = prob(n);

lp를 사용하여 크레이지 슬롯 최소 비용을 해결합니다.

$label alldone