matlab编程求解答,我的代码没有317行,为什么会显示这个
matlab运行显示:
Version identifier: 12.10.0.0 | 2019-11-26 | 843d4de2ae
CPXPARAM_MIP_Display 1
Infeasibility row 'c317': 0 <= -6.
Presolve time = 0.00 sec. (1.65 ticks)
出错了(或者超时自动结束了)
ans =
'Infeasible problem (learn to debug) '
用的matlab2023a+Cplex12.10+yalmip
clear ;clc;yalmip('clear');% 初始化YALMIP环境
%% 定义参数
M = 9999999; %一个极大值
n = 4; % 工件总数
m = 5; % 机器总数
o = [4, 5, 5, 5]; % 工件i的工序数量
A = 0 : 30 : 120; % 每个工件的到达时间,设置每30个单位时间到达一个工件
D = [66, 88, 122, 200]; % 每个工件的截止时间,自定义设置
Tij=[8,6,4,5,NaN ; 5,1,2,9,3 ; 2,7,8,10,9 ; 7,6,9,5,6]; % 工序ij的加工时间
% T = zeros(n,max(o),m);% 初始化工序ij在机器k的加工时间
T=repmat(Tij,[1 1 5]);
MJ=[2,1,3,2,NaN ; 1,1,2,3,2 ; 3,3,1,2,2 ; 2,2,1,2,3];% 工序ij的可用机器
summj=sum(MJ,"all");
MK = zeros(n, max(o), m);
for i = 1:n
for j = 1:o(i)
% 随机选择MJ(i,j)个不重复的k值
selected_k = randsample(1:m, MJ(i,j), false);
% 将选定的k值对应的M(i, j, k)赋值为1
MK(i, j, selected_k) = 1;
end
end
%% 决策变量
C = sdpvar(n, max(o),'full');
X = binvar(n, max(o), m,'full');
Y = binvar(n, max(o), n, max(o),'full');
%% 约束条件
Constraints = [ ];
for i = 1:n
for j = 1:o(i)
Constraints=[Constraints,C(i,j)>=0.000000001];
sum_X=0;
for h = 1:n
for g = 1:o(h)
for k = 1:m
if MK(i,j,k)==0
T(i,j,k)=0;
Constraints=[Constraints,X(i,j,k)==0];
elseif MK(i,j,k)==1
sum_X=sum(X(i,j,:));
Constraints=[Constraints,sum_X==1];%??
if i==1&&j==1
Constraints=[Constraints,C(i,j)-T(i,j,k)==0];
end
end
if j==1
Constraints=[Constraints,(C(i,j)-T(i,j,k)-A(i))+M*(1-X(i,j,k))>=0];
elseif j>1
Constraints=[Constraints,(C(i,j)-T(i,j,k)-C(i,j-1))+M*(1-X(i,j,k))>=0];
end
if h==i&&g==j+1
Constraints=[Constraints, Y(i,j,h,g)==1 ];
end
Constraints=[Constraints,(C(h,g)-T(h,g,k)-C(i,j)+M*(3-X(i,j,k)-X(h,g,k)-Y(i,j,h,g)))>=0];
Constraints=[Constraints,(C(i,j)-T(i,j,k)-C(h,g)+M*(2+Y(i,j,h,g)-X(i,j,k)-X(h,g,k)))>=0];
end
end
end
end
end
%% 目标函数
objective = 0; % 初始化目标函数值为0
max_values= 0;
for i = 1:n
% 计算max{C_i,ni - D_i, 0}对于每一个j
max_values = max((C(i,o(i)) - D(i)), 0);
% 将这些值累加到目标函数中
objective = objective + max_values;
end
%% 求解
ops =sdpsettings('solver','cplex');
sol = optimize(Constraints,objective,ops);
if sol.problem == 0
disp('求解成功');
objective=value(objective)
else
disp('出错了(或者超时自动结束了)');
yalmiperror(sol.problem)
end