如何在 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 确实找到了全局最优解(通过使用全局求解器验证)。