lingo的非线性变量
task/1..42/:t,h;TT=@max(task:t+h); //这一句为什么会产生了84个非线性变量,不是线性关系吗 求最大值的函数应该是一条折线,显然是非线性的,而且还有可能是不可微的。 madio 发表于 2012-11-20 21:52 static/image/common/back.gif
求最大值的函数应该是一条折线,显然是非线性的,而且还有可能是不可微的。
多谢答复,学习了,其实我应该把这个条件看成约束关系的,后来用for语句重写了下,现在ok了 本帖最后由 qlb061 于 2012-11-22 19:17 编辑
事实上取决于你的程序设定!默认情况下在模型生成时,Lingo自动选择线性化程度(有些数学表达式可以通过添加额外的0-1变量进行线性化处理,其中@min,@max就是如此)。应当注意,最大最小函数的出现会导致模型非线性,@IF函数更是如此。
对于有@min,@max约束的模型,Lingo可以添加0-1整数变量将其线性化,从而使用高效的LP Solver求解问题,但是这也会产生相应的代价,额外引入了0-1变量从而使得LP问题变为ILP问题,这在求解大规模优化问题时可能会显著增加程序运行时间。
建模者可以通过以下方式设置线性化选项:Lingo->Option->Model Generator->Linearization->Degree:
Solver Decides/ None / Low / High.
同样对于你的实例,以下显示了高度线性化处理后,Lingo对模型的统计结果:
Rows= 86 Vars= 128 ( all are linear)
Integer vars= 42 Binary vars= 0
Nonzeros= 339 Const nonz= 338( 296 are +- 1) Density= 0.030
Smallest and largest elements in abs value= 0.100000+308 0.00000
No. < : 42 No. =: 2 No. > : 42, Obj= N/A, GUBs <= 75
Single cols= 1
注意红色部分,显然,变量数目要比85大得多,而且所有变量都是线性的,同时出现了整数变量。这些变化都是Lingo模型生成器处理后的结果。
以下是不进行线性化处理的统计结果:
Rows= 2 Vars= 85
Integer vars= 0 Binary vars= 0
Nonl rows= 1 Nonl vars= 84Nonl constraints= 1
Nonzeros= 85 Constraint nonz= 85 Density=0.494
Smallest and largest elements in abs value= 0.100000+308 0.00000
No. < : 0 No. =: 1 No. > : 0, Obj= N/A Single cols= 85
Nonl vars = 84表明非线性变量的数目! qlb061 发表于 2012-11-22 19:07 static/image/common/back.gif
事实上取决于你的程序设定!默认情况下在模型生成时,Lingo自动选择线性化程度(有些数学表达式可以通 ...
高手高手,非常非常感谢,希望以后可以多多指点哈。我把原来那个TT=@max(task:h+t)改成了
@for(task(i):TT>t(i)+h(i))后没有了非线性变量。但是这样处理后得到的TT并不是t+h的最大值(比
最大值还要大),如果我不想引入额外变量又要保证用LP求解而且TT是t+h的最大值的话该怎么写呢?
是不是可以通过语言上的修改来达到这样的要求? 本帖最后由 qlb061 于 2012-11-23 22:19 编辑
你可以这样处理:
最小化目标函数MIN=ZZ, 同时满足约束条件@for( task:ZZ > t + h ).
这种方法和你的方法是等效的,但是更推荐使用,因为模型是线性的。
以下是一个实例的运算结果:MODEL:
SETS:
TASK/1..3/:T,H;
ENDSETS
DATA:
T = 1 2 3;
H = 5 8 4;
ENDDATA
!你的方法;
TT=@MAX(TASK:T+H);
!另一种方法,推荐使用;
MIN = ZZ;
@FOR(TASK:ZZ > T+H);Lingo运行结果,注意观察ZZ和TT的值,Global optimal solution found.
Objective value: 10.00000
Infeasibilities: 0.000000
Total solver iterations: 0
Variable Value
TT 10.00000
ZZ 10.00000
另外提醒一点:Lingo不严格区分“>”和“>=”,也即两者是等价的。
页:
[1]