注:应一些同学、朋友和同事的请求,再次准备了一个关于Gurobi和CPLEX使用的简单教程,这次教程里提到了软件的一些新的功能,比如说CPLEX在求解非凸的二次规划上的进展和努力;同时,还增加了一些例子代码,比如简单的(混合整数)线性规划、二次规划、双层规划(Bilevel
Programming)、KKT条件的代码表达等内容,希望高年级本科生、研究生或年轻教师看过之后,能马上处理您手头的问题。其中的很多代码是从YALMIP
Wiki拷贝过来的,特此声明(本教程的目的是教育,而非原创性地推动科研成果,但对推动大家的研究工作想必作用甚大)。此外,最近工作繁忙,博客疏于更新,其中博客中提到的问题也很少回答,敬请谅解。
=========================教程开始====================================
前言:很久没有写博文了,两个字——“穷忙”,这一段时间里收到了很多老师、学生和业界人员的问题,有些回答的稍显草率,请谅解,其中的一些问题(比如QCQP中的semidefinite的相关问题及讨论)很想写写,但一想到写这些东西需要认真捋清思路、小心措辞、辅助作图等,又想到自己research进展跟狗屎一样,就实在没有心情写了。其实,青年教师的科研压力不比在读博士生小,老师们应该都能理解,所以请学生们和业界人员原谅我这一段时间问题回答上的草率。
今天选择Local
Search(LS)这个话题,一来是最近看到很多Papers在使用这些方法,二来是看到最近优化软件LocalSolver(
官网
,
中国代理商
)火爆的不行。LocalSolver是基于local search方法(而非Branch and
Cut方法和Constraint Programming方法)求解Mathematical
Programming模型的,所以非线性算子(
这几天吕鸣小同学追着我问:YALMIP+CPLEX/gurobi的方案下,我怎么知道cplex/gurobi这些solver花了多少时间在求解上,yalmip在模型的管理(主要是populating和precompiling)上花了多少时间?其实这个问题我本来能很容易回答的(我之前是仔细钻研过yalmip的source
code的,当时还生成了yalmip的代码调用关系图,现在都弄丢了),但最近烦事太多,就偷懒问了Johan,方法如下:
output = solvesdp(...)
注:转载请声明,并附上源地址!
首先,题目中的“CPLEX入门教程(CPLEX中文教程)”
仅仅是为了提高本文在google和baidu中的命中率
,使刚刚开始学习cplex的人能迅速找到这次talk的视频,避免走更多的弯路。另外,在这次talk中,虽说以cplex为主,我也提及了其它优化软件,因为我本人也是十分支持Gurobi这些新生力量的。
其次,这次活动的目的在讲座视频中有明确介绍,另外,
这次活动也是向大家表率:希望大家以后在科学的道路上要以无私的精神多分享自己的心得,别怕麻烦,多为学科的发展做些切切实实的事情(不是光顾着自己发论文和种好自己的一亩三分地),尤其是运筹学(管理科学)这个学科,因为她的影响力已经遍及各个理论和工程学科。
说说跟
这次talk有关的一些事情
:
1.sdpvar(n,n)默认是对称的;若要非对称的,用sdpvar(n,n,'full')
这一点很重要,你也许以为我很傻很天真地把这个常识写在这里,是不是把看客当傻瓜了。我负责任地告诉你,这是我使用过程中血的教训:我最近对一个问题进行建模,对模型、代码和数据进行了无数遍cheak,而且用cheakset对约束进行了详细分析,还是报“Primal_infeasible”,我于是开始怀疑自己的能力,欲死欲仙之时,我在YALMIP
Wiki上又仔细读了读Johan
Lofberg关于sdpvar的示例,忽然发现自己可能阴沟里翻船了---就像老衲当年企图把大于4G的matlab安装镜像文件放到一个FAT32盘上,后被热心网友提醒时的感觉一样一样的。
2.如何对多重求和符号formulation?
如约束中含有类似
的多重求和号。
slovesdp(F,obj,sdpsettings('slover','mosek','usex0',1));%用mosek求解,使用初始解x=[1
* solvesdp
:求解命令(另外,solvemp,solvemoment,slovesos)
monolist:产生不超过一定阶数的多项式,在SDP Relaxation中很有用
polynomial:产生多项式
plot:画图,尤其是画可行域时很方便
sdisplay:sysbolic display 显示符号化的式子,如多项式、单项式
sparse:产生稀疏矩阵
blkvar: 分块矩阵变量类型
blkdiag:分块对角矩阵
binvar: 二值变量
intvar: 整数变量
uncertain: 声明不确定变量(参数),在鲁棒
F = [P >= 0, A'*P+P*A <= 0];
solvesdp(F);//不写目标时,表示是“可行性”问题
Pfeasible = double(P);//double()表示抽取决策变量的值,是YALMIP对Matlab的重载
8.sdpsettings
YALMIP与solvers的通讯管家
(1)ops=sdpsettings可以查看当前的设置
(2)对YALMIP与Solver的通讯进行设置
ops = sdpsettings('field',value,'field',value,...)
solvesdp(Constraints, Objective, ops)
如:ops = sdpsettings('solver','dsdp','verbose',0)
或:ops = sdpsettings('solver','sdpa');
ops = sdpsettings(ops,'verbose',0);
slover项可以的设置形式有:
---csdp
---mosek,csdp,dsdp(按你希望的选择顺序)
aux = sdpvar(length(residuals),1);
solvesdp([aux == residuals],aux'*aux);
3.方阵默认是对称的
,因此>=0是正定的意思;非方阵以及full
paremeterized方阵(如P = sdpvar(3,3,'full'))>=0是针对每个元素而言的
4.所有约束用一个[]扩起来,“,”号分割
C = [P>=0, P(1,1)<=2, sum(sum(P))==10];
5.几种特殊矩阵(也可以用sdpvar()的第三个参数来指定)
x = sdpvar(n,1);
D = diag(x) ;
% Diagonal matrix
H = hankel(x);
% Hankel matrix
T = toeplitz(x); % Toeplitz matr
Programming(非线性项以x_1^a1*x_2^a2*...*x_n^an正单
项式形式出现在目标函数和约束中,MOSEK不能直接求解GP问题,而是用mskgpopt优化
器求解一个转化后的问题,所以如果要取得原问题的解,
新浪简介
|
About Sina
|
广告服务
|
联系我们
|
招聘信息
|
网站律师
|
SINA English
|
产品答疑