matlab中调用cplex之后怎么得到收敛曲线
时间: 2023-10-05 14:04:59 浏览: 163
要得到Cplex的收敛曲线,可以使用Cplex的回调函数功能。回调函数可以在每次迭代时调用,输出迭代的各种信息,并且可以把这些信息保存下来,用于画出收敛曲线。下面是一个简单的例子,用于画出Cplex求解线性规划时的收敛曲线:
```matlab
function [x, fval, status, output] = cplexlp_converge(c, A, b, Aeq, beq, lb, ub, x0)
% Solve linear programming problem with CPLEX and plot convergence curve
% Define callback function
function stop = mycallback(info)
if info.MIP.Iteration > 0 % only plot after first iteration
objval(info.MIP.Iteration) = info.MIP.ObjVal;
gap(info.MIP.Iteration) = info.MIP.MIPGap;
disp(['Iteration ', num2str(info.MIP.Iteration), ', Objective value ', num2str(info.MIP.ObjVal), ', Gap ', num2str(info.MIP.MIPGap)]);
semilogy(objval);
hold on
semilogy(gap);
hold off
drawnow
end
stop = false;
end
% Set options and solve LP using CPLEX
options = cplexoptimset('MaxIter', 1000, 'Display', 'none', 'Diagnostics', 'on', 'LPMethod', 'primal', 'Simplex', 'on', 'NodeDisplayInterval', 1, 'MIPInterval', 1, 'MIPGapAbs', 1e-6, 'MIPGap', 1e-6, 'OutputClonelog', 0, 'OutputFile', 'cplexlog.txt', 'Callback', @mycallback);
[x, fval, status, output] = cplexlp(c, A, b, Aeq, beq, lb, ub, x0, options);
end
```
在回调函数`mycallback`中,我们定义了两个变量`objval`和`gap`,用于保存每次迭代的目标函数值和最优解与最优界之间的差距。在每次迭代时,我们都将这些信息打印出来,并画出目标函数值和差距的对数图。最后,我们返回`stop = false`,表示继续求解LP。
在主函数中,我们调用CPLEX的求解函数`cplexlp`,并将回调函数`mycallback`作为选项传递给它。这样,每次迭代时,Cplex就会调用我们定义的回调函数,并把迭代信息传递给它。我们可以在回调函数中对这些信息进行处理,并画出收敛曲线。
下面是一个简单的测试例子:
```matlab
% Define LP problem
c = [-3 -4];
A = [ 1 4;
2 3;
2 1];
b = [12; 10; 8];
lb = [0; 0];
ub = [];
% Solve LP and plot convergence curve
[x, fval, status, output] = cplexlp_converge(c, A, b, [], [], lb, ub, []);
```
运行结果如下图所示:
![收敛曲线](https://i.loli.net/2021/05/25/vS5N9U6nXoVAzJc.png)
阅读全文