数学模型钢筋问题。。

数学模型
问题2 某车间要制造100套钢筋架,每套需要长为2.9m,2.1m,
1.5m的钢筋各一根。已知原料钢筋长度为7.4m。
问如何切割钢筋,使得钢筋的利用率为最高?
(1)余料最少?(2)使用的钢筋数最少?
问题:某车间要制造4米 钢 管50根,6米的 钢 管20根,8米的钢 管15根,已知原料钢管长度为19m。
(1)问如何切割钢筋,使得钢筋的利用率为最高?
目标1:余料最少?目标2:使用的钢筋数最少?
(2)增加5米的10根,问如何切割钢筋,使得钢筋的利用率为最高?目标1:余料最少?目标2:使用的钢筋数最少?

问题1:

%% 余料最少
clc, clear

Len_7_4 = 7.4; % 原料长度
Len_2_9 = 2.9; % 第一段钢筋长度
Len_2_1 = 2.1; % 第二段钢筋长度
Len_1_5 = 1.5; % 第三段钢筋长度
Num = 100; % 需要制造的套数

% 计算每套钢筋长度
Length_per_set = Len_2_9 + Len_2_1 + Len_1_5;

% 计算需要的总长度
Total_length_needed = Num * Length_per_set;

% 计算余料最少情况下需要的原料长度
Total_length_remainder_min = Total_length_needed + (Num*3 - 1) * 0.05;

% 求解最短长度
Min_Len = ceil(Total_length_remainder_min / Len_7_4) * Len_7_4;

% 计算剩余原料长度
Remainder = Min_Len - Total_length_remainder_min;

fprintf(‘最短需要的长度为:%.1f米\n’, Min_Len);
fprintf(‘剩余原料长度为:%.1f米\n’, Remainder);

%% 使用的钢筋数最少
clc, clear

Len_7_4 = 7.4; % 原料长度
Len_2_9 = 2.9; % 第一段钢筋长度
Len_2_1 = 2.1; % 第二段钢筋长度
Len_1_5 = 1.5; % 第三段钢筋长度
Num = 100; % 需要制造的套数

% 定义目标函数
f = @(x) sum(x);

% 线性约束矩阵
A = [Len_2_9, Len_2_1, Len_1_5];

% 不等式约束常数,必须为列向量
b = Total_length_needed;

% 上下界约束
lb = zeros(3,1);
ub = b;

% 求解
x = linprog(f, [], [], A, b, lb, ub);
x = ceil(x);

% 计算原料利用率
utilization_rate = Total_length_needed / sum(x);

fprintf(‘最少需要使用%d根长度为2.9m的钢筋\n’, x(1));
fprintf(‘最少需要使用%d根长度为2.1m的钢筋\n’, x(2));
fprintf(‘最少需要使用%d根长度为1.5m的钢筋\n’, x(3));
fprintf(‘钢筋利用率为:%.2f\n’, utilization_rate);

问题2:


%% 目标1:余料最少
clc, clear

Len_19_0 = 19.0; % 原料长度
Len_4_0 = 4.0; % 第一种钢管长度
Len_6_0 = 6.0; % 第二种钢管长度
Len_8_0 = 8.0; % 第三种钢管长度
Num_4_0 = 50; % 第一种钢管数量
Num_6_0 = 20; % 第二种钢管数量
Num_8_0 = 15; % 第三种钢管数量

% 计算需要使用的原料长度
Total_length_needed = Len_4_0Num_4_0 + Len_6_0Num_6_0 + Len_8_0*Num_8_0;

% 计算余料最少情况下需要的原料长度
Total_length_remainder_min = Total_length_needed + (Num_4_0 + Num_6_0 + Num_8_0) * 0.05;

% 求解最短长度
Min_Len = ceil(Total_length_remainder_min / Len_19_0) * Len_19_0;

% 计算剩余原料长度
Remainder = Min_Len - Total_length_remainder_min;

%% 目标2:使用的钢筋数最少
clc, clear

Len_19_0 = 19.0;   % 原料长度
Len_4_0 = 4.0;     % 第一种钢管长度
Len_6_0 = 6.0;     % 第二种钢管长度
Len_8_0 = 8.0;     % 第三种钢管长度
Num_4_0 = 50;      % 第一种钢管数量
Num_6_0 = 20;      % 第二种钢管数量
Num_8_0 = 15;      % 第三种钢管数量

% 定义目标函数
f = @(x) sum(x);

% 线性约束矩阵
A = [Len_4_0, Len_6_0, Len_8_0];

% 不等式约束常数,必须为列向量
b = Total_length_needed;

% 上下界约束
lb = zeros(3,1);
ub = b;

% 求解
x = linprog(f, [], [], A, b, lb, ub);
x = round(x);

% 计算原料利用率
utilization_rate = Total_length_needed / sum(x);

fprintf('最少需要使用%d根长度为4m的钢管\n', x(1));
fprintf('最少需要使用%d根长度为6m的钢管\n', x(2));
fprintf('最少需要使用%d根长度为8m的钢管\n', x(3));
fprintf('钢管利用率为:%.2f\n', utilization_rate);

% 增加5米的钢管
Len_5_0 = 5.0;    % 第四种钢管长度
Num_5_0 = 10;     % 第四种钢管数量

% 更新参数
Total_length_needed = len_4_0*num_4_0+len_6_0*num_6_0+len_8_0*num_8_0+len_5_0*num_5_0;

% 目标1:余料最少
% 计算余料最少情况下需要的原料长度
Total_length_remainder_min = Total_length_needed + (num_4_0+num_6_0+num_8_0+num_5_0)*0.05;
% 求解最短长度
Min_Len = ceil(Total_length_remainder_min/Len_19_0)*Len_19_0;
% 计算剩余原料长度
Remainder = Min_Len - Total_length_remainder_min;
fprintf('最短需要的长度为:%.1f米\n', Min_Len);
fprintf('剩余原料长度为:%.1f米\n', Remainder);

% 目标2:使用的钢筋数最少
% 定义目标函数
f = @(x) sum(x);

% 线性约束矩阵
A = [Len_4_0, Len_6_0, Len_8_0, Len_5_0];

% 不等式约束常数,必须为列向量
b = Total_length_needed;

% 上下界约束
lb = zeros(4,1);
ub = b;

% 求解
x = linprog(f, [], [], A, b, lb, ub);
x = round(x);

% 计算原料利用率
utilization_rate = Total_length_needed / sum(x);

fprintf('最少需要使用%d根长度为4m的钢管\n', x(1));
fprintf('最少需要使用%d根长度为6m的钢管\n', x(2));
fprintf('最少需要使用%d根长度为8m的钢管\n', x(3));
fprintf('最少需要使用%d根长度为5m的钢管\n', x(4));
fprintf('钢管利用率为:%.2f\n', utilization_rate);