数学建模社区-数学中国

标题: lingo的非线性变量 [打印本页]

作者: linuxir    时间: 2012-11-20 09:52
标题: lingo的非线性变量
task/1..42/:t,h;

TT=@max(task:t+h); //这一句为什么会产生了84个非线性变量,不是线性关系吗
作者: madio    时间: 2012-11-20 21:52
求最大值的函数应该是一条折线,显然是非线性的,而且还有可能是不可微的。
作者: linuxir    时间: 2012-11-22 18:03
madio 发表于 2012-11-20 21:52
求最大值的函数应该是一条折线,显然是非线性的,而且还有可能是不可微的。

多谢答复,学习了,其实我应该把这个条件看成约束关系的,后来用for语句重写了下,现在ok了
作者: qlb061    时间: 2012-11-22 19:07
本帖最后由 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表明非线性变量的数目!
作者: linuxir    时间: 2012-11-23 19:13
qlb061 发表于 2012-11-22 19:07
事实上取决于你的程序设定!默认情况下在模型生成时,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:11
本帖最后由 qlb061 于 2012-11-23 22:19 编辑

你可以这样处理:
最小化目标函数MIN=ZZ, 同时满足约束条件@for( task:ZZ > t + h ).
这种方法和你的方法是等效的,但是更推荐使用,因为模型是线性的。
以下是一个实例的运算结果:
  1. MODEL:
  2. SETS:
  3.         TASK/1..3/:T,H;
  4. ENDSETS

  5. DATA:
  6. T = 1 2 3;
  7. H = 5 8 4;
  8. ENDDATA

  9. !你的方法;
  10. TT=@MAX(TASK:T+H);

  11. !另一种方法,推荐使用;
  12. MIN = ZZ;
  13. @FOR(TASK:ZZ > T+H);
复制代码
Lingo运行结果,注意观察ZZ和TT的值,
  1. Global optimal solution found.
  2.   Objective value:                              10.00000
  3.   Infeasibilities:                              0.000000
  4.   Total solver iterations:                             0


  5.                                            Variable           Value
  6.                                                  TT        10.00000
  7.                                                  ZZ        10.00000
复制代码
另外提醒一点:Lingo不严格区分“>”和“>=”,也即两者是等价的。




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5