bilinear.gms : 쌍선형 항 슬롯 커뮤니티 시간 x의 볼록화

설명

모델은 이중선형을 나타내는 다양한 공식을 보여줍니다.
하나의 연속 변수와 하나의 슬롯 커뮤니티 변수의 곱항입니다.

60개의 제품 세트가 주어진 기계 세트에서 생산됩니다.
총 용량. 일부 기계는 다음과 같은 의미에서 특별합니다.
그 중 하나에서 제품을 생산하는 경우, 세척 처리 비용이 부과됩니다.
일련의 청소 처리 기계로 인해 발생 t.

슬롯 커뮤니티 변수 delta(i)는 제품 i가 생산되는 날짜를 나타냅니다.
특수 기계 중 하나. 모델은 다음과 같이 단순화되었습니다.
기계-제품 관계.

여기서 우리는 더 큰 생산 문제를 모방하고 다음을 요구합니다.

     E1..sum(iE, delta(iE)) =e= 2;
     E2.. sum(iO, delta(iO)) =e= 5;

이는 특수 기술을 사용하는 것을 피할 수 없다는 사실을 나타냅니다.
기계를 세척하여 청소 처리를 합니다.

제품 i가 특수 기계에서 생산되면 금액 y(i)는
부산물의 비율은 레시피 제약조건 y(i)=0.164*p(i)로 제공됩니다.
여기서 음이 아닌 변수 p(i)는 특별 행사에서 생산된 금액입니다.
기계. 각 제품에는 YS(i) $/톤이라는 특정 수율이 있습니다.
부산물은 연소되어 YB(i) $/ton의 에너지 생산량을 얻습니다.
여기서 YB(i)<YS(i)입니다. 부산물도 처리장을 통과한다.

생산은 생산 능력 C에 의해 제한됩니다. 여기서 x(i)는
100+i <= x(i) <= XUB는 내가 생산한 제품의 양입니다.

특수 기계에서 생산되는 양은 p(i)=x(i)*delta(i)입니다.

볼록하지 않은 MINLP 공식을 동등한 선형 공식과 비교합니다.
big-M, 볼록 껍질 및 표시기를 사용하는 p(i)=x(i)*delta(i) 형식
포럼.  또한, 새로운 SOS-1 공식이 제시되었습니다.
설명:

대형 모델 유형 :MINLP


카테고리 : 슬롯 커뮤니티 모델 라이브러리


메인 파일 : bilinear.gms

$title 쌍선형 용어 슬롯 커뮤니티수 x의 볼록화(BILINEAR,SEQ=346)

$onText
이 모델은 이중선형을 표현하는 다양한 공식을 보여줍니다.
하나의 연속 변수와 하나의 슬롯 커뮤니티 변수의 곱항입니다.

60개의 제품 세트가 주어진 기계 세트에서 생산됩니다.
총 용량. 일부 기계는 다음과 같은 의미에서 특별합니다.
그 중 하나에서 제품을 생산하는 경우, 세척 처리 비용이 부과됩니다.
일련의 청소 처리 기계로 인해 발생 t.

슬롯 커뮤니티 변수 delta(i)는 제품 i가 생산되는 날짜를 나타냅니다.
특수 기계 중 하나. 모델은 다음과 같이 단순화되었습니다.
기계-제품 관계.

여기서 우리는 더 큰 생산 문제를 모방하고 다음을 요구합니다.

     E1..sum(iE, delta(iE)) =e= 2;
     E2.. sum(iO, delta(iO)) =e= 5;

이는 특수 기술을 사용하는 것을 피할 수 없다는 사실을 나타냅니다.
기계를 세척하여 청소 처리를 합니다.

제품 i가 특수 기계에서 생산되면 금액 y(i)는
부산물의 비율은 레시피 제약조건 y(i)=0.164*p(i)로 제공됩니다.
여기서 음이 아닌 변수 p(i)는 특별 행사에서 생산된 금액입니다.
기계. 각 제품에는 YS(i) $/톤이라는 특정 수율이 있습니다.
부산물은 연소되어 YB(i) $/ton의 에너지 생산량을 얻습니다.
여기서 YB(i)<YS(i)입니다. 부산물도 처리장을 통과한다.

생산은 생산 능력 C에 의해 제한됩니다. 여기서 x(i)는
100+i <= x(i) <= XUB는 내가 생산한 제품의 양입니다.

특수 기계에서 생산되는 양은 p(i)=x(i)*delta(i)입니다.

볼록하지 않은 MINLP 공식을 동등한 선형 공식과 비교합니다.
big-M, 볼록 껍질 및 표시기를 사용하는 p(i)=x(i)*delta(i) 형식
포럼.  또한, 새로운 SOS-1 공식이 제시되었습니다.
설명:

Kallrath, J, 전략적 설계와 운영 계획을 결합
공정산업, 2009. 컴퓨터화학공학과에 제출

키워드: 혼합 정수 비선형 계획법, 혼합 정수 2차 제약 조건
          프로그래밍, 확장 수학 프로그래밍, 특별 주문 세트,
          수학, 생산 계획, 모델링 기술, 지표 제약
$offText

$solvNC를 설정하지 않은 경우 $setsolvNC 1
$설정되지 않은 경우solvbigM1 $setsolvigM1 1
$설정되지 않은 경우solvbigM2 $setsolvigM2 0
$solvIndic을 설정하지 않은 경우 $setsolvIndic 0
$설정되지 않은 경우solveEMPCH $setsolveEMPCH 0
$solveEMPI를 설정하지 않은 경우 $setsolveEMPI 0
$설정되지 않은 경우solveEMPBM1 $setsolveEMPBM1 0
$설정되지 않은 경우solveEMPBM2 $setsolveEMPBM2 0
$설정되지 않은 경우solveSOS1 $setsolveSOS1 0

* 모델 치수
$MaxI를 설정하지 않은 경우 $set MaxI 60
$MaxT를 설정하지 않은 경우 $set MaxT 10

$eolCom //

세트
   i '생산하여 판매할 제품' / i1*i%MaxI% /
   iE(i) '서수가 짝수인 제품'
   iO(i) '서수가 홀수인 제품'
   t '처리시설 청소' / t1*t%MaxT% /;

iE(i) = mod(ord(i),2) = 0;
iO(i) = iE(i)가 아님;

매개변수
   용량 '총 기계 용량' / 20000 /
   C(i,t) '청소 처리 비용'
   XUB(i) '생산 상한'
   XLB(i) '생산 하한'
   YS(i) '제품 i 판매로 인한 수익'
   YB(i) '추가 폐기물 연소로 인한 산출량';

C(i,t) = sqrt(ord(i))*ord(t);
C(iE,t) = -C(iE,t) + 5;
XUB(i) = 10000;
XLB(i) = 100 + ord(i);
YS(i) = 0.04 + 0.001*sqrt(ord(i));
YB(i) = 0.007;

변수
   z '객관 변수'
   x(i) '생산'
   y(i) '특수 기계에서 생산된 폐기물'
   delta(i) '특수 기계에서의 생산 지표';

양수 변수 x, y;
슬롯 커뮤니티 변수 델타;

방정식
   E1, E2 '특수기계 일부 강제사용'
   ByProductNC(i) '특수기계에서 생산된 부산물'
   ProdCap '생산능력'
   ObjFuncNC '목적함수: 수율 - 청소 처리 비용';

ObjFuncNC.. z =e= 합계(i, YS(i)*x(i) + YB(i)*y(i))
                    - sum(t, sqr(sum(i, C(i,t)*x(i)*delta(i) + y(i))));

ProdCap.. sum(i, x(i)) =l= 용량;

ByProductNC(i)..y(i) =e= 0.164*x(i)*delta(i);

E1..sum(iE, delta(iE)) =e= 2;

E2.. sum(iO, delta(iO)) =e= 5;

모델
   코어 / ProdCap, E1, E2 /
   NC '비볼록 모델' / core, ByProductNC, ObjFuncNC /;

x.lo(i) = XLB(i);
x.up(i) = XUB(i);

* 비볼록 모델의 최적값을 찾으려면 전역 솔버가 필요합니다.
* 솔버 대안: Baron, LindoGlobal, SCIP
옵션 miqcp = cplex, optCr = 0;

NC.workFactor = 10;
if(%solveNC%, minlp를 사용하여 NC 최대 z를 푼다;);

* 첫 번째 bigM 볼록화
양수 변수
   p(i) '곱 x 델타 곱하기';

방정식
   부산물(i) '특수기계에서 생산된 부산물'
   ObjFunc '목적 함수: 수율 - 청소 처리 비용'
   bigM1_1, bigM1_2, bigM1_3 '슬롯 커뮤니티 시간 제한 연속의 bigM 볼록화';

부산물(i)..y(i) =e= 0.164*p(i);

ObjFunc.. z =e= 합계(i, YS(i)*x(i) + YB(i)*y(i))
                  - sum(t, sqr(sum(i, C(i,t)*p(i) + y(i))));

bigM1_1(i).. p(i) =l= x(i); // 이는 목표의 p 부호 때문에 필요하지 않습니다.

bigM1_2(i).. p(i) =l= XUB(i)*delta(i);

bigM1_3(i).. p(i) =g= x(i) - XUB(i)*(1 - delta(i));

모델
   coreConv / 코어, ByProduct, ObjFunc /
   bigM1 / coreConv, bigM1_1, bigM1_2, bigM1_3 /;

p.up(i) = XUB(i);

$onEcho > cplex.opt
밉강조 3
$offEcho
if(%solvebigM1%, bigM1.optFile = 1; miqcp를 사용하여 bigM1 max z를 해결합니다.);

* 대체 bigM 포럼
양의 변수 slack(i);

방정식 bigM2_1, bigM2_2, bigM2_3 '슬롯 커뮤니티 시간 제한 연속의 bigM 볼록화';

bigM2_1(i).. p(i) =e= x(i) - slack(i);

bigM2_2(i).. p(i) =l= XUB(i)*delta(i); // 이는 목표의 p 부호 때문에 필요하지 않습니다.

bigM2_3(i).. slack(i) =l= XUB(i)*(1 - delta(i));

모델 bigM2 / coreConv, bigM2_1, bigM2_2, bigM2_3 /;

slack.up(i) = XUB(i);
if(%solvebigM2%, bigM2.optFile = 1; miqcp를 사용하여 bigM2 max z를 해결합니다.);

* Cplex 지표 구성
방정식 disj1, disj2 '슬롯 커뮤니티 시간 유계 연속의 표시자 볼록화';

disj1(i).. p(i) =e= x(i);

disj2(i).. p(i) =e= 0; // 이는 목표의 p 부호 때문에 필요하지 않습니다.

모델 indic / coreConv, disj1, disj2 /;

$onEcho > cplex.op2
인도어 disj1(i)$delta(i) 1
인도식 disj2(i)$delta(i) 0
컷 3
$offEcho

if(%solveIndic%, indic.optFile = 2; miqcp를 사용하여 indic 최대 z를 푼다;);

* EMP(확장 수학 프로그래밍) 프레임워크는 모델링을 탐구합니다.
* 비전통적인 수학 프로그램을 생성하는 확장(예:
* 분리) 및 전통적인 수학으로의 재공식화를 자동화합니다.
* 프로그램(MIP 등). 수동으로 생성된 big-M 및 표시기
* 위의 공식은 모델의 EMP에 의해 자동으로 생성됩니다.
* 분리가 있습니다. 또한 EMP는 볼록 껍질 공식을 제공합니다.
* (bigM과 독립적임) 분리의 경우.

* EMP 제제
파일 femp / "%emp.info%" /;
femp를 넣어;

$onEcho > jams.opt
하위 해결자 복합체
SubSolverOpt 1
$offEcho

* 볼록 껍질 볼록화
putClose '모델 유형 miqcp 분리 델타 disj1 else disj2';

if(%solveEMPCH%, indic.optFile = 1; emp를 사용하여 indic 최대 z를 푼다;);

* Cplex 표시 볼록화
putClose '모델 유형 miqcp 분리 indic 델타 disj1 else disj2';

if(%solveEMPI%, indic.optFile = 1; emp를 사용하여 indic 최대 z를 푼다;);

* Big-M Convexification 유형 1(bigM1 공식과 유사)
'모델 유형 miqcp'를 입력하세요.
loop(i, put / 'disjunction bigM' XUB(i) delta(i) disj1(i) 'else' disj2(i));
넣어닫다;

if(%solveEMPBM1%, indic.optFile = 1; emp를 사용하여 indic 최대 z를 푼다;);

* Big-M Convexification 유형 2(bigM2 공식과 유사)
'모델 유형 miqcp'를 입력하세요.
loop(i, put / 'disjunction bigM' XUB(i) 1e-4 1 delta(i) disj1(i) 'else' disj2(i));
넣어닫다;

if(%solveEMPBM2%, indic.optFile = 1; emp를 사용하여 indic 최대 z를 푼다;);

* SOS1 공식
delta.prior(i) = inf; // 델타의 슬롯 커뮤니티 요구 사항을 완화합니다.

j '바이너리 선택' / 0, 1 / 설정;

SOS1 변수 S1(i,j), S2(i,j);

방정식 defS1_0, defS1_1, defS2_0, defS2_1 '선택 제약';

defS1_0(i).. S1(i,'0') =e= 델타(i);

defS1_1(i).. S1(i,'1') =e= x(i) - p(i);

defS2_0(i).. S2(i,'0') =e= 1 - 델타(i);

defS2_1(i).. S2(i,'1') =e= p(i);

모델 sos1conv / coreConv, defS1_0, defS1_1, defS2_0, defS2_1 /;

if(%solveSOS1%, miqcp를 사용하여 sos1conv max z를 해결;);