설명
운동, p. 44: 클리어 레이크 댐(Clear Lake Dam)은 클리어 레이크(Clear Lake)의 슬롯 게임를 조절합니다. 드림랜드의 유명한 리조트. 댐 위원회는 다음과 같은 노력을 기울이고 있습니다. 앞으로 4개월 동안 얼마나 많은 물을 방출할지 결정하십시오. 호수는 현재 홍수 단계보다 150mm 아래에 있습니다. 댐은 능력이 있다 매달 슬롯 게임를 200mm씩 낮추는 것이 필요하지만, 강수량과 증발량이 댐에 영향을 미칩니다. 클리어 근처의 날씨 호수는 매우 가변적입니다. 댐위원회는 월을 나누어 비슷한 날씨를 2개월간 두 블록으로 나눕니다. 각각의 달 블록은 날씨에 대해 동일한 확률을 가지며, 이는 가정됩니다. 서로 독립적입니다. 첫 번째 블록의 매월에는 자연적으로 100mm 증가하는 확률을 1/2로 지정합니다. 슬롯 게임가 1/4에서 50mm 감소하거나 슬롯 게임가 250mm 증가합니다. 이 모든 수치는 다음과 같습니다. 댐 방출 없이 슬롯 게임의 자연적인 변화. 매달 두 번째 블록에서 그들은 1/2의 확률을 갖는 것에 할당합니다. 자연적으로 슬롯 게임가 150mm 증가하고 확률은 1/4에서 슬롯 게임가 50mm 증가하거나 350mm 증가합니다. 만약 홍수가 발생하면 피해는 홍수 위의 mm당 $10,000로 평가됩니다. 수준. 슬롯 게임가 너무 낮으면 물을 수입하는 데 비용이 많이 듭니다. 이러한 비용은 홍수 단계 아래 250mm 미만에서 mm당 $5000입니다. 는 위원회는 먼저 예상되는 비용을 최소화하려는 전반적인 목표를 고려합니다. 비용. 이 모델은 이 첫 번째 목표만 고려합니다.
소형 모델 유형 :LP
카테고리 : 슬롯 게임 모델 라이브러리
메인 파일 : clearlak.gms
$title 시나리오 축소: ClearLake 연습(CLEARLAK,SEQ=249)
$onText
운동, p. 44:
클리어 레이크 댐(Clear Lake Dam)은 클리어 레이크(Clear Lake)의 슬롯 게임를 조절합니다.
드림랜드의 유명한 리조트. 댐 위원회는 다음과 같은 노력을 기울이고 있습니다.
앞으로 4개월 동안 얼마나 많은 물을 방출할지 결정하십시오.
호수는 현재 홍수 단계보다 150mm 아래에 있습니다. 댐은 능력이 있다
매달 슬롯 게임를 200mm씩 낮추는 것이 필요하지만,
강수량과 증발량이 댐에 영향을 줍니다. 클리어 근처의 날씨
호수는 매우 가변적입니다. 댐위원회는 월을 나누어
비슷한 날씨를 2개월간 두 블록으로 나눕니다. 각각의 달
블록은 날씨에 대해 동일한 확률을 가지며, 이는 가정됩니다.
서로 독립적입니다. 첫 번째 블록의 매월에는
자연적으로 100mm 증가하는 확률을 1/2로 지정합니다.
슬롯 게임가 1/4에서 50mm 감소하거나
슬롯 게임가 250mm 증가합니다. 이 모든 수치는 다음과 같습니다.
댐 방출 없이 슬롯 게임의 자연적인 변화. 매달
두 번째 블록에서 그들은 1/2의 확률을 갖는 것에 할당합니다.
자연적으로 슬롯 게임가 150mm 증가하고 확률은 1/4에서
슬롯 게임가 50mm 증가하거나 350mm 증가합니다. 만약
홍수가 발생하면 피해는 홍수 위의 mm당 $10,000로 평가됩니다.
수준. 슬롯 게임가 너무 낮으면 물을 수입하는 데 비용이 많이 듭니다.
이러한 비용은 홍수 단계 아래 250mm 미만에서 mm당 $5000입니다. 는
위원회는 먼저 예상되는 비용을 최소화하려는 전반적인 목표를 고려합니다.
비용. 이 모델은 이 첫 번째 목표만 고려합니다.
Birge, R 및 Louveaux, FV, 확률론적 프로그래밍 소개.
스프링거, 1997.
키워드: 선형 계획법, 확률론적 계획법, 수자원 관리,
슬롯 게임 규정
$offText
세트
p '매월 강수량' / 낮음, 보통, 높음 /
t '기간' / 12월, 1월, 2월, 3월, 4월 /
바셋(t) / dec /
w '날씨 조건' / 습함, 건조함 /
tw(t,w) '월을 기상 조건과 연관시킵니다.' /(jan,feb).wet
(3월,4월).건조 /
n '노드' / n1*n121 /;
별칭(n,부모,자식);
세트
root(n) '루트 노드' / n1 /
tn(t,n) '노드를 기간에 매핑'
anc(child,parent) '조상 매핑'
np(n,p) '노드를 강수량 수준에 매핑'
잎(n);
np(n,p)$[mod(ord(n) - 2, 카드(p)) = ord(p) - 1] = 예;
np(루트,p) = 아니요;
* np를 표시;
스칼라 tmp1, tmp2;
tmp1 = 0;
루프(티,
tmp2 = (전력[카드(p), ord(t)])/(카드(p) - 1);
tn(t,n)$[ord(n) >= tmp1 및 ord(n) < tmp2] = 예;
tmp1 = tmp2;
);
* 디스플레이 tn;
anc(자식,부모)$(floor((ord(자식) + 1)/card(p)) = ord(부모)) = 예;
* 디스플레이 anc;
leaf(n)$(ord(n) > (power(card(p), 카드(t) - 1) - 1)/(card(p) - 1)) = 예;
* 디스플레이 잎;
테이블 delta(w,p) '계절별 저수지 슬롯 게임 변화'
낮음 보통 높음
건조 -50 100 250
젖은 50 150 350;
매개변수
pr(p) '확률 분포' / 낮음 0.25
보통 0.50
높음 0.25 /
nprob(n) '어떤 노드에 있을 확률';
nprob(루트) = 1;
loop(anc(child,parent), nprob(child) = sum np(child,p), pr(p)*nprob(parent););
* nprob를 표시;
* 현재 cenRed 구현에는 ndelta가 필요합니다.
매개변수 ndelta(n) '각 노드의 물 델타';
ndelta(n) = 합계(tw(t,w), np(n,p))$[tn(t,n)], delta(w,p);
* ndelta를 표시합니다.
tmp1 = 합계 리프, nprob(리프);
abort$[abs(tmp1-1) > 1e-8] "트리에 오류가 있습니다. 리프 확률의 합이 1이 아닙니다.";
스칼라
FloodCost '홍수량 초과 금액에 대한 K$/mm' / 10 /
lowCost '홍슬롯 게임 250mm 이하 금액에 대해 K$/mm' / 5 /
l0 '초기 슬롯 게임' / 100 /;
변수
ec '예상 비용 값';
양수 변수
l(t,n) '댐의 슬롯 게임, EOP'
r(t,n) 'mm 정상적으로 해제됨'
f(t,n) '방출된 홍수의 mm'
z(t,n) '수입된 물의 mm';
r.up(t,n) = 200;
* 슬롯 게임 l은 슬롯 게임 아래 250mm를 기준으로 함
l.up(t,n) = 250;
l.fx(바세트,n) = l0;
세트
nn(n) '축소 트리의 노드'
sanc(child,parent) '축소된 트리에 대한 조상 매핑'
canc(child,parent) '축소된 트리에 대한 계산된 조상 매핑';
매개변수
snprob(n) '감소된 트리에 대한 확률';
방정식
ECdef
ldef(t,n);
엑데프..
ec =e= sum(tn(t,nn), snprob(nn)*(floodCost*f(t,nn) + lowCost*z(t,nn)));
ldef(tn(t,nn))$[루트가 아님(nn)]..
l(t,nn) =e= sum anc(nn,parent), l(t-1,parent) + ndelta(nn) + z(t,nn) - r(t,nn) - f(t,nn);
모델 최소비용 / ecdef, ldef /;
$if noscenred로 설정됨 $goTo noscenreduction
* 이제 노드 세트를 축소해 보겠습니다.
$libInclude cenred.gms
ScenRedParms('num_leaves') = sum(leaf, 1);
ScenRedParms('num_random') = 1;
ScenRedParms('num_nodes') = 카드(n);
ScenRedParms('num_time_steps') = 카드(t);
* 일반적으로 다음 두 매개변수 중 하나가 설정됩니다.
ScenRedParms('red_percentage') = 0.5;
* 선택적 SCENRED 입력 매개변수: 기본값은 주석 처리되어 있습니다.
* ScenRedParms('num_stages') = ScenRedParms('num_time_steps');
* ScenRedParms('reduction_method') = 0;
* ScenRedParms('where_random') = 10;
* ScenRedParms('report_level') = 0;
ScenRedParms('run_time_limit') = 60;
ScenRedParms('sroption') = 1;
파일 opts / 'sr2clearlak.opt' /;
putClose는 'log_file = Lakelog.txt'를 선택합니다.
/ 'input_gdx Lakein.gdx'
/ 'output_gdx = Lakeout.gdx';
$libInclude scenred Clearlak scen_red n anc nprob sanc snprob ndelta
ScenRedReport, snprob 표시;
nn(n) = snprob(n);
nn을 표시;
* 출력의 일관성 검사 시작
canc(anc(child,parent))$(nn(child)) = yes;
취소, 표시 표시;
chk(자식,부모)를 설정합니다.
chk(자식,부모) = 아니요;
chk(canc(child,parent)) = 예;
chk(sanc(child,parent)) = 아니요;
abort$(sum(chk, 1)) "축소된 트리에 오류가 있습니다: 출력이 일관되지 않습니다", chk;
chk(sanc(child,parent)) = 예;
chk(canc(child,parent)) = 아니요;
abort$(sum(chk, 1)) "축소된 트리에 오류가 있습니다: 출력이 일관되지 않습니다", chk;
tmp1 = sum(leaf(nn), snprob(leaf)) - 1;
abort$(abs(tmp1) > 1e-8) "트리에 오류가 있습니다: 리프 확률의 합이 1이 아닙니다.", tmp1;
* 출력의 최종 일관성 확인
$goTo 완료됨
$label noscenreduction
* 축소가 수행되지 않은 경우 전체 트리를 하위 집합에 할당
nn(n) = 예;
snprob(nn) = nprob(nn);
$label 완료됨
lp min ec를 사용하여 최소 비용을 해결합니다.