gastrans.gms : 가스 전송 문제 - 벨기에

설명

파이프라인 네트워크를 통해 가스를 분배하는 문제는 다음과 같이 공식화됩니다.
비선형 유동-압력 관계에 따른 비용 최소화, 재료
균형 및 압력 한계. 벨기에 가스 네트워크가 예로 사용됩니다.

먼저, 우리는 잘 풀 수 있는 간단한 NLP 공식을 모델링합니다.
오늘날의 NLP 솔버에 의해.
이후 Wolf & Smeers의 3단계 접근 방식이 구현됩니다(라인 160ff).

de Wolf, D 및 Smeers, Y, 가스 전달 문제 해결 방법
및 Simplex 알고리즘의 확장. 경영과학46, 11
(2000), 1454-1465.

키워드: 비선형 계획법, 불연속 도함수, 공학, 분포
          문제, 가스 전송, 네트워크 문제

소형 모델 유형 :NLP


카테고리 : 슬롯 사이트 모델 라이브러리


메인 파일 : gastrans.gms

$title 가스 전송 문제 - 벨기에 (GASTRANS,SEQ=217)

$onText
파이프라인 네트워크를 통해 가스를 분배하는 문제는 다음과 같이 공식화됩니다.
비선형 유동-압력 관계에 따른 비용 최소화, 재료
균형 및 압력 한계. 벨기에 가스 네트워크가 예로 사용됩니다.

먼저, 우리는 잘 풀 수 있는 간단한 NLP 공식을 모델링합니다.
오늘날의 NLP 솔버에 의해.
이후 Wolf & Smeers의 3단계 접근 방식이 구현됩니다(라인 160ff).

de Wolf, D 및 Smeers, Y, 가스 전달 문제 해결 방법
및 Simplex 알고리즘의 확장. 경영과학46, 11
(2000), 1454-1465.

키워드: 비선형 계획법, 불연속 도함수, 공학, 분포
          문제, 가스 전송, 네트워크 문제
$offText

$eolCom //

세트
   나는 '마을'
     / 안데를뤼스, 안트베르펜, 아를롱, 베르노, 블라레그니스
       Brugge, Dudzele, Gent, Liege, Loenhout
       몽스, 나무르, 페탕주, 페론네스, 신신
       Voeren, Wanze, Warnand, Zeebrugge, Zomergem /
   '호' / 1*24 /
   as(a) '활성 아크'
   ap(a) '수동 호'
   슬롯 사이트(a,i,i) '호 설명';

별칭(i,j);

NC '노드 데이터 열 헤더' 설정
       / slo '공급 하한(일당 M3 밀링)'
         sup '공급 상한(일당 M3 밀)'
         plo '압력 하한(bar)'
         강아지 '압력 상한(bar)'
         c '비용(MBTU당 $)' /;

테이블 Ndata(i,nc) '노드 데이터'
               슬로 서프 플로 강아지 C
   안데를루에스 0 1.2 0 66.2 0
   앤트워프 -inf -4.034 30 80.0 0
   아론 -inf -0.222 0 66.2 0
   베르노 0 0 0 66.2 0
   Blaregnies -inf -15.616 50 66.2 0
   브뤼헤 -inf -3.918 30 80.0 0
   두젤레 0 8.4 0 77.0 2.28
   Gent -inf -5.256 30 80 0
   리에주 -inf -6.385 30 66.2 0
   뢰엔하우트 0 4.8 0 77.0 2.28
   몬 -inf -6.848 0 66.2 0
   나무르 -inf -2.120 0 66.2 0
   페탄지 -inf -1.919 25 66.2 0
   페론네스 0 0.96 0 66.2 1.68
   신신 0 0 0 63.0 0
   보렌 20.344 22.012 50 66.2 1.68
   완제 0 0 0 66.2 0
   경고 0 0 0 66.2 0
   지브뤼헤 8.870 11.594 0 77.0 2.28
   조머젬 0 0 0 80.0 0 ;

ac '호 데이터 열 헤더' / D '직경(mm)' 설정
                                   L '길이(km)'
                                   act '유형 표시기(1 = 활성)' /;

테이블 AData(a,i,j,*) '호 데이터'
                                  D L 행위
    1.Zeebrugge. 두젤레 890.0 4.0
    2.Zeebrugge. 두젤레 890.0 4.0
    3.두젤레 . 브뤼헤 890.0 6.0
    4.두젤레 . 브뤼헤 890.0 6.0
    5.브뤼헤. 조머젬 890.0 26.0
    6. 로엔하우트 . 앤트워프 590.1 43.0
    7. 앤트워프. 젠트 590.1 29.0
    8.젠트. 조머젬 590.1 19.0
    9.Zomergem . 페론네스 890.0 55.0
   10.보렌. 베르노 890.0 5.0 1
   11.보렌. 베르노 395.0 5.0 1
   12. 베르노 . 리에주 890.0 20.0
   13. 베르노 . 리에주 395.0 20.0
   14. 리에주 . 워낸드 890.0 25.0
   15. 리에주 . 워난드 395.0 25.0
   16.워넌드 . 나무르 890.0 42.0
   17. 나무르 . 안더루스 890.0 40.0
   18.안더루스. 페론네스 890.0 5.0
   19. 페론네스 . 월 890.0 10.0
   20.월. 블래그니스 890.0 25.0
   21.워넌드 . 완쩌 395.5 10.5
   22. 완제 . 신신 315.5 26.0 1
   23.신신 . 아론 315.5 98.0
   24.알론 . 페탄지 315.5 6.0;

스칼라
   T '가스 온도(K)' / 281.15 /
   e '절대 주름도(mm)' / 0.05 /
   den '공기에 대한 가스의 밀도 (-)' / 0.616 /
   z '압축성 계수(-)' / 0.8 /;

매개변수
   lam(a,i,j) '람다 상수 (1464페이지)'
   c2(a,i,j) '파이프 상수 (페이지 1463)'
   arep(a,i,j,*) '아크 보고서';

슬롯 사이트(a,i,j) = adata(a,i,j,'L');

as(a) = sum(슬롯 사이트(a,i,j), adata(슬롯 사이트,'act'));
ap(a) = as(a)가 아님;

lam(슬롯 사이트(a,i,j)) = 1/sqr(2*log10(3.7*adata(슬롯 사이트,'D')/e));
c2(슬롯 사이트(a,i,j)) = 96.074830e-15*power(adata(슬롯 사이트,'D'),5)/lam(슬롯 사이트)/z/t/adata(슬롯 사이트,'L')/den;
arep(슬롯 사이트,'lam') = lam(슬롯 사이트);
arep(슬롯 사이트,'c2') = c2(슬롯 사이트);

옵션 arep:6:3:1;
arep, as, ap를 표시합니다.

변수
   f(a,i,j) '호 흐름(1e6 SCM)'
   s(i) '공급 - 수요(1e6 SCM)'
   pi(i) '제곱 압력'
   sc '공급 비용';

방정식
   flowbalance(i) '흐름 보존'
   weymouthp(a,i,j) '유량 압력 관계 - 수동'
   weymoutha(a,i,j) '유량 압력 관계 - 활성'
   defsc '공급 비용 정의';

flowbalance(i).. sum(슬롯 사이트(a,i,j), f(슬롯 사이트)) =e= sum(슬롯 사이트(a,j,i), f(슬롯 사이트)) + s(i);

weymouthp(슬롯 사이트(ap,i,j)).. signpower(f(슬롯 사이트),2) =e= c2(슬롯 사이트)*(pi(i) - pi(j));

weymoutha(슬롯 사이트(as,i,j)).. - sqr(f(슬롯 사이트)) =g= c2(슬롯 사이트)*(pi(i) - pi(j));

defsc.. sc =e= sum(i, ndata(i,'c')*s(i));

* 공급, 수요, 압력 및 흐름 경계
s.lo(i) = ndata(i,'slo');
s.up(i) = ndata(i,'sup');
pi.lo(i) = sqr(ndata(i,'plo'));
pi.up(i) = sqr(ndata(i,'pup'));
f.lo(슬롯 사이트(as,i,j)) = 0;

* signpower(0,2)에 갇히지 않도록 흐름을 초기화합니다.
f.l(슬롯 사이트) = 균일(-1,1);

모델 가스트랜스/플로우밸런스, weymouthp, weymoutha, defsc/;

nlp min sc를 사용하여 가스트랜스를 해결합니다.

디스플레이 f.l;

* Wolf & Smeers 접근 방식을 실행하려면 다음 $exit를 제거하세요.
$exit

매개변수
   frep '흐름 보고서'
   SDP '공급 수요 및 압력';

frep('NLP',슬롯 사이트,'흐름') = f.l(슬롯 사이트);
sdp('NLP',i,'공급') = s.l(i)$(s.l(i) > 0);
sdp('NLP',i,'수요') = -s.l(i)$(s.l(i) < 0);
sdp('NLP',i,'압력') = sqrt(pi.l(i));
sdp('NLP','','Obj') = sc.l;

매개변수
   flow(a,i,j,*) '흐름 경계'
   pirange(a,i,j,*) '제곱 압력 범위';

flow(슬롯 사이트(ap,i,j),'min') = -sqrt(c2(슬롯 사이트)*(pi.up(j) - pi.lo(i)));
flow(슬롯 사이트(ap,i,j),'max') = sqrt(c2(슬롯 사이트)*(pi.up(i) - pi.lo(j)));

pirange(슬롯 사이트(ap,i,j),'min') = pi.lo(i) - pi.up(j);
pirange(슬롯 사이트(ap,i,j),'max') = pi.up(i) - pi.lo(j);

옵션 흐름:3:3:1, Pirange:3:3:1;
디스플레이 흐름, 피레인지;

방정식
   defh 'Smeers obj의 정의'
   defsig(a,i,j) '흐름 방향 정의'
   weymouthp2(a,i,j) '유량 압력 관계 - 수동'
   플로
   큭큭
   필로
   핍;

변수
   sig(a,i,j) '흐름 방향(수동 요소의 경우 -1 또는 +1)'
   b(a,i,j) '흐름 방향(1 = i에서 j)'
   h '스미어스 obj';

이진변수 b;

weymouthp2(슬롯 사이트(ap,i,j)).. sig(슬롯 사이트)*sqr(f(슬롯 사이트)) =e= c2(슬롯 사이트)*(pi(i) - pi(j));

defh.. h =e= sum(슬롯 사이트(a,i,j), abs(f(슬롯 사이트))*sqr(f(슬롯 사이트))/3/c2(슬롯 사이트));

defsig(슬롯 사이트(ap,i,j)).. sig(슬롯 사이트) =e= 2*b(슬롯 사이트) - 1;

flo(슬롯 사이트(ap,i,j)).. f(슬롯 사이트) =g= flow(슬롯 사이트,'min')*(1 - b(슬롯 사이트));

fup(슬롯 사이트(ap,i,j)).. f(슬롯 사이트) =l= 흐름(슬롯 사이트,'max')* b(슬롯 사이트);

pilo(슬롯 사이트(ap,i,j)).. pi(i) - pi(j) =g= pirange(슬롯 사이트,'min')*(1 - b(슬롯 사이트));

piup(슬롯 사이트(ap,i,j)).. pi(i) - pi(j) =l= pirange(슬롯 사이트,'max')*b(슬롯 사이트);

* 이전 솔루션 삭제
pi.1(i) = 0;
s.l(i) = 0;
f.l(슬롯 사이트) = 균일(-1,1);

모델
   하나 / defh, 흐름 균형 /
   두 / defsc, 흐름 균형, weymouthp2, weymoutha /
   3 / defsc, 흐름 균형, weymouthp2, weymoutha, defsig, pilo, piup, flo, fup /;

옵션 limRow = 0, limCol = 0;

dnlp min h를 사용하여 문제를 해결하세요. // 좋은 초기점 제공

nlp min sc를 사용하여 두 가지를 해결합니다.

* 알려진 솔루션 수정 아래 과제
* b.fx(*슬롯 사이트) = 1;
* b.fx(슬롯 사이트('7',i,j)) = 0;
* b.fx(슬롯 사이트('8',i,j)) = 0;

minlp min sc를 사용하여 세 가지 문제를 해결하세요.

frep('스미어스',슬롯 사이트,'흐름') = f.l(슬롯 사이트);
sdp('Smeers',i,'공급') = s.l(i)$(s.l(i) > 0);
sdp('스미어스',i,'수요') = -s.l(i)$(s.l(i) < 0);
sdp('스미어스',i,'압력') = sqrt(pi.l(i));
sdp('스미어스','','Obj') = sc.l;

옵션 frep:6:4:1;
frep, sdp를 표시합니다.