설명
균형 모델의 에이전트가 다음과 같음을 보여주는 모델 EMPinfo 파일에 지정되고 동일한 방식으로 JAMS에 의해 번역됨 그들이 다음과 같은지 여부: A. 평형 모델의 일부(외부 최적화 에이전트 없음) 또는 B. 내부 모델의 일부(이중 레벨이 있는 외부 최적화 에이전트) 이를 보여주기 위해 먼저 두 개의 VI 에이전트를 사용하여 평형 모델을 생성합니다. 그런 다음 내부 문제가 다음과 같이 감소하는 이중 수준 모델을 만듭니다. 외부 변수가 고정되어 있는 경우의 균형 모델. 외부 최적화는 내부 문제에 대한 솔루션을 생성하고 균형 문제는 동일하지만 이것이 의존하는 방식으로 내부 변수와 외부 변수 사이의 암시적 관계 VI 에이전트에 의해 시행됩니다. JAMS에서 생성된 스칼라 모델을 간단히 검사하는 것만으로도 충분합니다. 평형모델과 내부모델 사이의 유사성을 보여줍니다. 기고자: Steven Dirkse, 2013년 8월
소형 모델 유형 :피망 슬롯
카테고리 : 피망 슬롯 EMP 라이브러리
메인 파일 : equil_bilevel.gms
$title 이중 레벨을 포함하거나 포함하지 않는 평형 모델(EQUIL_BILEVEL,SEQ=99)
$onText
평형 모델의 에이전트가 다음과 같음을 보여주는 모델
EMPinfo 파일에 지정되고 동일한 방식으로 JAMS에 의해 번역됨
그들이 다음과 같은지 여부:
A. 평형 모델의 일부(외부 최적화 에이전트 없음) 또는
B. 내부 모델의 일부(이중 레벨이 있는 외부 최적화 에이전트)
이를 보여주기 위해 먼저 두 개의 VI 에이전트를 사용하여 평형 모델을 생성합니다.
그런 다음 내부 문제가 다음과 같이 감소하는 이중 수준 모델을 만듭니다.
외부 변수가 고정되어 있는 경우의 균형 모델. 외부
최적화는 내부 문제에 대한 솔루션을 생성하고
균형 문제는 동일하지만 이것이 의존하는 방식으로
내부 변수와 외부 변수 사이의 암시적 관계
VI 에이전트에 의해 시행됩니다.
JAMS에서 생성된 스칼라 모델을 간단히 검사하는 것만으로도 충분합니다.
평형모델과 내부모델 사이의 유사성을 보여줍니다.
기고자: Steven Dirkse, 2013년 8월
$offText
세트
나는 / i1 * i2 /
ii / 1 * 2 /
j / j1 * j4 /
k / k1 * k5 /
t / t1 * t2 /
;
별칭(j,jj);
매개변수
c(j) /
j1 4
j2 -9
j3 6
j4 2
/
b(i) /
나는1 2
i2 1
/
bb(ii) /
1 -1
2 1
/;
테이블 Q(jj,jj)
j1 j2 j3 j4
j1 4 -2 -1 -1
j2 -2 4 -2 -1
j3 -1 -2 4 -2
j4 -1 -1 -2 4
;
테이블 A(i,j)
j1 j2 j3 j4
나는1 1 1
나는2 1 1 1
;
표 AA(ii,k)
k1 k2 k3 k4 k5
1 1 1 1
2 1 1 1
;
테이블 E(t,k)
k1 k2 k3 k4 k5
t1 2 -1 2 2
t2 -1 3 3 3
;
스칼라
out1bar '외부 obj 솔루션에서 out1의 목표 값' / 1 /
v1bar "out obj 솔루션에서 v('j1')의 목표 값"
d1 'dv1/dout1' / -0.5 /
out2bar '외부 obj 솔루션에서 out1의 목표 값' / 2 /
w2bar "out obj 솔루션에서 w('k2')의 목표 값"
d2 'dw2/dout2' / [5/6] /
;
양의 변수 v(j);
양의 변수 w(k);
자유 변수
out1 '외부 최소 모델에 대한 var'
out2 '외부 최소 모델에 대한 var'
초(티)
;
방정식 F1(j) 'VI func perp to v';
방정식 g(i);
방정식 F2(t) 'VI func perp to s';
방정식 sdef(t);
방정식 h(ii);
F1(j) .. sumjj, Q(j,jj)*v(jj) + c(j) =N= 0;
g(i) .. sum j, A(i,j)*v(j) =G= b(i) - out1;
F2(t) .. 2 * s(t) =N= 0;
sdef(t) .. sumk, E(t,k)*w(k) =E= s(t);
h(ii) .. 합계 k, AA(ii,k)*w(k) =G= bb(ii) + out2;
v.up(j) = 20;
v.up('j2') = 2;
out1.fx = out1bar;
out2.fx = out2bar;
모델 피망 슬롯 / F1, g, F2, sdef, h /;
파일 opt1 / 'jams.opt' /;
putclose opt1 '파일 이름 scalar1.gms'
/ 'dict dict1.txt'
/;
파일 empinfo / '%emp.info%' /;
putclose empinfo '평형'
/ 'vi F1 v g' /
/ 'vi w F2 s sdef h' /;
피망 슬롯holdfixed = 1;
피망 슬롯optfile = 1;
옵션 limrow=99, limcol=99;
emp를 사용하여 피망 슬롯을 해결합니다.
abort$[피망 슬롯solvestat <> %solveStat.normalCompletion%] '피망 슬롯이 해결되지 않음', 피망 슬롯solvestat;
v1bar = v.l('j1');
w2bar = w.l('k2');
스칼라 델타, o0, o1, odiff, marg;
* 이 ontext/offtext 블록은 d1 := dv1/dout1의 정확성을 확인합니다.
$onText
델타 = 0.01;
o0 = v.l('j1');
out1.fx = out1bar + 델타;
emp를 사용하여 피망 슬롯을 해결합니다.
abort$[피망 슬롯solvestat <> %solveStat.normalCompletion%] '피망 슬롯이 해결되지 않음', 피망 슬롯solvestat;
o1 = v.l('j1');
odiff = o1 - o0;
marg = odiff / 델타;
델타, o0, o1, odiff, marg, d1을 표시합니다.
$exit
$offText
* 이 ontext/offtext 블록은 d1 := dv1/dout1의 정확성을 확인합니다.
$onText
델타 = 0.01;
o0 = w.l('k2');
out2.fx = out2bar + 델타;
emp를 사용하여 피망 슬롯을 해결합니다.
abort$[피망 슬롯solvestat <> %solveStat.normalCompletion%] '피망 슬롯이 해결되지 않음', 피망 슬롯solvestat;
o1 = w.l('k2');
odiff = o1 - o0;
marg = odiff / 델타;
델타, o0, o1, odiff, marg, d2를 표시합니다.
$exit
$offText
델타 = 0.01;
스칼라 ztarget, c_out1, c_v1, c_out2, c_w2;
c_out1 = out1bar + 델타;
c_v1 = v1bar - (1/d1) * 델타;
c_out2 = out2bar + 델타;
c_w2 = w2bar - (1/d2) * 델타;
ztarget = sqr(델타) + sqr(델타/d1)
+ sqr(델타) + sqr(델타/d2);
변수 z '외부 목표';
방정식 zdef;
zdef .. sqr(v('j1') - c_v1) + sqr(out1 - c_out1)
+ sqr(w('k2') - c_w2) + sqr(out2 - c_out2)
=e=z;
모델 bilev / F1, g, F2, sdef, h
zdef
/;
파일 opt2 / 'jams.op2' /;
putclose opt2 '파일 이름 scalar2.gms'
/ 'dict dict2.txt'
/;
putclose empinfo 'bilevel out1 out2'
/ 'vi F1 v g' /
/ 'vi w F2 s sdef h' /;
out1.lo = out1bar - 1;
out1.up = out1bar + 1;
out1.lo = -INF;
out1.up = INF;
out2.lo = out2bar - 1;
out2.up = out2bar + 1;
out2.lo = -INF;
out2.up = INF;
bilev.optfile = 2;
emp min z를 사용하여 bilev를 푼다.
abort$[bilev.solvestat <> %solveStat.normalCompletion%] 'bilev가 해결되지 않음', bilev.solvestat;
스칼라
v1, w2
톨 / 1e-5 /;
v1 = v.l('j1');
w2 = w.l('k2');
z.l, ztarget, out1.l, out1bar, v1, v1bar,
out2.l, out2bar, w2, w2bar;
abort$[abs(z.l - ztarget) > tol] '이중 목표가 예상과 다릅니다', z.l, ztarget;
abort$[abs(out1.l - out1bar) > tol] '변수 out1이 예상과 다릅니다.', out1.l, out1bar;
abort$[abs(out2.l - out2bar) > tol] '변수 out2가 예상과 다릅니다.', out2.l, out2bar;
* 모든 중간 파일을 유지하려면 이 주석을 제거하세요.
'rm -f scalar1.???을 실행하세요. 스칼라2.??? dict1.txt dict2.txt'
'rm -f scalar?pf.pf jams.opt jams.op2'를 실행합니다.