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

代码说明:

  1. 数据输入: 代码首先输入每个动作所需的时间tt和每个动作的执行工具XX_tools,并使用X1234矩阵定义动作之间的先后顺序关系。
  2. 设定决策变量: 代码使用sdpvar定义决策变量,包括X(动作顺序矩阵)、ST(动作开始时间)、NT(动作结束时间)。
  3. 设置约束: 代码设置约束条件,确保动作顺序符合定义的先后关系,并满足时间约束。
  4. 自动分组: 代码通过循环自动计算每个动作所属的组号,并将组号和动作编号存入groups矩阵。
  5. 求解模型: 代码使用intlinprog求解线性规划模型,获得最优解。
  6. 提取数据: 代码提取求解结果,包括动作开始时间st、动作结束时间nt、动作顺序矩阵XX,并调用gantzunei函数计算组内顺序。

代码优势:

  1. 自动化程度高: 代码无需手动设置分组,能够自动计算分组,简化操作。
  2. 代码逻辑清晰: 代码结构清晰易懂,注释详细,方便理解和修改。
  3. 可扩展性强: 代码可以根据实际需求修改数据输入和约束条件,实现不同情况的计算。

应用场景:

本代码可以应用于生产流程优化、任务调度等领域,帮助用户自动计算零件组内动作顺序,提高效率和效益。

注意事项:

  • 代码中的gantzunei函数需要根据实际需求编写。
  • 代码中使用了bigM方法,可能会导致数值不稳定,需要根据实际情况调整参数。

优化建议:

  • 可以尝试使用其他求解器,例如gurobi,提高求解效率。
  • 可以进一步优化代码结构,例如使用函数封装代码,提高代码复用率。

总结:

本代码实现了零件组内动作顺序的自动化计算,具有高自动化程度、清晰逻辑、可扩展性强等优点,可以应用于生产流程优化、任务调度等领域。

提示: 代码示例中使用了X1234矩阵定义动作之间的先后顺序关系,您可以根据实际情况修改这个矩阵。


原文地址: https://www.cveoy.top/t/topic/bxAm 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录