YALMIP 对偶变量获取 & 更多参数设定

YALMIP + MATLAB + Cplex
调用Cplex 求解之后,要获取对偶变量的值进行别的计算。搜到的教程都要用set命令,即在添加约束时候,使用

F = F+set(某约束,‘备注约束名’)

来更新约束矩阵,并且用dual(‘备注约束名称’)就可以获取对应的对偶变量的值。

遗憾set命令已经过时。如果只是使用dual命令获取对偶变量的值,不能保证得到的对偶变量矩阵与约束是一一对应的关系,即可能是乱序的。官方文档中给出了解决办法1

sdpsetting(‘solver’,‘cplex’,‘savesolveroutput’,1);
F = [P >= 0, (A’P+PA <= 0):‘Lyapunov’, trace( P ) == 1];
optimize(F);
Z2 = dual(F(‘Lyapunov’));

因此,可以继续使用最新的直接添加约束模式,并在约束后用 “:”给出约束备注名称,在dual()命令后用名称索引获取对应的对偶变量。更加简化了添加约束的方法,不用再用set函数一个个加上去了。

问题2 yalmip 可以设置的cplex参数较少

这篇文章写的很详细
我们可以使用Yalmip提供的export函数来输出model,再新建一个Cplex类实体,将model中整理好的诸如Aineq、bineq等赋值给新建的Cplex类实体。

1 %yalmip设置
2 options = sdpsettings(‘solver’ ,‘cplex’);
3 options.showprogress = 1;%1为设置显示yalmip现在在做什么
4 options.verbose = 2;%设置显示信息程度,1为适度显示,2为完全显示。
5
6 [model,recoverymodel,diagnostic,internalmodel] = export(Constraints,Objective,options);%输出Yalmip模型
7 %定义一个Cplex类实体
8 cplex_milp = Cplex(‘Milp for HTC’);
9 cplex_milp.Model.sense = ‘minimize’;
10 cplex_milp.Model.obj = model.f;
11 cplex_milp.Model.lb = model.lb;
12 cplex_milp.Model.ub = model.ub;
13 cplex_milp.Model.A = [model.Aineq;model.Aeq];
14 cplex_milp.Model.lhs = [-Inf.*ones(size(model.bineq,1),1);model.beq];
15 cplex_milp.Model.rhs = [model.bineq;model.beq];
16 cplex_milp.Model.ctype = model.ctype’;20 cplex_milp.Param.mip.tolerances.mipgap.Cur = zk.solver_error;%相对MIP间隔容差,(精度)
21 cplex_milp.Param.threads.Cur = 1;%设置将由任何 CPLEX 并行优化器调用的并行线程的缺省数量。1为单线程
22 cplex_milp.Param.mip.display = 1;%决定在混合整数优化期间cplex报告到屏幕的内容。默认为2.
23 cplex_milp.Param.timelimit = 15;%设置对优化器的调用的最长时间(以秒为单位)
24 cplex_milp.Param.emphasis.mip = 1; % 0-optimality, 1-feasibility
24 cplex_milp.writeModel(‘hmilp.lp’);%输出数学模型
25 cplex_milp.solve();


  1. yalmip对偶 ↩︎

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值