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)]);

  

 

posted @ 2022-07-05 17:41  杨建宾  阅读(1381)  评论(1)    收藏  举报