설명
중앙 기관의 조정자는 유조선 서비스를 조달해야 합니다 그의 배포를 돕기 위해. 하청업체가 모든 것을 처리합니다. 배송 세부정보. 이 시나리오는 다음을 보여주기 위해 사용됩니다. 분해 원리. 자세한 내용은 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, 담당자를 표시합니다.