설명
슬롯 커뮤니티를 사용하여 trnsport의 수정된 버전을 재구성하고 다음을 확인하십시오. 올바른 솔루션. 원래 모델에 대한 수정 사항: 1. 일부 공급 제약을 완화하고 제거하기 위해 데이터를 조정합니다. 퇴보. 2. LP 이중(즉, 가격)이 양수가 되도록 방정식을 조정합니다. 또 다른 토론과 또 다른 테스트를 위해 방향 조정이 남아 있습니다. 기고자: Steven Dirkse, 2010년 1월
소형 모델 유형 :슬롯 커뮤니티
카테고리 : 슬롯 커뮤니티 테스트 라이브러리
메인 파일 : emp06.gms
$title trnsport 모델을 기반으로 한 슬롯 커뮤니티 테스트(EMP06,SEQ=469)
$onText
슬롯 커뮤니티를 사용하여 수정된 버전의 tnsport를 재구성하고 다음을 확인합니다.
올바른 솔루션. 원래 모델에 대한 수정 사항:
1. 일부 공급 제약을 완화하고 제거하기 위해 데이터를 조정합니다.
퇴보.
2. LP 이중(즉, 가격)이 양수가 되도록 방정식을 조정합니다.
또 다른 토론과 또 다른 테스트를 위해 방향 조정이 남아 있습니다.
기고자: Steven Dirkse, 2010년 1월
$offText
세트
i 통조림 공장 / 시애틀, 샌디에이고 /
j 마켓 / 뉴욕, 시카고, 토피카 / ;
매개변수
a(i) 경우에 따라 공장 i의 생산 능력
/시애틀 350
샌디에이고 600 /
b(j) 다음과 같은 경우 시장 j의 수요
/ 뉴욕 325
시카고 300
토피카 275 / ;
테이블 d(i,j) 거리(천 마일)
뉴욕 시카고 토피카
시애틀 1.5 0.7 1.8
샌디에고 2.5 1.8 1.4 ;
스칼라 f 운임(1,000마일당 케이스당 달러) /90/ ;
매개변수 c(i,j) 운송 비용(케이스당 수천 달러) ;
c(i,j) = f * d(i,j) / 1000 ;
* ------------- 최적값 ----
매개변수
costMarg '객관적 eqn 한계' / 1 /
costLev '객관적 균형 수준' / 0 /
sPrice(i) '최적 공급 가격' /
시애틀 0.09
샌디에고 0
/
sLev(i) '최적 공급 수준' /
시애틀 -350
샌디에고 -550
/
dPrice(j) '최적 수요 가격' /
뉴욕 0.2250
시카고 0.1530
토피카 0.1260
/
dLev(j) '최적 수요 수준' /
뉴욕 325
시카고 300
토피카 275
/
zLev '최적의 z 레벨' / 122.175 /
xMarg(i,j) '최적 x 한계' /
시애틀.뉴욕 0
시애틀.시카고 0
시애틀 .topeka 0.126
샌디에고.뉴욕 0
샌디에고.시카고 0.009
샌디에고.topeka 0
/
xLev(i,j) '최적 x 수준' /
시애틀.뉴욕 50
시애틀.시카고 300
시애틀.토피카 0
샌디에고.뉴욕 275
샌디에고.시카고 0
샌디에고.토페카 275
/
;
긍정적인 변수
x(i,j) 케이스의 배송 수량
spr(i) '공급가격'
dPr(j) '수요 가격'
;
변수
z 총 운송 비용(단위: 수천 달러);
;
방정식
비용 정의 목적 함수
공급(i) 공장 i의 공급 제한을 준수합니다.
수요(j)는 시장 j의 수요를 충족시킵니다.
DemandX(j) '시장 j에서 가격 반응 수요를 충족'
이익(i,j)
;
비용 .. z =e= sum((i,j), c(i,j)*x(i,j)) ;
공급(i) .. a(i) =g= sum(j, x(i,j)) ;
수요(j) .. sum(i, x(i,j)) =g= b(j) ;
DemandX(j) .. sum(i, x(i,j)) =g= b(j) - eps*dPr(j) ;
이익(i,j) .. sPr(i) + c(i,j) =g= dPr(j);
모델 운송 / 비용, 공급, 수요 / ;
모델 transmcp / 공급.sPr, 수요X.dPr, 이익.x / ;
모델 transemp '슬롯 커뮤니티를 사용하여 해결' / 비용, 공급, 수요X /;
파일 FX / '%슬롯 커뮤니티info%' /;
* ------------- LP 풀기/확인하기 -----------------
z 를 최소화하는 lp를 사용하여 translp를 해결합니다.
abort$[abs(costMarg-cost.m) > 1e-5] '나쁜 비용 한계',
비용.m, 비용Marg;
abort$[smaxi, abs(sPrice(i)-supply.m(i)) > 1e-5] '공급 가격 불량',
공급.m, sPrice;
abort$[smaxj, abs(dPrice(j)-demand.m(j)) > 1e-5] '잘못된 수요 가격',
수요.m, dPrice;
abort$[abs(costLev-cost.l) > 1e-5] '나쁜 비용 수준',
비용.l, 비용Lev;
abort$[smaxi, abs(sLev(i)-supply.l(i)) > 1e-5] '공급 수준 불량',
공급.l, sLev;
abort$[smaxj, abs(dLev(j)-demand.l(j)) > 1e-5] '나쁜 수요 수준',
수요.l, dLev;
abort$[abs(z.m) > 1e-5] '나쁜 z 한계 - 0이 아님', z.m;
abort$[smax(i,j), abs(xMarg(i,j)-x.m(i,j)) > 1e-5] '불량 x 한계',
xm, xMarg;
abort$[abs(zLev-z.l) > 1e-5] '잘못된 z 레벨',
z.l, zLev;
abort$[smax(i,j), abs(xLev(i,j)-x.l(i,j)) > 1e-5] '잘못된 x 레벨',
xl, xLev;
* ------------- MCP 해결/확인 ----
mcp를 사용하여 transmcp를 해결합니다.
abort$[smaxi, abs(sPrice(i)-supply.m(i)) > 1e-5] '공급 가격 불량',
공급.m, sPrice;
abort$[smaxj, abs(dPrice(j)-demandX.m(j)) > 1e-5] '잘못된 수요 가격',
수요X.m, dPrice;
abort$[smaxi, abs(sLev(i)-supply.l(i)) > 1e-5] '공급 수준 불량',
공급.l, sLev;
abort$[smaxj, abs(dLev(j)-demandX.l(j)) > 1e-5] '나쁜 수요 수준',
수요X.l, dLev;
abort$[smax(i,j), abs(xMarg(i,j)-x.m(i,j)) > 1e-5] '불량 x 한계',
xm, xMarg;
abort$[smax(i,j), abs(xLev(i,j)-x.l(i,j)) > 1e-5] '잘못된 x 레벨',
xl, xLev;
abort$[smaxi, abs(sPrice(i)-sPr.l(i)) > 1e-5] '공급 가격 불량',
sPr.l, sPrice;
abort$[smaxj, abs(dPrice(j)-dPr.l(j)) > 1e-5] '나쁜 수요 가격',
dPr.l, dPrice;
* ------------- Dualvar를 사용하여 슬롯 커뮤니티 풀기/확인 -----------------
* 슬롯 커뮤니티 정보 파일을 사용하여 수요 가격을 정의합니다.
* 수요 방정식의 쌍대
put fx '* dPr(j) = DemandX.m(j)';
loopj, put / 'dualvar' dPr(j) DemandX(j) ;
닫다;
z 를 최소화하는 슬롯 커뮤니티 를 사용하여 transemp를 해결합니다.
abort$[abs(costMarg-cost.m) > 1e-5] '나쁜 비용 한계',
비용.m, 비용Marg;
abort$[smaxi, abs(sPrice(i)-supply.m(i)) > 1e-5] '공급 가격 불량',
공급.m, sPrice;
abort$[smaxj, abs(dPrice(j)-demandX.m(j)) > 1e-5] '잘못된 수요 가격',
수요X.m, dPrice;
abort$[abs(costLev-cost.l) > 1e-5] '나쁜 비용 수준',
비용.l, 비용Lev;
abort$[smaxi, abs(sLev(i)-supply.l(i)) > 1e-5] '공급 수준 불량',
공급.l, sLev;
abort$[smaxj, abs(dLev(j)-demandX.l(j)) > 1e-5] '나쁜 수요 수준',
수요X.l, dLev;
abort$[abs(z.m) > 1e-5] '나쁜 z 한계 - 0이 아님', z.m;
abort$[smax(i,j), abs(xMarg(i,j)-x.m(i,j)) > 1e-5] '불량 x 한계',
xm, xMarg;
abort$[abs(zLev-z.l) > 1e-5] '잘못된 z 레벨',
z.l, zLev;
abort$[smax(i,j), abs(xLev(i,j)-x.l(i,j)) > 1e-5] '잘못된 x 레벨',
xl, xLev;
abort$[smaxj, abs(dPrice(j)-dPr.l(j)) > 1e-5] '나쁜 수요 가격',
dPr.l, dPrice;
* ------------- 평형이 있는 슬롯 커뮤니티 풀기/확인 -----------------
* 슬롯 커뮤니티 정보 파일을 사용하여 슬롯 커뮤니티에서 평형 모델을 설정합니다.
fx를 넣어;
'평형'을 두다 /;
'최소 z * 비용'을 입력하세요. /;
루프나,
공급(i) 넣기 /;
;
루프j,
수요X(j)를 넣어 /;
;
루프j,
put 'dualVar' dPr(j) DemandX(j) /;
;
닫다;
슬롯 커뮤니티를 사용하여 transemp를 해결합니다.
abort$[abs(costMarg-cost.m) > 1e-5] '나쁜 비용 한계',
비용.m, 비용Marg;
abort$[smaxi, abs(sPrice(i)-supply.m(i)) > 1e-5] '공급 가격 불량',
공급.m, sPrice;
abort$[smaxj, abs(dPrice(j)-demandX.m(j)) > 1e-5] '잘못된 수요 가격',
수요X.m, dPrice;
abort$[abs(costLev-cost.l) > 1e-5] '나쁜 비용 수준',
비용.l, 비용Lev;
abort$[smaxi, abs(sLev(i)-supply.l(i)) > 1e-5] '공급 수준 불량',
공급.l, sLev;
abort$[smaxj, abs(dLev(j)-demandX.l(j)) > 1e-5] '나쁜 수요 수준',
수요X.l, dLev;
abort$[abs(z.m) > 1e-5] '나쁜 z 한계 - 0이 아님', z.m;
abort$[smax(i,j), abs(xMarg(i,j)-x.m(i,j)) > 1e-5] '불량 x 한계',
xm, xMarg;
abort$[abs(zLev-z.l) > 1e-5] '잘못된 z 레벨',
z.l, zLev;
abort$[smax(i,j), abs(xLev(i,j)-x.l(i,j)) > 1e-5] '잘못된 x 레벨',
xl, xLev;
abort$[smaxj, abs(dPrice(j)-dPr.l(j)) > 1e-5] '나쁜 수요 가격',
dPr.l, dPrice;
* ==============================================================
* 동일한 테스트를 다시 수행하지만 이제는 색인화되지 않은 슬롯 커뮤니티info 파일을 사용합니다.
* ==============================================================
* ------------- Dualvar를 사용하여 슬롯 커뮤니티 풀기/확인 -----------------
* 슬롯 커뮤니티 정보 파일을 사용하여 수요 가격을 정의합니다.
* 수요 방정식의 쌍대
put fx '* dPr(j) = DemandX.m(j)';
putclose / 'dualvar dPr DemandX';
z 를 최소화하는 슬롯 커뮤니티 를 사용하여 transemp를 해결합니다.
abort$[abs(costMarg-cost.m) > 1e-5] '나쁜 비용 한계',
비용.m, 비용Marg;
abort$[smaxi, abs(sPrice(i)-supply.m(i)) > 1e-5] '공급 가격 불량',
공급.m, sPrice;
abort$[smaxj, abs(dPrice(j)-demandX.m(j)) > 1e-5] '잘못된 수요 가격',
수요X.m, dPrice;
abort$[abs(costLev-cost.l) > 1e-5] '나쁜 비용 수준',
비용.l, 비용Lev;
abort$[smaxi, abs(sLev(i)-supply.l(i)) > 1e-5] '공급 수준 불량',
공급.l, sLev;
abort$[smaxj, abs(dLev(j)-demandX.l(j)) > 1e-5] '나쁜 수요 수준',
수요X.l, dLev;
abort$[abs(z.m) > 1e-5] '나쁜 z 한계 - 0이 아님', z.m;
abort$[smax(i,j), abs(xMarg(i,j)-x.m(i,j)) > 1e-5] '불량 x 한계',
xm, xMarg;
abort$[abs(zLev-z.l) > 1e-5] '잘못된 z 레벨',
z.l, zLev;
abort$[smax(i,j), abs(xLev(i,j)-x.l(i,j)) > 1e-5] '잘못된 x 레벨',
xl, xLev;
abort$[smaxj, abs(dPrice(j)-dPr.l(j)) > 1e-5] '나쁜 수요 가격',
dPr.l, dPrice;
* ------------- 평형이 있는 슬롯 커뮤니티 풀기/확인 -----------------
* 슬롯 커뮤니티 정보 파일을 사용하여 슬롯 커뮤니티에서 평형 모델을 설정합니다.
fx '평형'을 입력하세요 /;
'최소 z * 비용 공급 수요X'를 입력하세요. /;
putclose 'dualVar dPr DemandX' /;
슬롯 커뮤니티를 사용하여 transemp를 해결합니다.
abort$[abs(costMarg-cost.m) > 1e-5] '나쁜 비용 한계',
비용.m, 비용Marg;
abort$[smaxi, abs(sPrice(i)-supply.m(i)) > 1e-5] '공급 가격 불량',
공급.m, sPrice;
abort$[smaxj, abs(dPrice(j)-demandX.m(j)) > 1e-5] '잘못된 수요 가격',
수요X.m, dPrice;
abort$[abs(costLev-cost.l) > 1e-5] '나쁜 비용 수준',
비용.l, 비용Lev;
abort$[smaxi, abs(sLev(i)-supply.l(i)) > 1e-5] '공급 수준 불량',
공급.l, sLev;
abort$[smaxj, abs(dLev(j)-demandX.l(j)) > 1e-5] '나쁜 수요 수준',
수요X.l, dLev;
abort$[abs(z.m) > 1e-5] '나쁜 z 한계 - 0이 아님', z.m;
abort$[smax(i,j), abs(xMarg(i,j)-x.m(i,j)) > 1e-5] '불량 x 한계',
xm, xMarg;
abort$[abs(zLev-z.l) > 1e-5] '잘못된 z 레벨',
z.l, zLev;
abort$[smax(i,j), abs(xLev(i,j)-x.l(i,j)) > 1e-5] '잘못된 x 레벨',
xl, xLev;
abort$[smaxj, abs(dPrice(j)-dPr.l(j)) > 1e-5] '나쁜 수요 가격',
dPr.l, dPrice;