matlab调用CPLEX求解简单案例(二)
变量乘积相关内容,主要包括:0-1变量与连续变量的乘积、连续变量与连续变量的乘积
1)0-1变量与连续变量的乘积
利用Big-M法进行线性化

以 z=2*x+8 为例
clc
clear
M=1e6;
x_min=-3;
x_max=25;
x=sdpvar(1); % 连续变量
y=binvar(1); % 0-1变量
C=[];
C=[C,
x_min<=x<=x_max,
x_min<=x<=y*M,
];
z=2*x+8;
%% 求解器的相关配置
ops=sdpsettings('solver','cplex');
ops.cplex.mip.tolerances.mipgap=1e-3;
result=optimize(C,z,ops);
if result.problem==0 % problem =0 代表求解成功
else
error('求解出错');
end
z=double(z)
2)连续变量与连续变量的乘积
利用McCormick方法进行线性化

以 z=x*y+5*x-125*y 为例
clc
clear
x=sdpvar(1);
y=sdpvar(1);
w=sdpvar(1); % 辅助变量
C=[];
C=[C,
63<=x<=198,
-4<=y<=7,
];
C=[C,
w<=198*y-4*x+4*198,
w<=7*x+63*y-67*7,
w>=63*y-4*x+63*4,
w>=198*y+7*x-198*7,
];
% 目标函数
z=w+5*x-125*y; % w=x*y
%% 求解器的相关配置
ops = sdpsettings('solver','cplex','verbose',2,'usex0',0);
ops.cplex.mip.tolerances.mipgap = 1e-6;
%% 进行求解计算
result = optimize(C, z, ops);
if result.problem == 0 % problem =0 代表求解成功
else
error('求解出错');
end
z=value(z)
浙公网安备 33010602011771号