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)

  

posted @ 2022-07-06 13:49  杨建宾  阅读(2878)  评论(0)    收藏  举报