설명
모델은 이중선형을 나타내는 다양한 공식을 보여줍니다.
하나의 연속 변수와 하나의 슬롯 커뮤니티 변수의 곱항입니다.
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를 해결;);