prodplan.gms : 생산 계획 예시

설명

이 무력한 로트 크기 조정 문제는 최소 비용 생산 계획을 찾습니다.
수요 요구 사항을 충족합니다. 생산비, 입고비 등이 발생합니다.
그리고 기계를 세팅합니다.

네 가지 해결 방법이 제시됩니다.
1) 원본 모델을 MIP로 해결
2) RMIP로 엄격한 재구성 해결
3) 재고 없이 빡빡한 재구성을 RMIP로 해결
4) 분리 알고리즘을 사용하여 원본 모델을 RMIP로 해결

소형 모델 유형 :MIP


카테고리 : 슬롯 머신 모델 라이브러리


메인 파일 : prodplan.gms

$title A 생산 계획 예(PRODPLAN, SEQ=356)

$onText
이 무능력한 로트 크기 조정 문제는 최소 비용 생산 계획을 찾습니다.
수요 요구 사항을 충족합니다. 생산비, 입고비 등이 발생합니다.
그리고 기계를 세팅합니다.

네 가지 해결 방법이 제시됩니다.
1) 원본 모델을 MIP로 해결
2) RMIP로 엄격한 재구성 해결
3) 재고 없이 빡빡한 재구성을 RMIP로 해결
4) 분리 알고리즘을 이용하여 원본 모델을 RMIP로 해결

Pochet, Y 및 Wolsey, LA, 혼합 정수별 생산 계획
프로그래밍(운영 연구 및 금융 분야의 스프링거 시리즈)
공학). Springer-Verlag 뉴욕, Inc., 2006.

키워드: 혼합 정수 선형 계획법, 완화된 혼합 정수 선형 계획법
          프로그래밍, 생산 기획
$offText

*1) 초기 미량 제제
세트
   t '기간' / t1*t8 /
   ut(t,t) '상부 삼각형';

별칭(t,tt,k);

매개변수
   DEMAND(T) '기간당 수요' / (t1,t2) 400, (t3,t4) 800, (t5*t8) 1200 /
   SETUPCOST '기간당 설정 비용' / 5000 /
   PRODCOST '기간당 생산비' / 100 /
   INVCOST '기간당 생산비' / 5 /
   STOCKINI '기간당 생산비' / 200 /
   BigM(T) '최대 생산량 - BigM';

*초기 재고가 첫 번째 기간의 수요보다 낮다고 가정합니다.
abort$(Demand('t1') < STOCKINI) '초기 재고가 너무 많습니다.';

ut(k,t) = ord(k) <= ord(t);

BigM(t) = sum(k$(ord(k) >= ord(t)), DEMAND(k) - STOCKINI$(ord(t) = 1));

디스플레이유타, 빅엠;

변수
   s(t) 't 기간의 재고'
   x(t) 't 기간의 생산'
   y(t) 't 기간에 설정'
   비용;

이진변수 y;
양수 변수 s, x;

방정식
   잔고(t) '재고잔고'
   생산(t) '생산 설정'
   최소 비용 '목적 함수';

민코스트..
   비용 =e= sum(t, ifthen(ord(t) < 카드(t),INVCOST,INVCOST/2)*s(t)) + sum(t, SETUPCOST*y(t) + PRODCOST*x(t));

생산량(톤)..
   x(t) =L= BigM(t)*y(t);

잔액(t)..
   STOCKINI$(ord(t) = 1) + s(t-1) + x(t) =e= 수요(t) + s(t);

모델 소형 / 최소 비용, 생산, 균형 /;

작은.optCr=0;

mip를 사용하여 작은 최소화 비용을 해결합니다.

*2) 복합상품 배합(타이트한 재구성)
변수
   smc(t,t) 'i 기간에 t 기간 동안 입력된 재고'
   xmc(t,t) 't 기간의 수요에 대한 i 기간의 생산';

양수 변수 smc, xmc;

방정식
   Balancemc(t,t) '재고 잔고'
   Productionmc(t,t) '생산 설정'
   Mincostmc '목적 함수';

민코스트엠씨..
   비용 =e= 합계(ut, PRODCOST*xmc(ut) + INVCOST*smc(ut)) + 합계(t, SETUPCOST*y(t));

Balancemc(ut(k,t))..
   STOCKINI$(ord(t) = 1) + smc(k-1,t) + xmc(k,t) =e= smc(k,t) + diag(k,t)*DEMAND(t);

생산mc(ut(k,t))..
   xmc(k,t) =l= (수요(t) - STOCKINI$(ord(t) = 1))*y(k);

모델tinymc/Mincostmc, Balancemc, Productionmc/;

rmip를 사용하여 비용을 최소화하는tinmc를 해결합니다.

*3) 재고가 없는 다중 상품 배합(타이트한 재구성)
매개변수 dist(t,t) '기간 간 거리';
dist(ut(k,t)) = ord(t) - ord(k);

디스플레이 거리;

방정식
   Demandmcws(t) '수요 만족'
   Mincostmcws '목적 함수';

민코스트mcws..
   비용 =e= 합계(ut, PRODCOST*xmc(ut) + INVCOST*dist(ut)*xmc(ut)) + 합계(t, SETUPCOST*y(t));

수요mcws(t)..
   sum(ut(k,t), xmc(k,t)) =g= DEMAND(t) - STOCKINI$(ord(t) = 1);

모델tinymcws / Mincostmcws, Demandmcws, Productionmc /;

rmip를 사용하여 비용을 최소화하는tinmcws를 해결합니다.

*4) 분리 알고리즘
세트
   j '반복' /j1*j10/
   n(j,t) '컷 세트'
   Scon(j,t,t) '위반된 제약조건 집합';

n(j,t) = 아니오;
Scon(j,t,t) = 아니오;

별칭 (t,l), (j,jj);

매개변수
   D(t,t) '누적수요'
   left(t,t) '컷의 왼쪽';

D(ut(t,k)) = sum[tt$(ord(tt) <= ord(k) 및 ord(tt) >= ord(t)), DEMAND(tt)];

방정식 cuts(j,t) 'RMIP에 대한 컷(완전한 선형 설명)';

cuts(n(jj,t)).. sum(Scon(jj,t,k), x(k) - D(k,t)*y(k)) =l= s(t);

모델tinycuts/작은, 컷/;

스칼라
   더 / 1 /
   엡실론 / 1e-6 /;

*STOCKINI < DEMAND(t1)인 경우 첫 번째 기간에 생산이 있어야 합니다.
y.fx('t1') = 1;

루프(j$더,
   rmip 최소 비용을 사용하여 Tinycut을 해결합니다.
   옵션 limCol = 0, limRow = 0, solPrint = 자동;

* 잠재적 절단의 왼쪽을 저장합니다.
   왼쪽(ut(tt,l)) = x.l(tt)-d(tt,l)*y.l(tt);

* 0보다 큰 LHS만 사용
   Scon(j,l,tt) = 왼쪽(tt,l) > 엡실론;

* 그 합이 재고 수준보다 큰 경우 : 위반 발견
* 이 컷을 모델에 추가하세요.
   n(j,l) = sum[Scon(j,l,tt), left(tt,l)] - 엡실론 > s.l(l);

* 이 반복 중에 하나 이상의 컷이 추가된 경우 계속 진행합니다.
   more = sum(n(j,l), yes);
);

put_Utility$(더 이상) '로그' /
  '>>>>정수 솔루션을 찾았습니다. 총 'sum(n(j,t),1):0:0' 컷이 추가되었습니다.';