emp06.gms : trnsport 모델 기반 슬롯 커뮤니티 테스트

설명

슬롯 커뮤니티를 사용하여 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;