近期关于YALMIP的一些知识


简单地把近期关于YALMIP的一些进展和知识写写,也许对大家有用。

1. Solver time v.s. YALMIP time
    这几天吕鸣小同学追着我问:YALMIP+CPLEX/gurobi的方案下,我怎么知道cplex/gurobi这些solver花了多少时间在求解上,yalmip在模型的管理(主要是populating和precompiling)上花了多少时间?其实这个问题我本来能很容易回答的(我之前是仔细钻研过yalmip的source code的,当时还生成了yalmip的代码调用关系图,现在都弄丢了),但最近烦事太多,就偷懒问了Johan,方法如下:
                                     output = solvesdp(...)
                                     output.solvertime
                                     output.yalmiptime

2. Reduce the overhead cost when solving a large number of optimization problems which only differ through some changing parameter in the model
    这个问题是我的小师妹岳文英问我的,岳,online? 我要是能@你就好了,我知道你在微博上。这个问题应该很多人都遇见过:在一个算法或求解过程中,你可能需要重复求解一个model,而每次model之间的差异可能只是某个参数/数据发生了变化,这时,你如果重复使用YALMIP的solvesdp()去求解这些模型的话,你会发现cplex,gurobi等solver花费的solving time未必很长,而yalmip的在模型管理方面却花了很长时间,这是怎么回事?如何解决?
    Why? 实际上,YALMIP在求解模型之前要对模型进行precompiling,这里面包括判断模型类型,装入模型数据,找到合适solver,把模型编译成某个solver能接受的形式(不容的solver对model的格式有不同要求,这很容易理解)。所以,在上述的应用情景下,每一次YALMIP都要做这些工作,它的overhead自然就比较大了。
    How? YALMIP给出了一个命令
            P = optimizer ( Constraints,Objective,Options,Parameters,DecisionVariables )
将可能变化导致模型发生微小变化的数据放在第4个参数位置,每次这个参数发生变化时,如由30变成40时,用P{40}就可以了,YALMIP碰到这个命令,自动地在约束中加上[Parameters==40]这条约束,并且跳过重新precompling这个model的工作,节省了大量开销。YALMIP中的例子1:
             sdpvar x b
             P = optimizer ( x >= b, x,  [ ] , b, x ) ;
             for  b_trial =  0 : 0.1 : 1
                P { b_trial }
             end
   注意:这里要把变化的参数b用sdpvar来声明(以方便YALMIP后来加入类似[b==0.3]的约束)。但就是这一点,也带来了麻烦:想一想,要是约束ax>=3中参数a每次发生改变怎么办?如果再用“sdpvar a”这样的语句来声明,yalmip当然就认为这是一个bilinear model,而不是一个linear programming model了,自然,YALMIP在第一次precompling这个模型的时候就会去找nonlinear solvers,而不是我们常用的cplex,gurobi这些(MI)LP solvers了。这怎么办?Johan用sdpsettings中solver前的一个“+”号强制告诉YALMIP:我要强制用gurobi或cplex这些solver,你不要这么武断地把我的model判定为nonlinear!
            sdpvar x a
            P = optimizer ( a*x >=  1 , x, sdpsettings ( 'solver' , '+gurobi' ) , a, x ) ;
            for  a_trial =  1 : 0.1 : 2
               P { a_trial }
            end
    这只是一个权宜之计,所以Johan说: Optimizer这个命令目前只是beta版本。我能细致地想出解决方案,但我知道其中Johan要改很多代码。

3. YALMIP forum on google groups
    Johan最近在google groups上建立了一个YALMIP论坛,不幸的是,在我们可爱的祖国却上不去这个论坛,威武的Great Firewall再一次显示了它的强大。我等翻墙猛士又是VPN又是IPV6,使尽浑身解数去上学术性论坛。我跟Johan发邮件,他说会继续关注在SeDeMi论坛(老的论坛)上中国那边过来的问题,并且他现在没有想到合适的解决途径:他不想费力地上数据库服务器和web服务器,让yalmip forum在他实验室服务器上运行;但又找不到其它依托第三方的解决途径。呜呼!

Enjoy!
  • 3
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值