emp11.gms : Scarfmcp의 EMP 공식 테스트

설명

스카프의 활동 분석 예

Scarf, H 및 Hansen, T, 경제 균형 계산.
예일 대학 출판부, 1973.

GAMSLIB 모델 Scarpmcp에서와 같이 MCP를 명시적으로 구성하는 대신,
대신 우리는
   max_p sum (h, i(h) * log(expend_h(p))) - p'*sum(h, endow(.,h))
   s.t A'p <= 0, p >= 0

여기서 expend_h는 다음과 같이 정의되는 지출 함수입니다.
   expend_h(p) = min_c p'*c s.t.  u_h(c) >= 1

이에 대해서는 Rutherford의 1992년 논문 "Sequential Joint Maximization"에 자세히 설명되어 있습니다.

소형 모델 유형 :슬롯 나라


카테고리 : 슬롯 나라 테스트 라이브러리


메인 파일 : emp11.gms

$title Scarfmcp의 EMP 공식 테스트(EMP11,SEQ=500)

$onText
Scarf의 활동 분석 예

Scarf, H 및 Hansen, T, 경제 균형 계산.
예일 대학 출판부, 1973.

GAMSLIB 모델 Scarpmcp에서와 같이 MCP를 명시적으로 구성하는 대신,
대신 우리는
   max_p sum (h, i(h) * log(expend_h(p))) - p'*sum(h, endow(.,h))
   s.t A'p <= 0, p >= 0

여기서 expend_h는 다음과 같이 정의되는 지출 함수입니다.
   expend_h(p) = min_c p'*c s.t.  u_h(c) >= 1

이에 대해서는 Rutherford의 1992년 논문 "Sequential Joint Maximization"에 자세히 설명되어 있습니다.

$offText

세트
        c 상품

                /capeop, nondurbl, 내구성, capbop, Skillab, unsklab/

        h 소비자

                /에이전트1,에이전트2,에이전트3,에이전트4,에이전트5/

        분야

                /d1, d2, n1, n2, n3, cd, c1, c2/;

별칭(c,cc);

표 e(c,h) 원자재 기부금

             에이전트1 에이전트2 에이전트3 에이전트4 에이전트5
캡밥 3 0.1 2 1 6
숙련도 5 0.1 6 0.1 0.1
unsklab 0.1 7 0.1 8 0.5
내구성 1 2 1.5 1 2

테이블 d(c,h) 참조 요구 사항

             에이전트1 에이전트2 에이전트3 에이전트4 에이전트5
카펩 4 0.4 2 5 3
스킬랩 0.2 0.5
언스크랩 0.6 0.2 0.2
비더블 2 4 2 5 4
내구성 3.2 1 1.5 4.5 2

테이블 데이터(*,c,s) 활동 분석 매트릭스

                         d1 d2 n1 n2 n3

출력.비듀블 6.0 8.0 7.0
출력.내구성 4.0 3.5
출력.capop 4.0 4.0 1.6 1.6 1.6
입력 .capbop 5.3 5.0 2.0 2.0 2.0
입력 .skillab 2.0 1.0 2.0 4.0 1.0
입력 .unsklab 1.0 6.0 3.0 1.0 8.0

              + CD C1 C2

출력.capop 0.9 7.0 8.0
입력 .capbop 1.0 4.0 5.0
입력 .skillab 3.0 2.0
.unsklab 1.0 8.0 입력;

매개변수 alpha(c,h) 수요 함수 공유 매개변수;
알파(c,h) = d(c,h) / sum(cc, d(cc,h));

매개변수 a(c,s) 활동 분석 매트릭스;
a(c,s) = data("출력",c,s) - data("입력",c,s);

매개변수
  pLev(c) '최적 가격 수준' /
    카펩 1.11786500051246
    비더블 0.546345872736342
    내구성 1.02036919464262
    캡밥 1.23055906867928
    스킬랩 0.871845012358443
    unsklab 0.287283691841206
  /
  ;

긍정적인 변수
        p(c) 상품 가격,
        y(s) 생산,
        i(h) 소득;

방정식
        mkt(c) 상품 시장,
        이익 제로 이익,
        소득(h) 소득지수;

mkt(c).. 합계(s, a(c,s) * y(s)) + 합계(h, e(c,h)) =g=

                합계(h,
                i(h) * 알파(c,h) / p(c));

이익(들).. -sum(c, a(c,s) * p(c)) =g= 0;

소득(h).. i(h) =g= sum(c, p(c) * e(c,h));

모델 스카프 / mkt.p,profit.y,income.i/;

* 이제 emp를 사용하여 동등한 모델을 설정합니다.
변수 z;
방정식 objdef;

objdef.. z =e= sum(h, i(h)*sum(c, alpha(c,h)*log(p(c))))
                - sum(c, sum(h, e(c,h))*p(c));

모델 스카프emp /objdef, 이익, 수입/;

p.lo(c) = 0.00001$(smax(h, alpha(c,h)) gt eps);

* 숫자 상품의 가격을 수정합니다.
i.fx(h)$(ord(h) eq 1) = sumc, e(c,h);

* MCP 모델을 풀고 확인
p.l(c) = 1;
y.l(s) = 1;
i.l(h) = sum(c, p.l(c) * e(c,h));
mcp를 사용하여 스카프를 해결합니다.
abort$[scarf.solveStat <> 1] 'MCP에 대한 잘못된solveStat', Scarf.solveStat;
abort$[scarf.modelStat <> 1] 'MCP에 대한 잘못된 modelStat', Scarf.modelStat;
abort$[smaxc, abs(pLev(c)-p.l(c)) > 1e-5] '잘못된 p 레벨',
  p.l, pLev;

* 생산량(y) 및 기타 변수에 대한 초기값 설정
이익.m(s) = 1;
p.l(c) = 1;
i.l(h) = sum(c, p.l(c) * e(c,h));

* 이제 "평형" 키워드를 사용하여 EMP로 MCP 솔루션을 재현합니다.
파일 myinfo / '%emp.info%' /;

myinfo / '평형'을 입력하세요.
put / 'max z p objdef 이익';
넣어 / 'vi';
loop(h$(i.lo(h) le i.up(h)),
  넣다 / 소득(h) i(h) );
닫다;

emp를 사용하여 Scarfemp를 해결합니다.
abort$[scarfemp.solveStat <> 1] 'EMP 평형에 대한 잘못된solveStat', Scarfemp.solveStat;
abort$[scarfemp.modelStat > 2] 'EMP 평형에 대한 잘못된 modelStat', Scarfemp.modelStat;
abort$[smaxc, abs(pLev(c)-p.l(c)) > 1e-5] '잘못된 p 레벨',
  p.l, pLev;

y.l(s) = 이익.m(s);
y.l을 표시;

* 이제 EMP로 MCP 솔루션을 재현해 보세요.
* 풀이 문에서 "max z" 및 "dualEqu" 키워드 사용
* 생산량(y) 및 기타 변수에 대한 초기값 설정
이익.m(s) = 1;
p.l(c) = 1;
i.l(h) = sum(c, p.l(c) * e(c,h));

myinfo / 'dualEqu'를 입력하세요.
loop(h$(i.lo(h) le i.up(h)),
  넣다 / 소득(h) i(h) );
닫다;

emp max z를 사용하여 Scarfemp를 해결합니다.
abort$[scarfemp.solveStat <> 1] 'EMP-dualEqu에 대한 잘못된solveStat', Scarfemp.solveStat;
abort$[scarfemp.modelStat > 2] 'EMP-dualEqu에 대한 잘못된 modelStat', Scarfemp.modelStat;
abort$[smaxc, abs(pLev(c)-p.l(c)) > 1e-5] '잘못된 p 레벨',
  p.l, pLev;

y.l(s) = 이익.m(s);
y.l을 표시;