cutstock.gms : 절단 스톡 - 열 생성 접근 방식

설명

과제는 다양한 크기의 종이 제품을 잘라내는 것입니다.
고객의 주문을 충족하기 위해 대형 원시 종이 롤. 목표
필요한 롤 용지 수를 최소화하는 것입니다.

소형 모델 유형 :MIP


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


메인 파일 : cutstock.gms

$title 절단 스톡 - 열 생성 접근 방식(CUTSTOCK,SEQ=294)

$onText
임무는 다양한 크기의 종이 제품을 잘라내는 것입니다.
고객의 주문을 충족하기 위해 대형 원시 종이 롤. 목표
필요한 롤 용지 수를 최소화하는 것입니다.

P. C. Gilmore 및 R. E. Gomory, 선형 계획법에 대한 접근 방식
절단 재고 문제, 1부, Operations Research 9(1961), 849-859.

P. C. Gilmore 및 R. E. Gomory, 선형 계획법에 대한 접근 방식
절단 재고 문제, 2부, Operations Research 11(1963), 863-888.

키워드: 혼합 정수 선형 계획법, 재고 절단, 열 생성,
          제지 산업
$offText

i '너비' / w1*w4 /를 설정합니다.

매개변수
   r '원시 너비' / 100 /
   w(i) '너비' / w1 45, w2 36, w3 31, w4 14 /
   d(i) '수요' / w1 97, w2 610, w3 395, w4 211 /;

* 길모어-고모리 컬럼 생성 알고리즘
세트
   p '가능한 패턴' / p1*p1000 /
   pp(p) 'p의 동적 부분 집합';

매개변수 aip(i,p) 'p에서 성장하는 패턴의 너비 i 수';

* 마스터 모델
변수
   xp(p) '사용된 패턴'
   z '객관변수';

정수 변수 xp;
xp.up(p) = sum(i, d(i));

방정식
   numpat '사용된 패턴 수'
   수요(i) '수요 충족';

numpat.. z =e= sum(pp, xp(pp));

수요(i).. sum(pp, aip(i,pp)*xp(pp)) =g= d(i);

모델 마스터 / numpat, 수요 /;

* 가격 문제 - 배낭형 모델
변수 y(i) '새 패턴';

정수 변수 y;
y.up(i) = ceil(r/w(i));

방정식
   데포브
   배낭 '배낭 제약';

defobj.. z =e= 1 - sum(i, 수요.m(i)*y(i));

배낭.. sum(i, w(i)*y(i)) =l= r;

모델 가격 / defobj, 배낭 /;

* 초기화 - 초기 패턴은 단일 너비를 갖습니다.
pp(p) = ord(p) <= 카드(i);
aip(i,pp(p))$(ord(i) = ord(p)) = Floor(r/w(i));
*디스플레이 aip;

Set pi(p) '마지막 패턴 집합';
파이(p) = ord(p) = 카드(pp) + 1;

옵션 optCr = 0, limRow = 0, limCol = 0, solPrint = off;

while(카드(pp) < 카드(p),
   z를 최소화하는 rmip를 사용하여 마스터를 해결합니다.
   z를 최소화하는 mip를 사용하여 가격 책정을 해결합니다.

   break$(z.l >= -0.001);

* 발견된 마스터 모델을 개선할 수 있는 패턴
   aip(i,pi) = round(y.l(i));
   pp(pi) = 예;
   파이(p) = 파이(p-1);
);
'롤 수의 하한' 표시, master.objVal;

옵션 solPrint = 켜기;

z를 최소화하는 mip를 사용하여 마스터를 해결합니다.

매개변수
   patrep '솔루션 패턴 보고서'
   demrep '솔루션 수요 공급 보고서';

patrep('# 생성됨',p) = round(xp.l(p));
patrep(i,p)$patrep('# 생성됨',p) = aip(i,p);
patrep(i,'total') = sum(p, patrep(i,p));
patrep('생산된 수','총계') = sum(p, patrep('생산된 수',p));

demrep(i,'생산됨') = sum(p, patrep(i,p)*patrep('# 생산됨',p));
demrep(i,'수요') = d(i);
demrep(i,'over') = demrep(i,'생산됨') - demrep(i,'수요');

patrep, demrep 표시;