mip02.gms : MIP 솔루션 값 확인

설명

이 모델에서는 MIP 솔버가 반환한 솔루션이 다음과 같은지 테스트합니다.
예상했던 것.  테스트에는 한계 값에 대한 확인이 포함됩니다.
돌아왔다.  사용된 모델은 슬롯 모델의 Magic에서 나온 모델입니다.
퇴화를 제거하도록 조정된 라이브러리입니다.

기고자: Steve Dirkse, 2010년 7월

소형 모델 유형 :MIP


카테고리 : 슬롯 테스트 라이브러리


메인 파일 : mip02.gms

$title MIP 솔루션 값 확인 (MIP02,SEQ=497)

$onText
이 모델에서는 MIP 솔버가 반환한 솔루션이 다음과 같은지 테스트합니다.
예상했던 것.  테스트에는 한계 값에 대한 확인이 포함됩니다.
돌아왔다.  사용된 모델은 슬롯 모델의 Magic에서 나온 모델입니다.
퇴화를 제거하도록 조정된 라이브러리입니다.

기고자: Steve Dirkse, 2010년 7월
$offText

 수요 차단 설정 / 오후 12시~오전 6시, 오전 6시~9시, 오전 9시~오후 3시, 오후 3시~6시, 오후 6시~12시 /
       g 발전기 / 1종, 2종, 3종 /

 매개변수 dem(t) 수요(1000mw) / 오후 12시~오전 6시 15시, 오전 6시~오전 9시 30시, 오전 9시~오후 3시 25시, 오후 3시~오후 6시 40, 오후 6시~12시 27 /
            dur(t) 기간(시간) / 오후 12시~오전 6시, 오전 6시~오전 9시 3시, 오전 9시~오후 3시 6시, 오후 3시~6시 3시, 오후 6시~12시 6 /

 테이블 데이터(g,*) 생성 데이터

         최소-파우 최대-파우 비용-최소 비용-inc 시작 번호
* (1000mw) (1000mw) (l/h) (l/h/mw) (l) (단위)

 유형-1 .85 2.0 1000 2.0 2000 12
 2종 1.25 1.75 2600 1.3 1000 10
 3종 1.5 4.0 3000 3.0 500 5

 매개변수 피크 피크 전력(1000mw)
            ener(t) 로드 블록의 에너지 수요(1000mwh)
            총 소요에너지(1000mwh)
            lf 부하율 ;

  피크 = smax(t, dem(t));  ener(t) = dur(t)*dem(t);  tener = sum(t, ener(t));  lf = 테너/(피크*24);
  피크, 테너, lf, 에너지를 표시합니다.

$eject
 변수 x(g,t) 발전기 출력(1000mw)
            n(g,t) 사용 중인 발전기 수
            s(g,t) 시동된 발전기 수
            비용 총 운영 비용(l)

 정수변수 n; 양수 변수 s;

 방정식 pow(t) 전력 수요(1000mw)
           res(t) 회전 예비 요구 사항(1000mw)
           st(g,t) 시작 정의
           minu(g,t) 최소 발전 수준(1000mw)
           maxu(g,t) 최대 발전량(1000mw)
           cdef 비용 정의(l);

 pow(t)..sum(g, x(g,t)) =g= dem(t);

 res(t).. sum(g, data(g,"max-pow")*n(g,t)) =g= 1.15*dem(t);

* 고유 한계값을 얻기 위해 방정식 st()에 작은 RHS를 추가합니다.
* 이것이 없으면 n(t) = n(t--1)일 때 s.lo와 st.lo가 모두 바인딩됩니다.
 st(g,t)..s(g,t) =g= n(g,t) - n(g,t--1) + .0001;

 minu(g,t).. x(g,t) =g= data(g,"최소-전력")*n(g,t);

* 고유 한계값을 얻기 위해 방정식 st maxu()에 작은 RHS를 추가합니다.
 maxu(g,t).. x(g,t) =l= data(g,"max-pow")*n(g,t) + 1e-4;

 cdef.. 비용 =e= sum((g,t), dur(t)*data(g,"cost-min")*n(g,t) + data(g,"start")*s(g,t)
               + 1000*dur(t)*data(g,"비용-inc")*(x(g,t)-data(g,"min-pow")*n(g,t)) );

  n.up(g,t) = data(g,"숫자");

 모델 윌리엄 / 모두 /;

 윌리엄.optcr = 0;
 william.savepoint = 1;
 mip를 사용하여 비용을 최소화하는 william 문제를 해결합니다.

스칼라 rc;
abort$[william.solvestat <> %solveStat.normalCompletion% 또는
       william.modelstat <> %modelStat.optimal%] '해결도 하지 못했습니다';

* MIP 솔버가 보고한 경우에만 이중을 비교합니다.
if( william.marginals가 아님,
  'gdxdiff william_p.gdx mip02_solu.gdx eps=1e-5 releps=1e-4 Field=L > %system.nullfile%'를 실행합니다.
그렇지 않으면
  'gdxdiff william_p.gdx mip02_solu.gdx eps=1e-5 releps=1e-4 > %system.nullfile%'를 실행합니다.
);
rc=오류수준;
abort$[rc <> 0] '솔루션이 예상과 다릅니다.';