Максимальный элемент GAMS

Мне нужно получить GAMS, чтобы найти максимальный элемент набора. Это должно привести к некоторой модели линейной регрессии, где целью является не метод наименьших квадратов, а наименьшее максимальное отклонение.

Мои точки данных - это (x(p), y(p)) баллы (дано Set p / p1*p1000 / ;). Мне удалось решить регрессионную модель, как описано в амстердамской оптимизации:

Variables
  m            Slope
  b            Constant
  objVal       Objective Value
;

Equations
  objFun       Objective Function
  lin(p)       Regression Model
;

objFun ..      objVal =n= 0;
lin(p) ..      y(p) =e= m * x(p) + b;

option lp=ls;
Model Regression / objFun, lin / ;
Solve Regression minimizing objVal using lp;

Но я должен сдать что-то вроде

Variables
  m            Slope
  b            Constant
  objVal       Objective Value
;

Equations
  objFun       Regression Model
;

objFun ..      objVal =e= smax(p, abs( y(p) - (m * x(p) + b) ));

Model Regression / objFun / ;
Solve Regression minimizing objVal using lp;

Конечно, вы можете это прочитать, но GAMS это ненавидит:

2031  Solve Regression minimizing objVal using lp;
****                                             $51,59,256
Error Messages

 51  Endogenous function argument(s) not allowed in linear models
 59  Endogenous prod smin smax require model type "dnlp"
256  Error(s) in analyzing solve statement. More detail appears
     Below the solve statement above

Да, это домашнее задание, но я полностью застрял.


person LDericher    schedule 05.07.2014    source источник


Ответы (1)


Оказывается, с максимумом справиться легко:

objFun ..      objVal =e= smax(p, abs( y(p) - (m * x(p) + b) ));

Эквивалентно

objFun(p) ..   objVal =g= abs( y(p) - (m * x(p) + b) );

Теперь GAMS не любит abs (), используемый в линейных моделях по очевидным причинам, но помните, что x > abs(y) означает (x > y) AND (x > -y), поэтому:

objFun1(p) ..  objVal =g= y(p) - (m * x(p) + b);
objFun2(p) ..  objVal =g= -( y(p) - (m * x(p) + b) );

Что в итоге (каноническое соответствие):

objFun1(p) ..  objVal + x(p) * m + b =g= y(p);
objFun2(p) ..  objVal - x(p) * m - b =g= -y(p);
person LDericher    schedule 06.07.2014