QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2134|回复: 5
打印 上一主题 下一主题

lingo的非线性变量

[复制链接]
字体大小: 正常 放大
linuxir        

2

主题

9

听众

35

积分

升级  31.58%

  • TA的每日心情
    郁闷
    2013-5-12 16:36
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    自我介绍
    学生一枚,学习建模
    跳转到指定楼层
    1#
    发表于 2012-11-20 09:52 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    task/1..42/:t,h;

    TT=@max(task:t+h); //这一句为什么会产生了84个非线性变量,不是线性关系吗
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏1 支持支持0 反对反对0 微信微信
    madio        

    3万

    主题

    1311

    听众

    5万

    积分

  • TA的每日心情
    奋斗
    2024-7-1 22:21
  • 签到天数: 2014 天

    [LV.Master]伴坛终老

    自我介绍
    数学中国站长

    社区QQ达人 邮箱绑定达人 优秀斑竹奖 发帖功臣 风雨历程奖 新人进步奖 最具活力勋章

    群组数学建模培训课堂1

    群组数学中国美赛辅助报名

    群组Matlab讨论组

    群组2013认证赛A题讨论群组

    群组2013认证赛C题讨论群组

    求最大值的函数应该是一条折线,显然是非线性的,而且还有可能是不可微的。
    回复

    使用道具 举报

    linuxir        

    2

    主题

    9

    听众

    35

    积分

    升级  31.58%

  • TA的每日心情
    郁闷
    2013-5-12 16:36
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    自我介绍
    学生一枚,学习建模
    madio 发表于 2012-11-20 21:52
    求最大值的函数应该是一条折线,显然是非线性的,而且还有可能是不可微的。

    多谢答复,学习了,其实我应该把这个条件看成约束关系的,后来用for语句重写了下,现在ok了
    回复

    使用道具 举报

    qlb061        

    3

    主题

    9

    听众

    3480

    积分

    升级  49.33%

  • TA的每日心情
    奋斗
    2018-4-27 20:25
  • 签到天数: 969 天

    [LV.10]以坛为家III

    自我介绍

    邮箱绑定达人

    群组LINGO

    本帖最后由 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  高手高手,非常非常感谢,希望以后可以多多指点哈。我把原来那个TT=@max(task:h+t)改成了 @for(task(i):TT>t(i)+h(i))后没有了非线性变量。但是这样处理后得到的TT并不是t+h的最大值(比 最大值还要大),如果我不  详情 回复 发表于 2012-11-23 19:13
    回复

    使用道具 举报

    linuxir        

    2

    主题

    9

    听众

    35

    积分

    升级  31.58%

  • TA的每日心情
    郁闷
    2013-5-12 16:36
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    自我介绍
    学生一枚,学习建模
    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        

    3

    主题

    9

    听众

    3480

    积分

    升级  49.33%

  • TA的每日心情
    奋斗
    2018-4-27 20:25
  • 签到天数: 969 天

    [LV.10]以坛为家III

    自我介绍

    邮箱绑定达人

    群组LINGO

    本帖最后由 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不严格区分“>”和“>=”,也即两者是等价的。
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2025-8-18 06:53 , Processed in 0.962113 second(s), 82 queries .

    回顶部