epscm.gms : 다목적 최적화를 위한 슬롯 게임-Constraint 방법

설명

eps-제약 방법

이것은 증강된 Eps-제약 방법의 슬롯 게임 구현입니다.
효율적인(파레토 최적, 비지배) 솔루션 생성
다목적 문제에서. EPS-제약 방법은 다음 중 하나를 최적화합니다.
나머지 목적 함수를 다음과 같이 사용하는 목적 함수
제약 조건에 따라 오른쪽이 달라집니다.

생성된 최적의 솔루션은 효율적인 솔루션임이 입증되었습니다.
특정 조건에서의 다목적 문제.

Eps-constraint 방법은 두 단계로 구성됩니다.
1. 보상 테이블 생성
2. 방법을 적용하려면 보수표의 범위를 사용하세요.

증강된 EPS 제약 조건은 사전 편찬 최적화를 사용합니다.
보수 테이블 구축(파레토를 확보하기 위해)
개별 최적의 최적성) 및 약간 수정된 목표
파레토 최적의 생산을 보장하기 위해 기능합니다.
약하게 파레토 최적) 솔루션. 추가로 조기 퇴장을 실시합니다.
실행 불가능한 루프로부터 알고리즘의 성능을 향상시킵니다.
여러 목적 함수를 사용하는 다목적 문제.

이 알고리즘은 MIP 모델에서도 작동할 수 있습니다. 실제로 장점은
가중치 방식에 비해 EPS 제약 방식이 더 많습니다.
지원되지 않는 파레토 최적의 MIP 문제에 대해 명백합니다.
솔루션을 생산할 수 있습니다.

단순화된 발전 문제는 다음을 설명하는 데 사용됩니다.
방법:

한 지역에서는 네 가지 유형의 발전 장치가 고려됩니다.
즉, 갈탄 연소, 석유 연소, 천연 가스 연소 및 장치
주로 소수력인 재생에너지원(RES)을 활용
그리고 바람.  이 장치의 발전 특성은 다음과 같습니다.
테이블 pdata에 표시됩니다.

연간 수요는 64000GWh이며 부하 기간이 특징입니다.
세 가지 유형의 하중으로 나눌 수 있는 곡선: 기본 하중(60%),
중간 부하(30%) 및 최대 부하(10%). 갈탄 발사 장치는 다음과 같습니다.
기본 및 중간 부하에만 사용되며, 중간 및 중간 부하용 석유 연소 장치
최대 부하, 기본 및 최대 부하에 대한 RES 단위, 천연가스
모든 유형의 부하에 대한 발사 장치. 내부 발생원은 갈탄이다.
그리고 RES.

우리는 생산 최소화라는 세 가지 목적 함수를 고려합니다.
비용, CO2 배출 최소화 및
외부 의존도(예: 석유 및 천연가스)를 극대화하여
내인성 에너지 원.  임무는 보수 테이블을 생성하는 것입니다.
파레토 최적(효율적, 비지배적) 솔루션
문제.

추가 정보는 다음에서 확인할 수 있습니다.

/modlib/adddocs/epscm.pdf

소형 슬롯 게임 유형 :LP


카테고리 : 슬롯 게임 모델 라이브러리


메인 파일 : 슬롯 게임gms

$title 다목적 최적화를 위한 EPS-Constraint 방법(EPSCM,SEQ=319)

$onText
Eps-제약 방법

이것은 증강된 Eps-제약 방법의 슬롯 게임 구현입니다.
효율적인(파레토 최적, 비지배) 솔루션 생성
다목적 문제에서. EPS-제약 방법은 다음 중 하나를 최적화합니다.
나머지 목적 함수를 다음과 같이 사용하는 목적 함수
제약 조건에 따라 오른쪽이 달라집니다.

생성된 최적의 솔루션은 효율적인 솔루션임이 입증되었습니다.
특정 조건에서의 다목적 문제.

Eps-constraint 방법은 두 단계로 구성됩니다.
1. 보상 테이블 생성
2. 방법을 적용하려면 보수표의 범위를 사용하세요.

증강된 EPS 제약 조건은 사전 편찬 최적화를 사용합니다.
보수 테이블 구축(파레토를 확보하기 위해)
개별 최적의 최적성) 및 약간 수정된 목표
파레토 최적의 생산을 보장하기 위해 기능합니다.
약하게 파레토 최적) 솔루션. 추가로 조기 퇴장을 실시합니다.
실행 불가능한 루프로부터 알고리즘의 성능을 향상시킵니다.
여러 목적 함수를 사용하는 다목적 문제.

이 알고리즘은 MIP 모델에서도 작동할 수 있습니다. 실제로 장점은
가중치 방식에 비해 EPS 제약 방식이 더 많습니다.
지원되지 않는 파레토 최적의 MIP 문제에 대해 명백합니다.
솔루션을 생산할 수 있습니다.

단순화된 발전 문제는 다음을 설명하는 데 사용됩니다.
방법:

한 지역에서는 네 가지 유형의 발전 장치가 고려됩니다.
즉, 갈탄 연소, 석유 연소, 천연 가스 연소 및 장치
주로 소수력인 재생에너지원(RES)을 활용
그리고 바람.  이 장치의 발전 특성은 다음과 같습니다.
테이블 pdata에 표시됩니다.

연간 수요는 64000GWh이며 부하 기간이 특징입니다.
세 가지 유형의 하중으로 나눌 수 있는 곡선: 기본 하중(60%),
중간 부하(30%) 및 최대 부하(10%). 갈탄 발사 장치는 다음과 같습니다.
기본 및 중간 부하에만 사용되며, 중간 및 중간 부하용 석유 연소 장치
최대 부하, 기본 및 최대 부하에 대한 RES 단위, 천연가스
모든 유형의 부하에 대한 발사 장치. 내부 발생원은 갈탄이다.
그리고 RES.

우리는 생산 최소화라는 세 가지 목적 함수를 고려합니다.
비용, CO2 배출 최소화 및
외부 의존도(예: 석유 및 천연가스)를 극대화하여
내인성 에너지 원.  임무는 보수 테이블을 생성하는 것입니다.
파레토 최적(효율적, 비지배적) 솔루션
문제.

추가 정보는 다음에서 확인할 수 있습니다.

/modlib/adddocs/epscm.pdf

Mavrotas, G, Eps-constraint 방법의 효과적인 구현
다중 목표 수학 계획법 문제.
응용수학과 계산 213, 2(2009), 455-465.

키워드: 선형 계획법, EPS 제약 조건 방법, 다목적 최적화
$offText

$log --- Python 라이브러리 %sysEnv.GMSPYTHONLIB% 사용

$inlineCom [ ]
$eolCom //

$sTitle 예제 모델 정의
세트
   p '발전 장치' / 갈탄, 석유, 가스, RES /
   i '부하 영역' / 베이스, 중간, 피크 /
   pi(p,i) '하중 유형에 대한 단위 가용성' / 갈탄.(기본,중간)
                                                   Oil.(중간,피크), Gas.set.i
                                                   RES.(기본, 피크) /
   es(p) '내인성 배출원' / 갈탄, RES /
   k '목적함수' / 비용, CO2배출, 내생적 /;

$세트 최소 -1
$set 최대 +1

매개변수 dir(k) '목적 함수의 방향'
                 / 비용 %min%, CO2배출량 %min%, 내생적 %max% /;

pheader/용량, 비용, CO2배출량/을 설정합니다.

테이블 pdata(pheader,p)
                         갈탄 석유 가스 RES
   용량 [GWh] 31000 15000 22000 10000
   비용 [$/MWh] 30 75 60 90
   CO2배출량 [t/MWh] 1.44 0.72 0.45 0;

매개변수
   광고 '연간 수요(GWh)' / 64000 /
   df(i) '부하 유형에 대한 수요 비율' / 기본 0.6, 중간 0.3, 피크 0.1 /
   수요(i) '부하 유형에 대한 수요(GWh)';

수요(i) = ad*df(i);

변수
   z(k) '목적 함수 변수';

양수 변수
   x(p,i) '부하 면적 단위의 생산 수준(GWh)';

방정식
   objcost '비용을 K$로 최소화하는 목표'
   objco2 'Kt의 CO2 배출 최소화 목표'
   목표 'GWh의 내생적 자원을 극대화하기 위한 목표'
   defcap(p) '용량 제약'
   defdem(i) '요구 만족';

* 목적 함수
objcost.. sum(pi(p,i), pdata('cost',p)*x(pi)) =e= z('cost');

objco2.. sum(pi(p,i), pdata('CO2emission',p)*x(pi)) =e= z('CO2emission');

객체.. sum(pi(es,i), x(pi)) =e= z('내생적');

defcap(p).. sum(pi(p,i), x(pi)) =l= pdata('용량',p);

defdem(i).. sum(pi(p,i), x(pi)) =g= 수요(i);

모델 예 / 모두 /;

$sTitle EPS-제약 방법
세트
   k1(k) 'k의 첫 번째 요소'
   km1(k) 'k의 첫 번째 요소를 제외한 모든 요소';

k1(k)$(ord(k) = 1) = 예;
km1(k) = 예;
km1(k1) = 아니오;

kk(k) '제약 조건 allobj의 활성 목적 함수'를 설정합니다.

매개변수
   rhs(k) 'eps-constraint에서 제한된 obj 함수의 오른쪽'
   maxobj(k) '보수 테이블의 최대값'
   minobj(k) '보수 테이블의 최소값';

변수
   a_objval '목적 함수에 대한 보조 변수'
   obj '지급표 작성 중 보조 변수';

양수변수
   sl(k) 'eps 제약조건에 대한 여유 또는 잉여 변수';

방정식
   con_obj(k) '제약된 목적 함수'
   augm_obj '약하게 효율적인 솔루션을 피하기 위해 목적 함수를 강화했습니다'
   allobj '하나의 표현식에 모든 목적 함수';

con_obj(km1).. z(km1) - dir(km1)*sl(km1) =e= rhs(km1);

* 첫 번째 목적 함수를 최적화하고 나머지는 제약 조건으로 설정합니다.
* 두 번째 항은 약하게 효율적인 점을 피하기 위한 것입니다.
augm_obj.. sum(k1,dir(k1)*z(k1)) + 1e-3*sum(km1,sl(km1)/(maxobj(km1) - minobj(km1))) =e= a_objval;

allobj..sum(kk, dir(kk)*z(kk)) =e= obj;

모델
   mod_payoff / 예시, allobj /
   mod_epsmethod / 예, con_obj, augm_obj /;

옵션 limRow = 0, limCol = 0, solPrint = 꺼짐,solveLink = %solveLink.callModule%;

매개변수 payoff(k,k) '지불 테이블 항목';

별칭(k,kp);

* 사전 편찬 최적화를 적용한 보수 테이블 생성
루프(kp,
   kk(kp) = 그렇습니다;
   반복하다
      obj를 최대화하는 lp를 사용하여 mod_payoff를 해결합니다.
      보수(kp,kk) = z.l(kk);
      z.fx(kk) = z.l(kk); // 최적화된 마지막 목표의 값을 고정합니다.
      kk(k++1) = kk(k);   // 목적 함수를 순환합니다.
   kk(kp)까지;
   kk(kp) = 아니오;
* 새로운 반복에 대한 목적 함수의 고정 값을 해제합니다.
   z.up(k) = inf;
   z.lo(k) = -inf;
);

if(mod_payoff.modelStat <> %modelStat.optimal% 및
   mod_payoff.modelStat <> %modelStat.feasibleSolution%,
   'mod_payoff에 대한 실행 가능한 솔루션 없음'을 중단합니다.);

보상 표시;

minobj(k) = smin(kp,payoff(kp,k));
maxobj(k) = smax(kp,payoff(kp,k));

$격자점을 설정하지 않은 경우 $set 격자점 10

세트
   g '그리드 포인트' / g0*g%gridpoints% /
   그리드(k,g) '그리드';

매개변수
   Gridrhs(k,g) '그리드 점에서 EPS 제약 조건의 rhs'
   maxg(k) '목표 그리드의 최대 지점'
   posg(k) '목표의 그리드 위치'
   firstOffMax '카운터'
   lastZero '카운터'
   numk(k) '1로 시작하는 k의 서수 값'
   numg(g) '0부터 시작하는 g의 서수 값';

lastZero = 1;
루프(km1,
   numk(km1) = lastZero;
   lastZero = lastZero + 1;
);
numg(g) = ord(g) - 1;

그리드(km1,g) = 예; // 여기서는 다양한 목표에 대해 다양한 그리드 간격을 정의할 수 있습니다.
maxg(km1) = smax(그리드(km1,g), numg(g));
Gridrhs(그리드(km1,g))$(%min% = dir(km1)) = maxobj(km1) - numg(g)/maxg(km1)*(maxobj(km1) - minobj(km1));
Gridrhs(grid(km1,g))$(%max% = dir(km1)) = minobj(km1) + numg(g)/maxg(km1)*(maxobj(km1) - minobj(km1));
그리드 표시;

* 모델이 실행 불가능해지면 그리드 점을 걷고 지름길을 이용하세요.
위치(km1) = 0;
$ifThen SAVESOL 설정
* 슬롯 게임의 가난한 사람의 문자열
파일 fSTRING; fSTRING.nw=0;
$macro STRINGDEF(sym) 싱글톤 세트 Sym / Sym /
$macro STRING(sym) Sym.te(sym)
$macro STRINGASSIGN(sym,text) put_utility fSTRING '할당텍스트' / 'sym' / 텍스트
$macro STRINGAPPEND(sym,text) put_utility fSTRING '할당텍스트' / 'sym' / Sym.te(sym) 텍스트
STRINGDEF(f이름);
$endIf

매개변수 zl(k);
임베디드 코드 Python:
솔 = 설정()
일시중지임베디드코드
반복하다
   rhs(km1) = sum(grid(km1,g)$(numg(g) = posg(km1)),gridrhs(km1,g));
   lp를 사용하여 a_objval을 최대화하는 mod_eps 메서드를 해결합니다.

   if(mod_epsmethod.modelStat <> %modelStat.optimal%, // 이 경우 최적이 아닌 것은 실행 불가능합니다.
      lastZero = 0;
      loop(km1$(posg(km1) > 0 및 lastZero = 0), lastZero = numk(km1));
      posg(km1)$(numk(km1) <= lastZero) = maxg(km1); // 더 까다로운 rhs(km1) 값에 대해서는 모든 해석을 건너뜁니다.
   그렇지 않으면
      zl(k) = z.l(k);
      계속임베디드코드:
      sol.add(tuple(슬롯 게임get('zl')))
      일시중지임베디드코드
$ ifThen SAVESOL 설정
      STRINGASSIGN(fname,'sol');
      loop(k, STRINGAPPEND(fname,'_' z.l(k)));
      STRINGAPPEND(f이름,'.gdx');
      put_utility 'gdxout' / STRING(fname);
      Execute_unload xl;
$ endIf
   );

* 그리드에서 앞으로 진행
   firstOffMax = 0;
   loop(km1$(posg(km1) < maxg(km1) 및 firstOffMax = 0),
      위치(km1) = 위치(km1) + 1;
      firstOffMax = numk(km1);
   );
   posg(km1)$(numk(km1) < firstOffMax) = 0;
sum(km1$(posg(km1) = maxg(km1)),1) = 카드(km1) 및 firstOffMax = 0이 될 때까지;

s '솔루션' / s1*s50 / 설정;
매개변수 솔루션(s,k) '고유 솔루션';
계속임베디드코드:
솔루션 = []
zip(슬롯 게임get('s'),sorted(sol))의 r에 대해:
  r[1]의 rp에 대해:
     Solutions.append((r[0],*rp))
슬롯 게임set('솔루션', 솔루션)
endEmbeddedCode 솔루션
디스플레이 솔루션;

$ifThen SAVESOL 설정
ss(들) '활성 솔루션'을 설정합니다.
옵션 ss<솔루션;
루프(ss,
   STRINGASSIGN(fname,'sol');
   loop(k, STRINGAPPEND(fname,'_' 솔루션(ss,k)));
   STRINGAPPEND(f이름,'.gdx');
   put_utility 'gdxin' / STRING(fname);
   Execute_load x.l;
   put_utility 'msg' / '' STRING(fname)의 솔루션;
   디스플레이 x.l;
)
$endIf
$exit

$onText
디스플레이는 18개의 고유한 솔루션이 포함된 테이블을 생성해야 합니다.

---- 203개의 매개변수 솔루션 독특한 솔루션

           비용 CO2emissi~ 내생적

S1 3075000.000 62460.000 31000.000
S2 3078000.000 62316.000 31200.000
s3 3099000.000 61308.000 32600.000
s4 3111000.000 60732.000 33400.000
s5 3120000.000 60300.000 34000.000
s6 3141000.000 59292.000 35400.000
s7 3147000.000 59004.000 35800.000
s8 3162000.000 58284.000 36800.000
s9 3183000.000 57276.000 38200.000
s10 3204000.000 56268.000 39600.000
s11 3219000.000 55548.000 40600.000
s12 3225000.000 55260.000 41000.000
s13 3315000.000 53820.000 39000.000
s14 3423000.000 52092.000 36600.000
s15 3531000.000 50364.000 34200.000
s16 3639000.000 48636.000 31800.000
s17 3747000.000 46908.000 29400.000
s18 3855000.000 45180.000 27000.000
$offText