再利用cplex求解器求解目标函数最小值时,我们会遇到各种各种的困难,其中就是运行结果出现猫图,这是什么原因呢?
下面我就用一个函数求过程来举例说明:
下面展示一些 内联代码片
。
// 程序如下
clc
close all
clear
X = sdpvar(1,3); %变量
objectiv=0;
c=[];
c=[c, 1< X <=3 ];%约束
for i=1:3
objectiv=objectiv+X(i)+X(i).^2;%目标函数
end
%% 求解
option = sdpsettings('verbose',1,'solver','cplex');
Diagnostic_information = optimize(c,objectiv,option)
check(c)
if Diagnostic_information.problem == 0
disp('Diagnostic_information:该模型有解,最优解如下');
objective_ = value(objectiv)
else
disp('Diagnostic_information:该模型无解,请检查约束是否冲突或参数是否合理');
% check(constraint)
end
运行结果如下:
从运行结果可以看出,已经报错。问题出在哪里呢?
我们仔细看约束条件可以知道,变量要大于1小于等于3。因为目标函数是区间内单调递增函数,左边是开区间,因此无法求得最小值。
当把约束条件左区间取闭区间时,可求得最小值。代码修改如下
// 程序如下
clc
close all
clear
X = sdpvar(1,3); %变量
objectiv=0;
c=[];
c=[c, 1<= X <=3 ];%约束
for i=1:3
objectiv=objectiv+X(i)+X(i).^2;%目标函数
end
%% 求解
option = sdpsettings('verbose',1,'solver','cplex');
Diagnostic_information = optimize(c,objectiv,option)
check(c)
if Diagnostic_information.problem == 0
disp('Diagnostic_information:该模型有解,最优解如下');
objective_ = value(objectiv)
else
disp('Diagnostic_information:该模型无解,请检查约束是否冲突或参数是否合理');
% check(constraint)
end
结果如下: