linearne.gms : 극단 슬롯 커뮤니티 평형을 위한 선형화 기술

설명

이 모델은 계산에 대한 새로운 접근 방식을 제안합니다.
도매 전력 시장에서 슬롯 커뮤니티 내쉬 균형의
전송 제약. 이 접근 방식은 선형화 기술을 사용합니다.
슬롯 커뮤니티 내쉬 평형 문제를 다음과 같이 공식화합니다.
단일 단계 혼합 정수 선형 계획법 문제
표준 소프트웨어로 해결할 수 있습니다. 소개된 내용을 통해
슬롯 커뮤니티-내쉬 평형의 개념, 파생된 구조는
게임의 모든 내쉬 균형을 효율적으로 찾습니다.

이 예는 대략적으로 NSW 시장을 기반으로 합니다. 7개의 포트폴리오가 있습니다.
각각 2개의 장치를 제어합니다.

대형 모델 유형 :EMP


카테고리 : 슬롯 커뮤니티 모델 라이브러리


메인 파일 : 슬롯 커뮤니티gms

$title 극한 내쉬 균형을 위한 선형화 기술(LINEARNE,SEQ=382)

$onText
이 모델은 계산에 대한 새로운 접근 방식을 제안합니다.
도매 전력 시장에서 극한 내쉬 균형의
전송 제약. 이 접근 방식은 선형화 기술을 사용합니다.
극한 내쉬 평형 문제를 다음과 같이 공식화합니다.
단일 단계 혼합 정수 선형 계획법 문제
표준 소프트웨어로 해결할 수 있습니다. 소개된 내용을 통해
극한-내쉬 평형의 개념, 파생된 구조는
게임의 모든 내쉬 균형을 효율적으로 찾습니다.

이 예는 대략적으로 NSW 시장을 기반으로 합니다. 7개의 포트폴리오가 있습니다.
각각 2개의 유닛을 제어합니다.

참조:
Hesamzadeh, M R 및 Biggar, D R, 극한 내쉬 평형 계산
단일 단계 MILP를 사용하는 도매 전력 시장에서.
전력 시스템에 관한 IEEE 거래 27, 3(2012), 1706-1707.

이 코드는 다음에 의해 개발되었습니다.

모하마드 R. 헤삼자데 박사,
전기공학부,
KTH 왕립공과대학, 스웨덴
(이메일:mrhesamzadeh@ee.kth.se)

대릴 R. 비가(Darryl R. Biggar) 박사,
규제 개발 부서,
호주 경쟁 및 소비자 위원회, 호주
(이메일:darryl.biggar@accc.gov.au)

키워드: 확장 수학 계획법, 에너지 경제학, 내쉬 균형,
          선형화 기술, 전력 시장
$offText

세트
   p '전략적 생산 단위를 소유한 포트폴리오'
     / 델타, eraringp, macgen, Sithe, uranq, redbank, 스노우 /
   당신은 '발전 단위'
     /콜론그라, 문모라, 이레이링, 숄헤이븐, 베이즈워터
       huntvgt,sithe1,sithe2,uranq1,uranq2
       redbank1, redbank2, snowy1, snowy2, 델타콘
       삭제콘, 맥겐콘, 탈라와라, VOLL /
   owns(p,u) '포트폴리오와 유닛 간의 소유권 관계'
             / 델타.(colongra, munmorah), eraringp.(eraring, shoalhaven)
               macgen.(bayswater,huntvgt),sithe.(sithe1,sithe2)
               uranq.(uranq1, uranq2), redbank.(redbank1, redbank2)
               눈이 온다.(눈이 1, 눈이 2) /
   us(u) '전략적 생성자 목록'
   un(u) '비전략적 생성자 목록';

우리가 < 소유하는 옵션;
un(u) = 우리(u)가 아님;

테이블 unitData(u,*) '단위 데이터'
                     비용 상한
   콜론그라 87.19 560
   문모라 19.87 1080
   지우기 17.42 660
   숄헤이븐 300.00 240
   베이즈워터 12.78 1200
   헌트vgt 383.47 44
   시테1 37.16 80
   시테2 37.16 80
   우란q1 78.32 320
   우란q2 78.32 320
   레드뱅크1 12.49 100
   레드뱅크2 12.49 45
   눈 덮인1 300.00 1250
   눈 덮인2 300.00 666
   델타콘 19.87 3240
   삭제 콘 17.42 1980
   맥겐콘 12.78 3600
   탈라와라 27.54 422
   VOLL 10000.00 90000;

ds '고려할 수요 범위' 설정 / d1*d35 /;

매개변수
   cost(u) 'MWh당 발전 단위 u달러의 가변 비용'
   cap(u) '단위 u의 최대 생산 능력(MW)'
   Demand(ds) '모델의 각 실행에서의 수요'
   D '총수요';

비용(u) = 단위데이터(u,'비용');
cap(u) = unitData(u,'cap');
수요(ds) = 8000 + (ord(ds) - 1)*200;

* 다음 변수는 상황에 따라 변경되어야 합니다.
* 단위당 작업 수
세트
   a '각 유닛에 대해 가능한 조치' / q1*q4 /
   s '각 포트폴리오에 대한 전략 열거' / s1*s16 /
   k '이진수 인덱스 - b1 LSB' / b1*b2 /
   sl(p,s,u,a) '각 포트폴리오에 허용되는 전략 목록'
   ps(p,s) '각 포트폴리오에 정의된 전략 목록';

중단$(round(card(a)**smax(p, sum(owns(p,u),1))) <> 카드)
   "시나리오와 포트폴리오의 최대 단위 수가 일치하지 않습니다";

abort$(round(2**card(k)) <> 카드(a)) "작업과 이진수가 일치하지 않습니다.";

* 모든 전략 열거
매개변수 pow(u), pu(p), cont;

pu(p) = sum(소유(p,u), 1);
루프(p,
   파워(u) = 0;
   loop(s$(ord(s) <= round(card(a)**pu(p))),
      loop((owns(p,u),a)$sameas('q1',a), sl(p,s,u,a+pow(u)) = yes);
      계속 = 1;
      루프(소유(p,u)$cont,
         if(pow(u) < 카드(a) - 1,
            pow(u) = pow(u) + 1;
            계속 = 0;
         그렇지 않으면
            파워(u) = 0;
         );
      );
   );
);
디스플레이 sl;
옵션 ps < sl;

별칭(p,cp), (s,cs);

매개변수
   b0 '상수에 대한 추가 오프셋'
   b(k) '바이너리에서 생산으로의 변환 인자';

b0 = 전력(2,-카드(k));
b(k) = 거듭제곱(2,-(카드(k) - ord(k) + 1));

Set y(a,k) '단위 작업에서 출력 공유로 매핑';
y(a,k) = mod(trunc(ord(a)/power(2,ord(k) - 1)),2);

변수
   social_cost '객관변수'
   pi0(p) '포트폴리오 p의 이익'
   pi(cp,cs,p) '경우에도 마찬가지(cp cs)'
   pr0 '합의 쌍대(u,g0(u)) = D'
   pr(cp,cs) '경우에도 마찬가지입니다 (cp cs)';

양수 변수
   g0(u) '단위 생산'
   g(cp,cs,u) '경우에도 마찬가지입니다 (cp cs)'
   gh0(u) '전략 단위 시장에 제공되는 용량의 양'
   gh(cp,cs,u) '경우에도 마찬가지입니다(cp cs)'
   v0(u) 'g0(u)의 쌍대 >= 0'
   v(cp,cs,u) '경우에도 마찬가지입니다(cp cs)'
   w0(u) 'g0(u) <= gh0'의 쌍대
   w(cp,cs,u) '경우에도 마찬가지(cp cs)'
   z0(u,k) 'z0(u,k) = w0(u)*x0(u,k)'
   z(cp,cs,u,k) '경우에도 마찬가지입니다 (cp cs)';

바이너리 변수
   x0(u,k) '제공된 볼륨에 대한 숫자 선택'
   x(cp,cs,u,k) '경우에도 마찬가지입니다 (cp cs)';

방정식
   obj '객관적인 최악의 사회적 비용'
   kkt0(u) 'KKT 시스템'
   kkt(cp,cs,u) '경우에도 마찬가지입니다(cp cs)'
   요구사항at0 '수요 만족'
   demandat(cp,cs) '경우에도 마찬가지입니다(cp cs)'
   caplimit0(u) '용량 제한'
   caplimit(cp,cs,u) '경우에도 마찬가지입니다(cp cs)'
   defcap0(u) '전략 단위에 대한 용량 정의'
   defcap(cp,cs,u) '경우에도 마찬가지(cp cs)'
   defprofit0(p) '이익 정의'
   defprofit(cp,cs,p) '경우에도 마찬가지(cp cs)'
   defscen(cp,cs,u,k) '시나리오 용량 수정'
   defNE(cp,cs) '내쉬 균형';

obj .. social_cost =e= sum(u, 비용(u)*g0(u));

* WNE 후보에 대한 최적의 파견
kkt0(u).. -비용(u) + pr0 + v0(u) - w0(u) =e= 0;

요구사항at0.. sum(u, g0(u)) =e= D;

caplimit0(u)..gh0(u) =g= g0(u);

defcap0(us)..gh0(us) =e= (b0 + sum(k, b(k)*x0(us,k)))*cap(us);

defprofit0(p).. pi0(p) =e= sum(owns(p,us), (w0(us)*b0 + sum(k, b(k)*z0(us,k)))*cap(us));

gh0.fx(un) = cap(un);

* 보완조건
* 분리: v0() = 0 또는 g0() = 0 유지, w0() = 0 또는 g0() = gh0()
방정식 v0is0(u), g0is0(u), w0is0(u), g0isgh0(u);

v0is0(u).. v0(u) =e= 0;

g0is0(u).. g0(u) =e= 0;

w0is0(u).. w0(u) =e= 0;

g0isgh0(u).. g0(u) =e= gh0(u);

* z0(us,k) = w0(us)*x0(us,k)
* 분리 x0() = 1이면 z0isw0()이 유지되고 그렇지 않으면 z0is0이 유지됨
방정식 z0is0(u,k), z0isw0(u,k);

z0is0(us,k).. z0(us,k) =e= 0;

z0isw0(us,k).. z0(us,k) =e= w0(us);

* 대체 사례 cp ss에 대한 최적의 파견
kkt(ps,u).. -비용(u) + pr(ps) + v(ps,u) - w(ps,u) =e= 0;

요구량(ps).. sum(u, g(ps,u)) =e= D;

caplimit(ps,u)..gh(ps,u) =g= g(ps,u);

defcap(ps,us)..gh(ps,us) =e= (b0 + sum(k, b(k)*x(ps,us,k)))*cap(us);

defprofit(ps,p)..pi(ps,p) =e= sum(소유(p,us), (w(ps,us)*b0
                              + sum(k, b(k)*z(ps,us,k)))*cap(us));

defscen(ps(cp,cs),us,k)..
   x(ps,us,k) =e= x0(us,k)$(소유하지 않음(cp,us)) + sum((sl(ps,us,a), y(a,k)),1)$owns(cp,us);

gh.fx(ps,un) = cap(un);

* 보완조건
* 분리: v() = 0 또는 g() = 0 유지, w() = 0 또는 g() = gh()
방정식 vis0(cp,cs,u), gis0(cp,cs,u), wis0(cp,cs,u), gisgh(cp,cs,u);

vis0(ps(cp,cs),u)..v(ps,u) =e= 0;

gis0(ps(cp,cs),u)..g(ps,u) =e= 0;

wis0(ps(cp,cs),u).. w(ps,u) =e= 0;

gisgh(ps(cp,cs),u)..g(ps,u) =e= gh(ps,u);

* z(ps,us,k) = w(ps,us)*x(ps,us,k)
* 분리 x() = 1이면 zisw()는 유지되고 그렇지 않으면 zis0이 유지됩니다.
방정식 zis0(cp,cs,u,k), zisw(cp,cs,u,k);

zis0(ps,us,k).. z(ps,us,k) =e= 0;

zisw(ps,us,k).. z(ps,us,k) =e= w(ps,us);

* 이 방정식은 선택한 전략 조합이 NE임을 보장합니다.
defNE(ps(cp,cs))..pi0(cp) =g= pi(ps,cp);

모델 선형NE / 모두 /;

파일 emp / '%emp.info%' /;
put emp '* 문제 %슬롯 커뮤니티i%' / '기본 bigM 1e5';
루프(유,
   put / 'disjunction *' v0is0(u) 'else' g0is0(u);
   put / 'disjunction *' w0is0(u) 'else' g0isgh0(u);
);
루프((우리, k),
   put / 'disjunction' x0(us,k) z0isw0(us,k) 'else' z0is0(us,k);
);
루프((ps,u),
   put / 'disjunction *' vis0(ps,u) 'else' gis0(ps,u);
   put / 'disjunction *' wis0(ps,u) 'else' gisgh(ps,u);
);
루프((ps,us,k),
   / '접합' x(ps,us,k) zisw(ps,us,k) 'else' zis0(ps,us,k);
);
넣어닫다;

옵션 optCr = 0, limRow = 0, limCol = 0, solPrint = off;

매개변수 결과(ds,*);
결과(ds,'D') = 수요(ds);
results(ds,'obj') = na;
루프(ds,
   D = 수요(ds);
   social_cost를 최소화하는 emp를 사용하여 LinearNE를 해결합니다.
   results(ds,'obj')$[LinearNE.modelStat = %modelStat.optimal%] = LinearNE.objVal;
);

결과 표시;
중단$[smaxds, abs(mapval(results(ds,'obj'))) > 0]
   '일부 해결되지 않은 사례', 결과;
중단$[sminds$[ord(ds) > 1], 결과(ds,'obj') - 결과(ds,'obj') < 0]
   '계산된 목표가 증가하지 않습니다', 결과;