我必须得到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
是的,这是家庭作业,然而我完全卡住了。
事实证明,最大值可以很容易地处理:
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);