近期关于YALMIP的一些知识

来源:互联网 发布:ubuntu chrome 下载源 编辑:程序博客网 时间:2024/04/29 04:59

简单地把近期关于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!
0 0
原创粉丝点击