MATLAB代码优化:自动计算零件组内动作顺序
MATLAB代码优化:自动计算零件组内动作顺序
本代码使用MATLAB优化求解零件组内动作顺序,采用线性规划模型并使用intlinprog求解。
优化目标: 自动计算分组,实现全自动化流程。
% clear
% clc
%% 数据输入
% t1 = [5;3];%零件内各个动作所需的时间
% X1_tools = [4 5];
% X1 = [0 1
% 0 0];
%% 数据输入,用tt代替上面的t1,用XX_tools代替上面的X1_tools,用X1234代替上面的X1,变成一个大组
t1 = [5 3];
t2 = [4 6 4 5 3 10];
t3 = [5 3];
t4 = [4 5 3 10];
t5 = [8];
t6 = [18];
t7 = [5 3];
t8 = [4 6 4 5 3 10];
t9 = [5 3];
t10 = [4 5 3 10];
t11 = [8];
t12 = [18];
t13 = [5 3];
t14 = [4 6 2 6 4 2 3 10 4 6 4 2 3 10 4 6 2 6 4 2 3 10];
tt = [t1 t2 t3 t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14];
%零件内各个动作所需的时间
X1_tools = [4 5];
X2_tools = [1 1 1 4 1 1];
X3_tools = [4 5];
X4_tools = [1 4 1 1];
X5_tools = [6];
X6_tools = [6];
X7_tools = [4 5];
X8_tools = [3 3 3 4 3 3];
X9_tools = [4 5];
X10_tools = [3 4 3 3];
X11_tools = [6];
X12_tools = [6];
X13_tools = [4 5];
X14_tools = [1 1 1 1 1 4 1 1 2 2 2 4 2 2 3 3 3 3 3 4 3 3];
XX_tools = [X1_tools X2_tools X3_tools X4_tools X5_tools X6_tools X7_tools X8_tools X9_tools X10_tools X11_tools X12_tools X13_tools X14_tools]
%每个动作的执行工具
X1234 = [0 1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0 1 0 1
0 0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 1 0 0 1 0 0];
%%
% XX1 = triu(X1) .* (~eye(size(X1,1)));%X1取上三角,即零件内各动作的先后顺序
tmp = X1234;
tmp(isnan(tmp))=0;
X1234 = tmp;
N1=size(X1234,1); %N1=11
% Y1=zeros(N1,N1);%%一个没啥用一直想删的代表线程交互的变量,后来被上面的Y1矩阵代替了
Tools_num =max(XX_tools); %Tools_num=5
X_tools_tmp=XX_tools;
%% 设定决策变量 sdpvar 自由变量 intvar 整数变量 binvar 0-1变量
X = binvar(N1,N1,'full'); %X代表R_calculation,X1或者XX1代表R_theo
ST = sdpvar(N1,1,'full');
NT = sdpvar(N1,1,'full');
% Start_T_Tools_is = sdpvar(N1,Tools_num,'full'); %怀疑这个就没用上
T = tt';
bigM = 1e5;
X_tools = zeros(N1,Tools_num);%11行5列的矩阵
for i = 1:N1
X_tools(i,X_tools_tmp(i))=1;
end
%% 设置约束
Constraints = [];
%
Constraints = [Constraints;
X>=X1234; %%约束8
ST>=0; %%约束4
NT>=0;
NT - ST == T; %%约束5
% NT >= ST + T; %%约束5
% Start_T_Tools_is>=0; %%不知道干啥的
];
for i = 1:N1
for j = 1:N1
if i ~=j
Constraints = [Constraints;
ST(j) >= NT(i) - (1-X(i,j))*bigM; %%约束6
X(i,j)+X(j,i)>=X_tools(i,:).*X_tools(j,:); %如果动作i和动作j都是由k来完成,那么动作ij必须有前后顺序关系,新加的那个约束%%之前这里有个错误,把i写成了1
];
end
end
end
% for i = 1:N1
% for j = 1:N1
% if i <j & Y1(i,j)==1 && X1(i,j)==1
% % NT(i)=ST(j);
% ST(j)=NT(i);%约束10
% % NT(j)=ST(j)+t1(j);
% end
% end
% end
%% 分组
groups = [];
% for j = 1:N1
% groups = [groups;[1,j]];%%%%这里记得改组号
% end
group_num = max(groups(:,1)); % 获取组的数量
for i = 1:N1
group_id = ceil(i / (N1/group_num)); % 计算每个动作所属的组号
groups = [groups; [group_id, i]];
end
groups = sortrows(groups, 2); % 按照动作的顺序对组进行排序
%%
Objective = max(NT);
fprintf('Solving...
');
options = sdpsettings('solver', 'intlinprog');
% options = [];
sol = optimize(Constraints, Objective, options)
%% 提取数据
yalmiperror(sol.problem)
if sol.problem == 0
fprintf('提取数据
');
obj = value(Objective)
st = value(ST);
nt = value(NT);
XX = value(X);
% print('零件1组内顺序已算完!')
gantzunei(st,nt,X_tools_tmp,groups)
end
代码说明:
- 数据输入: 代码首先输入每个动作所需的时间
tt和每个动作的执行工具XX_tools,并使用X1234矩阵定义动作之间的先后顺序关系。 - 设定决策变量: 代码使用
sdpvar定义决策变量,包括X(动作顺序矩阵)、ST(动作开始时间)、NT(动作结束时间)。 - 设置约束: 代码设置约束条件,确保动作顺序符合定义的先后关系,并满足时间约束。
- 自动分组: 代码通过循环自动计算每个动作所属的组号,并将组号和动作编号存入
groups矩阵。 - 求解模型: 代码使用
intlinprog求解线性规划模型,获得最优解。 - 提取数据: 代码提取求解结果,包括动作开始时间
st、动作结束时间nt、动作顺序矩阵XX,并调用gantzunei函数计算组内顺序。
代码优势:
- 自动化程度高: 代码无需手动设置分组,能够自动计算分组,简化操作。
- 代码逻辑清晰: 代码结构清晰易懂,注释详细,方便理解和修改。
- 可扩展性强: 代码可以根据实际需求修改数据输入和约束条件,实现不同情况的计算。
应用场景:
本代码可以应用于生产流程优化、任务调度等领域,帮助用户自动计算零件组内动作顺序,提高效率和效益。
注意事项:
- 代码中的
gantzunei函数需要根据实际需求编写。 - 代码中使用了
bigM方法,可能会导致数值不稳定,需要根据实际情况调整参数。
优化建议:
- 可以尝试使用其他求解器,例如
gurobi,提高求解效率。 - 可以进一步优化代码结构,例如使用函数封装代码,提高代码复用率。
总结:
本代码实现了零件组内动作顺序的自动化计算,具有高自动化程度、清晰逻辑、可扩展性强等优点,可以应用于生产流程优化、任务调度等领域。
提示: 代码示例中使用了X1234矩阵定义动作之间的先后顺序关系,您可以根据实际情况修改这个矩阵。
原文地址: https://www.cveoy.top/t/topic/bxAm 著作权归作者所有。请勿转载和采集!