如何在 GAMS 中设置最小化问题
How to setup a minimization problem in GAMS
这可能是一个菜鸟问题,但我正在尝试最小化 GAMS 中的平均绝对误差。
考虑 GAMS 中的以下数据:
set Time /0 * 2/;
parameter y(Time),u(Time),v(Time),yhat(Time),MAE;
scalar
alpha /0/
beta /0/;
y("0") = 24;
y("1") = 23;
y("2") = 26;
我想根据指数平滑做以下方程(方程取from here):
我可以在 GAMS 中使用循环来做到这一点:
u("0") = y("0");
v("0") = 0;
loop(Time,
u(Time) = (alpha*y(Time))+(1-alpha)*(u(Time-1)-v(Time-1));
v(Time) = beta*(u(Time)-u(Time-1))+(1-beta)*v(Time-1);
yhat(Time) = u(Time-1)+v(Time-1);
);
由此我可以计算出平均绝对误差:
set Timesub(Time) / 1 * 2 /;
MAE = sum(Timesub,abs(yhat(Timesub)-y(Timesub)))/2;
但是,我不想假设 alpha 和 beta 的值,而是想通过更改 alpha 和 beta 的值来最小化 MAE 的值,但要遵守 0 < alpha <= 1.0 和 0 < beta <= 1.0.
但我不确定如何在 GAMS 中设置这个最小化问题。
谁能帮帮我?
首先,请注意您的 GAMS 作业存在错误(符号错误)。
在 GAMS 中,您必须“展开”循环并构建一个大型联立方程组。使用参考资料中的数据,这看起来像:
set
t /t1*t15/
;
parameter y(t) 'data' /
t1 3
t2 5
t3 9
t4 20
t5 12
t6 17
t7 22
t8 23
t9 51
t10 41
t11 56
t12 75
t13 60
t14 75
t15 88
/;
variables
u(t),v(t),yhat(t),MAE
;
positive variables
alpha, beta
abserr(t)
;
alpha.up = 1;
beta.up = 1;
equations
udef(t)
vdef(t)
pred(t)
abs1(t)
abs2(t)
obj
;
u.fx("t1") = y("t1");
v.fx("t1") = 0;
yhat.fx("t1") = 0;
udef(t-1).. u(t) =e= alpha*y(t)+(1-alpha)*(u(t-1)+v(t-1));
vdef(t-1).. v(t) =e= beta*(u(t)-u(t-1))+(1-beta)*v(t-1);
pred(t-1).. yhat(t) =e= u(t-1)+v(t-1);
abs1(t)$(ord(t)>1).. -abserr(t) =l= yhat(t)-y(t);
abs2(t)$(ord(t)>1).. yhat(t)-y(t) =l= abserr(t);
obj.. MAE =e= sum(t$(ord(t)>1),abserr(t))/(card(t)-1);
* initial point
alpha.l = 0.4;
beta.l = 0.7;
model m /all/;
option nlp=conopt;
solve m minimizing MAE using nlp;
parameter results(*,*);
results(t,'y') = y(t);
results(t,'u') = u.l(t);
results(t,'v') = v.l(t);
results(t,'yhat') = yhat.l(t);
results(t,'|e|') = abserr.l(t);
display results;
display alpha.l,beta.l,MAE.l;
结果如下:
---- 73 PARAMETER results
y u v yhat |e|
t1 3.000 3.000
t2 5.000 3.428 0.370 3.000 2.000
t3 9.000 4.910 1.333 3.798 5.202
t4 20.000 9.184 3.878 6.243 13.757
t5 12.000 12.835 3.681 13.062 1.062
t6 17.000 16.620 3.771 16.516 0.484
t7 22.000 20.735 4.069 20.391 1.609
t8 23.000 24.418 3.735 24.803 1.803
t9 51.000 33.038 7.962 28.153 22.847
t10 41.000 41.000 7.962 41.000
t11 56.000 50.467 9.264 48.962 7.038
t12 75.000 62.996 12.089 59.731 15.269
t13 60.000 71.860 9.298 75.085 15.085
t14 75.000 79.841 8.159 81.158 6.158
t15 88.000 88.000 8.159 88.000
---- 74 VARIABLE alpha.L = 0.214
VARIABLE beta.L = 0.865
VARIABLE MAE.L = 6.594
这比 link 中的报告要好一些。原因是这实际上是一个 non-convex 问题。我验证了 CONOPT 确实找到了全局最优解(通过使用全局求解器验证)。
这可能是一个菜鸟问题,但我正在尝试最小化 GAMS 中的平均绝对误差。 考虑 GAMS 中的以下数据:
set Time /0 * 2/;
parameter y(Time),u(Time),v(Time),yhat(Time),MAE;
scalar
alpha /0/
beta /0/;
y("0") = 24;
y("1") = 23;
y("2") = 26;
我想根据指数平滑做以下方程(方程取from here):
我可以在 GAMS 中使用循环来做到这一点:
u("0") = y("0");
v("0") = 0;
loop(Time,
u(Time) = (alpha*y(Time))+(1-alpha)*(u(Time-1)-v(Time-1));
v(Time) = beta*(u(Time)-u(Time-1))+(1-beta)*v(Time-1);
yhat(Time) = u(Time-1)+v(Time-1);
);
由此我可以计算出平均绝对误差:
set Timesub(Time) / 1 * 2 /;
MAE = sum(Timesub,abs(yhat(Timesub)-y(Timesub)))/2;
但是,我不想假设 alpha 和 beta 的值,而是想通过更改 alpha 和 beta 的值来最小化 MAE 的值,但要遵守 0 < alpha <= 1.0 和 0 < beta <= 1.0.
但我不确定如何在 GAMS 中设置这个最小化问题。 谁能帮帮我?
首先,请注意您的 GAMS 作业存在错误(符号错误)。
在 GAMS 中,您必须“展开”循环并构建一个大型联立方程组。使用参考资料中的数据,这看起来像:
set
t /t1*t15/
;
parameter y(t) 'data' /
t1 3
t2 5
t3 9
t4 20
t5 12
t6 17
t7 22
t8 23
t9 51
t10 41
t11 56
t12 75
t13 60
t14 75
t15 88
/;
variables
u(t),v(t),yhat(t),MAE
;
positive variables
alpha, beta
abserr(t)
;
alpha.up = 1;
beta.up = 1;
equations
udef(t)
vdef(t)
pred(t)
abs1(t)
abs2(t)
obj
;
u.fx("t1") = y("t1");
v.fx("t1") = 0;
yhat.fx("t1") = 0;
udef(t-1).. u(t) =e= alpha*y(t)+(1-alpha)*(u(t-1)+v(t-1));
vdef(t-1).. v(t) =e= beta*(u(t)-u(t-1))+(1-beta)*v(t-1);
pred(t-1).. yhat(t) =e= u(t-1)+v(t-1);
abs1(t)$(ord(t)>1).. -abserr(t) =l= yhat(t)-y(t);
abs2(t)$(ord(t)>1).. yhat(t)-y(t) =l= abserr(t);
obj.. MAE =e= sum(t$(ord(t)>1),abserr(t))/(card(t)-1);
* initial point
alpha.l = 0.4;
beta.l = 0.7;
model m /all/;
option nlp=conopt;
solve m minimizing MAE using nlp;
parameter results(*,*);
results(t,'y') = y(t);
results(t,'u') = u.l(t);
results(t,'v') = v.l(t);
results(t,'yhat') = yhat.l(t);
results(t,'|e|') = abserr.l(t);
display results;
display alpha.l,beta.l,MAE.l;
结果如下:
---- 73 PARAMETER results
y u v yhat |e|
t1 3.000 3.000
t2 5.000 3.428 0.370 3.000 2.000
t3 9.000 4.910 1.333 3.798 5.202
t4 20.000 9.184 3.878 6.243 13.757
t5 12.000 12.835 3.681 13.062 1.062
t6 17.000 16.620 3.771 16.516 0.484
t7 22.000 20.735 4.069 20.391 1.609
t8 23.000 24.418 3.735 24.803 1.803
t9 51.000 33.038 7.962 28.153 22.847
t10 41.000 41.000 7.962 41.000
t11 56.000 50.467 9.264 48.962 7.038
t12 75.000 62.996 12.089 59.731 15.269
t13 60.000 71.860 9.298 75.085 15.085
t14 75.000 79.841 8.159 81.158 6.158
t15 88.000 88.000 8.159 88.000
---- 74 VARIABLE alpha.L = 0.214
VARIABLE beta.L = 0.865
VARIABLE MAE.L = 6.594
这比 link 中的报告要好一些。原因是这实际上是一个 non-convex 问题。我验证了 CONOPT 确实找到了全局最优解(通过使用全局求解器验证)。