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

설명

슬롯 커뮤니티를 사용하여 trnsport의 수정된 버전을 재구성하고 다음을 확인하십시오.
올바른 솔루션.  원래 모델에 대한 수정 사항:
  1. 일부 공급 제약을 완화하고 제거하기 위해 데이터를 조정합니다.
  퇴보.
  2. 방정식 방향을 조정하지 마십시오(emp07과 비교).
  3. NLP로 조정

기고자: Steven Dirkse, 2010년 1월

소형 모델 유형 :슬롯 커뮤니티


카테고리 : 슬롯 커뮤니티 테스트 라이브러리


메인 파일 : emp08.gms

$title trnsport 모델을 기반으로 한 슬롯 커뮤니티 테스트(EMP08,SEQ=471)

$onText
슬롯 커뮤니티를 사용하여 수정된 버전의 tnsport를 재구성하고 다음을 확인합니다.
올바른 솔루션.  원래 모델에 대한 수정 사항:
  1. 일부 공급 제약을 완화하고 제거하기 위해 데이터를 조정합니다.
  퇴보.
  2. 방정식 방향을 조정하지 마십시오(emp07과 비교).
  3. NLP로 조정

기고자: Steven Dirkse, 2010년 1월

$offText

세트
     i 통조림 공장 / 시애틀, 샌디에고 /
     j 마켓 / 뉴욕, 시카고, 토피카 / ;

매개변수
     a(i) 경우에 따라 공장 i의 생산 능력
       /시애틀 350
            샌디에이고 600 /
     b(j) 다음과 같은 경우 시장 j의 수요
       / 뉴욕 325
            시카고 300
            토피카 275 /
     esub(j) 수요의 가격 탄력성(가격이 1과 동일할 때) /
            뉴욕 1.5
            시카고 1.2
            토피카 2.0 / ;

테이블 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 총 운송 비용(단위: 수천 달러);
  ;

방정식
  비용 정의 목적 함수
  maxcost는 목적 함수를 최대로 정의합니다.
  공급(i) 공장 i의 공급 제한을 준수합니다.
  mcpsupply(i) 공장 i의 공급 제한을 준수합니다.
  수요(j)는 시장 j의 수요를 충족시킵니다.
  nldemand(j) '시장 j에서 가격 반응 수요를 충족'
  이익(i,j)
  ;

비용 .. z =e= sum((i,j), c(i,j)*x(i,j)) ;
최대 비용 .. z =e= sum((i,j), -c(i,j)*x(i,j)) ;

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

수요(j) .. sum(i, x(i,j)) =g= b(j) ;
nldemand(j) .. sum(i, x(i,j)) =g= b(j)*(dPrice(j)/dPr(j))**esub(j) ;

이익(i,j) .. sPr(i) + c(i,j) =g= dPr(j);

모델 이동 / 비용, 공급, 수요 / ;
모델 transmcp / mcpsupply.sPr, nldemand.dPr,profit.x / ;
모델 transemp '슬롯 커뮤니티를 사용하여 해결' / maxcost, Supply, nldemand /;

파일 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 해결/확인 ----
dPr.l(j) = dPrice(j);
mcp를 사용하여 transmcp를 해결합니다.

abort$[smaxi, abs(sPrice(i)-mcpsupply.m(i)) > 1e-5] '잘못된 mcpsupply 가격',
  mcpsupply.m, sPrice;
abort$[smaxj, abs(dPrice(j)-nldemand.m(j)) > 1e-5] '잘못된 수요 가격',
  nldemand.m, dPrice;

abort$[smaxi, abs(sLev(i)+mcpsupply.l(i)) > 1e-5] '잘못된 mcpsupply 수준',
  mcpsupply.l, sLev;
abort$[smaxj, abs(nldemand.l(j)) > 1e-5] '나쁜 MCP 수요 수준',
  nldemand.l;

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를 사용하여 슬롯 커뮤니티 풀기/확인 -----------------
* 슬롯 커뮤니티 정보 파일을 사용하여 수요 가격을 정의합니다.
* 수요 방정식의 쌍대
fx '* dPr(j) = nldemand.m(j)'를 넣습니다.
loopj, put / 'dualvar' dPr(j) '-' nldemand(j);
닫다;
z 를 최대화하는 슬롯 커뮤니티를 사용하여 transemp를 해결합니다.

abort$[abs(costMarg-maxcost.m) > 1e-5] '최소 비용 한계',
  maxcost.m, 비용Marg;
abort$[smaxi, abs(sPrice(i)-supply.m(i)) > 1e-5] '공급 가격 불량',
  공급.m, sPrice;
abort$[smaxj, abs(dPrice(j) + nldemand.m(j)) > 1e-5] '잘못된 수요 가격',
  nldemand.m, dPrice;

abort$[abs(costLev-maxcost.l) > 1e-5] '나쁜 비용 수준',
  maxcost.l, costLev;
abort$[smaxi, abs(sLev(i)-supply.l(i)) > 1e-5] '공급 수준 불량',
  공급.l, sLev;
abort$[smaxj, abs(nldemand.l(j)) > 1e-5] '나쁜 DualEqu 수요 수준',
  nldemand.l;

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;

* ------------- 평형이 있는 슬롯 커뮤니티 풀기/확인 -----------------
* 슬롯 커뮤니티 정보 파일을 사용하여 슬롯 커뮤니티에서 평형 모델을 설정합니다.
* nldemand가 발생하는 두 곳 모두에서 뒤집어야 한다는 점에 유의하세요.
* 모호한 사양을 피하기 위해
fx를 넣어;
'평형'을 두다 /;
'max z * maxcost'를 입력하세요. /;
루프나,
  공급(i) 넣기 /;
;
루프j,
  put '-'nldemand(j) /;
;
루프j,
  put 'dualVar' dPr(j) '-' nldemand(j) /;
;
닫다;
슬롯 커뮤니티를 사용하여 transemp를 해결합니다.

abort$[abs(costMarg-maxcost.m) > 1e-5] '최소 비용 한계',
  maxcost.m, 비용Marg;
abort$[smaxi, abs(sPrice(i)-supply.m(i)) > 1e-5] '공급 가격 불량',
  공급.m, sPrice;
abort$[smaxj, abs(dPrice(j) + nldemand.m(j)) > 1e-5] '잘못된 수요 가격',
  nldemand.m, dPrice;

abort$[abs(costLev-maxcost.l) > 1e-5] '나쁜 비용 수준',
  maxcost.l, costLev;
abort$[smaxi, abs(sLev(i)-supply.l(i)) > 1e-5] '공급 수준 불량',
  공급.l, sLev;
abort$[smaxj, abs(nldemand.l(j)) > 1e-5] '나쁜 DualEqu 수요 수준',
  nldemand.l;

abort$[abs(z.m) > 1e-5] '나쁜 z 한계 - 0이 아님', z.m;
* 최소에서 최대로 스위치를 사용하여 x 변경 기호의 한계
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를 사용하여 슬롯 커뮤니티 풀기/확인 -----------------
* 슬롯 커뮤니티 정보 파일을 사용하여 수요 가격을 정의합니다.
* 수요 방정식의 쌍대
fx '* dPr(j) = nldemand.m(j)'를 넣습니다.
putclose / 'dualvar dPr -nldemand';
z 를 최대화하는 슬롯 커뮤니티를 사용하여 transemp를 해결합니다.

abort$[abs(costMarg-maxcost.m) > 1e-5] '최소 비용 한계',
  maxcost.m, 비용Marg;
abort$[smaxi, abs(sPrice(i)-supply.m(i)) > 1e-5] '공급 가격 불량',
  공급.m, sPrice;
abort$[smaxj, abs(dPrice(j) + nldemand.m(j)) > 1e-5] '잘못된 수요 가격',
  nldemand.m, dPrice;

abort$[abs(costLev-maxcost.l) > 1e-5] '나쁜 비용 수준',
  maxcost.l, costLev;
abort$[smaxi, abs(sLev(i)-supply.l(i)) > 1e-5] '공급 수준 불량',
  공급.l, sLev;
abort$[smaxj, abs(nldemand.l(j)) > 1e-5] '나쁜 DualEqu 수요 수준',
  nldemand.l;

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;

* ------------- 평형이 있는 슬롯 커뮤니티 풀기/확인 -----------------
* 슬롯 커뮤니티 정보 파일을 사용하여 슬롯 커뮤니티에서 평형 모델을 설정합니다.
* nldemand가 발생하는 두 곳 모두에서 뒤집어야 한다는 점에 유의하세요.
* 모호한 사양을 피하기 위해
fx '평형'을 입력하세요 /;
'max z * 최대 비용 공급 -nldemand' /를 입력합니다.
putclose 'dualVar dPr -nldemand' /;
슬롯 커뮤니티를 사용하여 transemp를 해결합니다.

abort$[abs(costMarg-maxcost.m) > 1e-5] '최소 비용 한계',
  maxcost.m, 비용Marg;
abort$[smaxi, abs(sPrice(i)-supply.m(i)) > 1e-5] '공급 가격 불량',
  공급.m, sPrice;
abort$[smaxj, abs(dPrice(j) + nldemand.m(j)) > 1e-5] '잘못된 수요 가격',
  nldemand.m, dPrice;

abort$[abs(costLev-maxcost.l) > 1e-5] '나쁜 비용 수준',
  maxcost.l, costLev;
abort$[smaxi, abs(sLev(i)-supply.l(i)) > 1e-5] '공급 수준 불량',
  공급.l, sLev;
abort$[smaxj, abs(nldemand.l(j)) > 1e-5] '나쁜 DualEqu 수요 수준',
  nldemand.l;

abort$[abs(z.m) > 1e-5] '나쁜 z 한계 - 0이 아님', z.m;
* 최소에서 최대로 스위치를 사용하여 x 변경 기호의 한계
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;