nsharpx.gms : 일반 증류 시퀀스 합성

설명

이것은 gamslib 모델 NONSHARP의 직접적인 MINLP 공식입니다.
APROS라는 특별한 Benders 방법을 사용하여 이 문제를 해결합니다. 초기
슬롯 사이트 추천 구현은 Skip Paules가 수행했습니다.

소형 모델 유형 :MINLP


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


메인 파일 : nsharpx.gms

$title 일반 증류 순서 합성(NSHARPX,SEQ=226)

$onText
이는 gamslib 모델 NONSHARP의 직접적인 MINLP 공식입니다.
APROS라는 특별한 Benders 방법을 사용하여 이 문제를 해결합니다. 초기
슬롯 사이트 추천 구현은 Skip Paules에 의해 수행되었습니다.

Aggarwal, A 및 Floudas, CA, 일반 증류의 합성
시퀀스: 비선명한 분리. 컴퓨터 및 화학 공학
14, 6(1990), 631-653.

키워드: 혼합 정수 비선형 계획법, 화학 공학, 증류 순서,
          공정 합성, 비샤프 증류
$offText

세트
   c '구성요소' / a, b, c /
   나는 '열' / col-1*col-2 /
   p '제품' / prod-1, prod-2 /
   s '열 스트림' / 상단, 봇 /

* 파생 세트 - 이 세트는 매핑을 정의하는 데 사용됩니다.
* 모든 단계의 문제에 대한 상부구조
   inter(i,i,s) 'i열은 j열 상단 또는 하단에 의해 공급됩니다.'
                / col-1.col-2.top, col-2.col-1.bot /
   key(i,s,c) '열의 주요 구성요소'
                / col-1.top.a, (col-2.top,col-1.bot).b, col-2.bot.c /
   link(i,s,c) '비키 분포'
                / col-1.top.c, col-2.bot.a /;

별칭(i,j);

매개변수
   Feed(c) '각 성분의 피드' / a 100, b 100, c 100 /
   비용(i) '알파 계수' / col-1 0.23947 , col-2 0.75835 /
   a1(i) 'a1 계수' / col-1 -0.0139904, col-2 -0.0661588 /
   a2(i,s) 'a2 계수' / col-1.top 0.0093514, col-2.top 0.0338147
                             col-1.bot 0.0077308, col-2.bot 0.0373349 /
   a3(i,c) 'a3 계수(사료 구성에 해당)'
                           / col-1.a -0.0005719, col-2.a 0.0016371
                             열-1.b 0.0042656, 열-2.b 0.0288996
                             col-1.c 0.0 , col-2.c 0.0 /
   out(c,p) '제품 구성' / a.prod-1 80, b.prod-1 30, c.prod-1 20
                                    a.prod-2 20, b.prod-2 70, c.prod-2 80 /
   xinit(c) '흐름 유한 및 fby의 구성'
   '상부 구조로의 총 유량'을 공급합니다.

totfeed = sum(c, Feed(c));
xinit(c) = 피드(c)/totfeed;

변수 cobj '총 비용';

이진변수 y(i) 'i열 존재';

양수 변수
    finit(i) '초기 스플리터에서 열 i로의 흐름'
    fin(i) 'i열의 총 흐름'
    f(i,s) '컬럼 상단 및 하단 제품 흐름의 유속'
    fint(i,j,s) '상호 연결 스트림의 유량'
    fpr(i,s,p) '제품으로의 스트림 흐름 속도'
    fby(p) '우회 스트림의 유량'
    cfin(i,c) 'i열로의 구성 요소 흐름'
    xin(i,c) '흐름 핀의 구성'
    x(i,s,c) '흐름 f의 구성'
    rec(i,s,c) '주요 구성 요소 복구';

방정식
   obj '목적 함수'
   spblinit '초기 분배기 잔액'
   spblcol(i,s) '각 열 상단 및 하단 배출구의 분할 잔액'
   mixbal(i,c) '각 열 입구의 혼합기 균형 방정식'
   colbal(i,c) '각 열 주위의 구성 요소 균형 방정식'
   keybal(i,s,c) '각 열의 주요 구성요소 잔액'
   probal(p,c) '각 제품의 성분 균형 방정식'
   cfloin(i,c) '컬럼 입구의 성분 유량을 정의하는 방정식'
   molsum(i,s) '열 생성물의 몰 분율 합계에 대한 제약 조건'
   molsumin(i) '컬럼 입구의 몰 분율 합계에 대한 제약 조건'
   dist(i,s,c) '비키의 비분포를 정의하는 제약 조건'
   intcon(i) '논리적 제약';

obj..cobj =e= sum(i, 비용(i)*y(i)
                             + (a1(i) + sum(키(i,s,c), a2(i,s)*rec(키))
                                      + sum(c, a3(i,c)*xin(i,c)))*fin(i));

spblinit.. sum(i, finit(i)) + sum(p, fby(p)) =e= totfeed;

spblcol(i,s).. f(i,s) =e= sum(inter(j,i,s), fint(inter)) + sum(p, fpr(i,s,p));

mixbal(i,c).. cfin(i,c) =e= finit(i)*xinit(c) + sum(inter(i,j,s), fint(inter)*x(j,s,c));

colbal(i,c).. cfin(i,c) =e= sum(s, f(i,s)*x(i,s,c));

keybal(key(i,s,c)).. cfin(i,c)*rec(key) =e= f(i,s)*x(key);

probal(p,c)..sum((i,s), fpr(i,s,p)*x(i,s,c)) + fby(p)*xinit(c) =e= out(c,p);

cfloin(i,c)..fin(i)*xin(i,c) =e= cfin(i,c);

molsum(i,s)..sum(c, x(i,s,c)) =e= 1;

몰수민(i)..sum(c, xin(i,c)) =e= 1;

dist(링크).. x(링크) =e= 0;

intcon(i)..fin(i) =l= totfeed*y(i);

cfin.up(i,c) = 피드(c);
rec.lo(키) = .85;
rec.up(키) = 1;

모델 비샤프/모두/;

finit.up(i) = totfeed;
fin.up(i) = totfeed;
f.up(i,s) = totfeed;
fint.up(i,j,s) = totfeed;
fpr.up(i,s,p) = totfeed;

x.up(i,s,c) = 1;
xin.up(i,c) = 1;

* 다음과 같은 결과가 나오지 않도록 초기값과 한계를 제공해야 합니다.
* NLP 솔버가 시작될 때 실행 불가능한 지점에서 멈춤

y.l(i) = 1/카드(i);

finit.l(i) = totfeed/card(i);
fin.l(i) = finit.l(i);
f.l(i,s) = fin.l(i)/카드(들);
fint.l(i,j,s) = f.l(i,s)/card(j);
fpr.l(i,s,p) = f.l(i,s)/card(p);

x.l(i,s,c) = 1/카드(c);
xin.l(i,c) = 1/카드(c);
cfin.l(i,c) = sum(s, f.l(i,s)*x.l(i,s,c));

minlp minmizing cobj를 사용하여 nonsharp를 해결합니다.