decomp.gms : 분해 원리 - 애니메이션

설명

중앙 기관의 조정자는 유조선 서비스를 조달해야 합니다
그의 배포를 돕기 위해. 하청업체가 모든 것을 처리합니다.
배송 세부정보. 이 시나리오는 다음을 보여주기 위해 사용됩니다.
분해 원리. 자세한 내용은 Dantzig의 23-2장을 참조하세요.
선형 계획법에 대한 원본 텍스트입니다.

소형 모델 유형 :LP


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


메인 파일 : decomp.gms

$title 분해 원리 - 애니메이션(DECOMP,SEQ=164)

$onText
중앙 기관의 코디네이터는 유조선 서비스를 조달해야 합니다.
그의 배포를 돕기 위해. 하청업체가 모든 것을 처리합니다.
배송 세부정보. 이 시나리오는 다음을 보여주기 위해 사용됩니다.
분해 원리. 자세한 내용은 Dantzig의 23-2장을 참조하세요.
선형 프로그래밍에 대한 원본 텍스트입니다.

Dantzig, GB, 23.2장. 선형 프로그래밍 및 확장.
프린스턴 대학 출판부, 뉴저지주 프린스턴, 1963년.

키워드: 선형 계획법, 분해, 분포 문제, 운송
          문제, 배송
$offText

세트
   i '식물' / 식물-1, 식물-2 /
   j '터미널' / 항-1*항-4 /;

테이블 c(i,j) '비용 행렬'
            1학기 2학기 3학기 4학기
   공장-1 3 6 6 5
   식물-2 8 1 3 6;

표 t(i,j) '필요한 유조선'
            1학기 2학기 3학기 4학기
   공장-1 2
   플랜트-2 2 ;

매개변수
   a(i) '가용성' / 플랜트-1 9, 플랜트-2 8 /
   b(j) '요구사항' / 용어-1 2, 용어-2 7, 용어-3 3, 용어-4 5 /
   ctank '탱커 비용'
   cship '배송비';

변수
   비용 '총 비용'
   탱크 '사용된 총 탱커'
   선박 '운송비'
   x(i,j) '배송';

양수 변수 x;

방정식
   defcost '비용 정의'
   defship '배송비'
   deftank '탱커 사용량'
   공급(i) '공급 잔고'
   수요(j) '수요 잔고';

defcost.. 비용 =e= cship*ship + ctank*tank;

defship.. ship =e= sum((i,j), c(i,j)*x(i,j));

deftank.. 탱크 =e= sum((i,j), t(i,j)*x(i,j));

공급(i).. sum(j, x(i,j)) =l= a(i);

수요(j)..sum(i, x(i,j)) =g= b(j);

모델 하위 / defcost, defship, deftank, 수요, 공급 /;

세트
   ss '마스터 열 레이블' / 1*10 /
   s(ss) '활성 열';

매개변수
   mcost(ss) '비용 솔루션'
   mtank(ss) '탱커 솔루션';

변수
   몹
   lam(ss) '열 선택';

양의 변수 램;

방정식
   cbal '비용 균형'
   tbal '탱커 밸런스'
   볼록한 '조합';

cbal..mobj =e= sum(s, mcost(s)*lam(s));

tbal.. sum(s, mtank(s)*lam(s)) =l= 9;

볼록..합(들, 램(들)) =e= 1;

모델 마스터 / cbal, tbal, 볼록 /;

매개변수 담당자(ss,*);

* 유조선에 대한 비용이 전혀 들지 않는 첫 번째 솔루션 확보
cship = 1;
ctank = 0;

비용을 최소화하는 lp를 사용하여 sub를 해결합니다.
mcost('1') = 선박.l;
mtank('1') = 탱크.l;

* 유조선 비용이 전혀 들지 않는 두 번째 솔루션 확보
옵션 limCol = 0, limRow = 0;

lp 최소화 탱크를 사용하여 하위 문제를 해결합니다.
mcost('2') = 선박.l;
mtank('2') = 탱크.l;

* 첫 번째 마스터 문제 해결
s('1') = 예;
s('2') = 예;

mobj를 최소화하는 lp를 사용하여 마스터를 해결합니다.
담당자('2','obj') = mobj.l;
rep('2','s-pi') = 볼록형.m;
담당자('2','t-pi') = -tbal.m;
담당자('2','갭') = inf;

* 이제 마스터 문제와 하위 문제를 반복할 준비가 되었습니다.
loop(ss$((s(ss) 아님) 및 (rep(ss-1,'gap') > .01)),
   ctank = -tbal.m;

   비용을 최소화하는 lp를 사용하여 sub를 해결합니다.
   mcost(ss) = 배송.l;
   mtank(ss) = 탱크.l;
   s(ss) = 예;

   mobj를 최소화하는 lp를 사용하여 마스터를 해결합니다.
   담당자(ss,'obj') = mobj.l;
   rep(ss,'s-pi') = 볼록형.m;
   담당자(ss,'t-pi') = -tbal.m;
   담당자(ss,'bnd') = 담당자(ss-1,'obj') - 담당자(ss-1,'s-pi') + mcost(ss) + mtank(ss)*rep(ss - 1,'t-pi');
   rep(ss,'best-bnd') = max(rep(ss - 1,'best-bnd'),rep(ss,'bnd'));
   담당자(ss,'gap') = 담당자(ss,'obj') - 담당자(ss,'best-bnd');
);

mcost, mtank, 담당자를 표시합니다.