赞
踩
数学建模/科研学习推荐学习软件:Matlab+yalmip+cplex安装教程及算例
其实绝大多数本科生都是在用Matlab和LINGO求解优化问题,Matlab可以求解一般优化问题,但是当优化问题规模比较大或者在应对一些非线性问题时候,Matlab会出现求解时间长,求解效率低,甚至难以求解等问题。
Matlab+yalmip+cplex是Matlab通过调用商业软件cplex求解,求解时间短,这里简单介绍Matlab+yalmip+cplex安装教程及简单算例
CPLEX 安装教程:
1.在BIM官网下载CPLEX软件:CPLEX Optimizer.其中community-edition可以免费试用,但最多只能计算1000个变量或1000个约束条件的优化问题。而扩展版则需要购买,价格特别昂贵,一般优化问题其实community-edition足够了
2.在matlab菜单栏中找到设置路径(set path)的选项,选择“添加并包含子文件夹”,将cplex安装路径的cplexmatlab这一个文件夹添加进去,如图所示:
3.验证是否成功,命令窗口输入: doc cplex,若出现帮助文档,则表示路径添加成功
yalmip 安装教程:
1.在yalmip官网下载软件:https://yalmip.github.io/.教程网址:https://yalmip.github.io/tutorials/
2.将文件解压,并放到 matlab 程序安装路径中的 toolbox 文件夹下
3. 在matlab菜单栏中找到设置路径(set path)的选项,选择“添加并包含子文件夹”,将 yalmip 的路径添加进去,如图所示:
4.验证是否成功,命令窗口输入: doc yalmip,若出现帮助文档,则表示路径添加成功
小算例:
因为这里调用yalmip,所以编程语言其实和matlab有所不同,yalmip教程网址:https://yalmip.github.io/tutorials/,这里分享一个小算例和大家介绍常用语句:
- %定义变量
- x=sdpvar(2,1);
- %目标函数
- obj=2*x(1)+3*x(2);
- %约束条件
- constraint=[];
- constraint=[constraint,x(1)+x(2)>350];
- constraint=[constraint,x(1)>100];
- constraint=[constraint,2*x(1)+x(2)<600];
- constraint=[constraint,x(2)>0];
- %求解
- ops = sdpsettings('solver','cplex','verbose',1);
- ops.cplex.display='on';
- ops.cplex.timelimit=600;
- ops.cplex.mip.tolerances.mipgap=0.001;
- % 诊断求解可行性
- disp('开始求解')
- diagnostics=optimize(constraint,obj,ops);
- if diagnostics.problem==0
- disp('Solver thinks it is feasible')
- elseif diagnostics.problem == 1
- disp('Solver thinks it is infeasible')
- pause();
- else
- disp('Timeout, Display the current optimal solution')
- end
这里的常用语句:
sdpvar:实数变量,intvar:整数变量,binvar:0-1变量
value:变量或表达式的值
ops = sdpsettings('solver','cplex','verbose',1); 设置求解方法为调用 Cplex
如果用LINGO求解,是这样的:
- %目标函数
- min=2*x1+3*x2;
- x1+x2>=350;
- x1>=100;
- %约束条件
- 2*x1+x2<=600;
如果用Matlab求解,需要调用函数,这里就不赘述。
可以看出其实无论LINGO还是Matlab+yalmip+cplex编程,都有一个非常好的优点就是:程序很清晰,目标函数约束条件再到求解的三块很明确。所以我一般求解线性优化使用LINGO,复杂优化问题常用Matlab+yalmip+cplex。而单纯Matlab求解优化问题一般都先需要转化为矩阵格式,然后调用函数求解,就相对比较麻烦。
欢迎关注我哦(公众号小易成长屋),分享更多数学数模,甚至科研的干货问题。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。