matlab调用CPLEX求解简单案例(一)
相关理论可参照博客:https://www.cnblogs.com/liuxiang2020/p/11254947.html
简单案例及程序如下:
1)绝对值(两种处理方式)
以 y =2|x| 为例
%% 待求解目标函数 y =2|x| clc clear % 假定输入的x是-9 x=-9;
%% 方式一:
% 定义变量 z=sdpvar(1); % 约束条件 C=[]; C=[C, z>=x, z>=-x, ]; % 目标函数 y1=2*z; %% 求解器的相关配置 ops = sdpsettings('solver','cplex','verbose',2,'usex0',0); ops.cplex.mip.tolerances.mipgap = 1e-6; %% 进行求解计算 result = optimize(C, y1, ops); % 结果 y1=value(y1)
%% 方式二:
% 定义变量 z1=sdpvar(1);
z2=sdpvar(1);
% 约束条件
C=[];
C=[C,
z1>=0,
z2>=0,
x+z1-z2==0,
];
% 目标函数
y2=z1+z2;
%% 求解器的相关配置
ops = sdpsettings('solver','cplex','verbose',2,'usex0',0);
ops.cplex.mip.tolerances.mipgap = 1e-6;
%% 进行求解计算
result = optimize(C, y2, ops);
% 结果
y2=value(y)
2)分式求解
以 z=1/(x+y)为例
%% 分式求解 1/(x+y)
clc
clear
x=sdpvar(1);
y=sdpvar(1);
C=[];
% x和y的取值区间
C=[C,
2<=x<=3,
-1<=y<=5,
];
z=1/(x+y);
%% 求解器的相关配置
ops = sdpsettings('solver','ipopt','verbose',2,'usex0',0);
ops.cplex.mip.tolerances.mipgap = 1e-6;
%% 进行求解计算
result = optimize(C, -z, ops);% 求解最大值(-z),最小值(z)
z=value(z)
3)分段函数
| 0 , 0<=x<0.5
a. y=| 0.5 , 0.5=x
| 1 , 0.5<x<1
%% 程序说明
% | 0 , 0<=x<0.5
% y=| 0.5 , 0.5=x
% | 1 , 0.5<x<1
clc
clear
w=sdpvar(1,5);
z=binvar(1,4);
e=1e-6;
x=0.9 ;
y=0*w(:,1)+0*w(:,2)+0.5*w(:,3)+w(:,4)+w(:,5);
C = []; %约束条件初始
for i=1:5
C = [C,
w(1,i)>=0,
];
end
C = [C,
(0.5-e)*w(1,2)+0.5*w(1,3)+(0.5+e)*w(1,4)+w(1,5)==x,
w(1,1)+w(1,2)+w(1,3)+w(1,4)+w(1,5)==1,
z(1,1)+z(1,2)+z(1,3)+z(1,4)==1,
w(1,1)<=z(1,1),
w(1,2)<=z(1,1)+z(1,2),
w(1,3)<=z(1,2)+z(1,3),
w(1,4)<=z(1,3)+z(1,4),
w(1,5)<=z(1,4),
];
%% 求解器的相关配置
ops = sdpsettings('solver','cplex','verbose',2,'usex0',0);
ops.cplex.mip.tolerances.mipgap = 1e-6;
%% 进行求解计算
result = optimize(C, y, ops);
if result.problem == 0 % problem =0 代表求解成功
else
error('求解出错');
end
y=value(y);
w=value(w);
z=value(z);
display(['通过Yalmip求得的最优规划值为 : ', num2str(y)]);
| 0.25x , 0<=x<=0.4
b. y=| x-0.3 , 0.4=<x=<0.7
| 2x-1 , 0.7<x<1
%% 程序说明
% | 0.25x , 0<=x<=0.4
% y=| x-0.3 , 0.4=<x=<0.7
% | 2x-1 , 0.7<x<1
clc
clear
w=sdpvar(1,4);
z=binvar(1,3);
x=0.7;
y=0*w(:,1)+0.1*w(:,2)+0.4*w(:,3)+1*w(:,4);
C = []; %约束条件初始
for i=1:4
C = [C,
w(1,i)>=0,
];
end
C = [C,
0.4*w(1,2)+0.7*w(1,3)+1*w(1,4)==x,
w(1,1)+w(1,2)+w(1,3)+w(1,4)==1,
z(1,1)+z(1,2)+z(1,3)==1,
w(1,1)<=z(1,1),
w(1,2)<=z(1,1)+z(1,2),
w(1,3)<=z(1,2)+z(1,3),
w(1,4)<=z(1,3),
];
%% 求解器的相关配置
ops = sdpsettings('solver','cplex','verbose',2,'usex0',0);
ops.cplex.mip.tolerances.mipgap = 1e-6;
%% 进行求解计算
result = optimize(C, y, ops);
if result.problem == 0 % problem =0 代表求解成功
else
error('求解出错');
end
y=value(y);
w=value(w);
z=value(z);
display(['通过Yalmip求得的最优规划值为 : ', num2str(y)]);
浙公网安备 33010602011771号