【问题标题】:How to setup a minimization problem in GAMS如何在 GAMS 中设置最小化问题
【发布时间】:2020-09-04 09:08:44
【问题描述】:

这可能是一个菜鸟问题,但我试图最小化 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

但我不确定如何在 GAMS 中设置这个最小化问题。 谁能帮帮我?

【问题讨论】:

    标签: minimization gams-math


    【解决方案1】:

    首先,请注意您的 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 中报告的要好一些。原因是这实际上是一个非凸问题。我验证了 CONOPT 确实找到了全局最优解(使用全局求解器进行验证)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 2015-10-04
      • 1970-01-01
      • 1970-01-01
      • 2014-06-10
      • 2020-09-07
      • 1970-01-01
      相关资源
      最近更新 更多