2021年国赛高教杯数学建模
C题 生产企业原材料的订购与运输
原题再现
某建筑和装饰板材的生产企业所用原材料主要是木质纤维和其他植物素纤维材料,总体可分为 A,B,C 三种类型。该企业每年按 48 周安排生产,需要提前制定 24 周的原材料订购和转运计划,即根据产能要求确定需要订购的原材料供应商(称为“供应商”)和相应每周的原材料订购数量(称为“订货量”),确定第三方物流公司(称为“转运商”)并委托其将供应商每周的原材料供货数量(称为“供货量”)转运到企业仓库。
该企业每周的产能为 2.82 万立方米,每立方米产品需消耗 A 类原材料 0.6 立方米,或 B 类原材料 0.66 立方米,或 C 类原材料 0.72 立方米。由于原材料的特殊性,供应商不能保证严格按订货量供货,实际供货量可能多于或少于订货量。为了保证正常生产的需要,该企业要尽可能保持不少于满足两周生产需求的原材料库存量,为此该企业对供应商实际提供的原材料总是全部收购。
在实际转运过程中,原材料会有一定的损耗(损耗量占供货量的百分比称为“损耗率”),转运商实际运送到企业仓库的原材料数量称为“接收量”。每家转运商的运输能力为 6000 立方米/周。通常情况下,一家供应商每周供应的原材料尽量由一家转运商运输。
原材料的采购成本直接影响到企业的生产效益,实际中 A 类和 B 类原材料的采购单价分别比 C 类原材料高 20%和 10%。三类原材料运输和储存的单位费用相同。
附件 1 给出了该企业近 5 年 402 家原材料供应商的订货量和供货量数据。附件 2 给出了 8 家转运商的运输损耗率数据。请你们团队结合实际情况,对相关数据进行深入分析,研究下列问题:
1.根据附件 1,对 402 家供应商的供货特征进行量化分析,建立反映保障企业生产重要性的数学模型,在此基础上确定 50 家最重要的供应商,并在论文中列表给出结果。
2.参考问题 1,该企业应至少选择多少家供应商供应原材料才可能满足生产的需求?针对这些供应商,为该企业制定未来 24 周每周最经济的原材料订购方案,并据此制定损耗最少的转运方案。试对订购方案和转运方案的实施效果进行分析。
3.该企业为了压缩生产成本,现计划尽量多地采购 A 类和尽量少地采购 C 类原材料,以减少转运及仓储的成本,同时希望转运商的转运损耗率尽量少。请制定新的订购方案及转运方案,并分析方案的实施效果。
4.该企业通过技术改造已具备了提高产能的潜力。根据现有原材料的供应商和转运商的实际情况,确定该企业每周的产能可以提高多少,并给出未来 24 周的订购和转运方案。
整体求解过程概述(摘要)
本文对中小微企业的信贷决策问题进行了研究。通过对企业发票数据的挖掘,提取与信贷风险相关的特征构建信贷风险预测模型,综合考虑贷款年利率、客户流失率构建分配决策优化模型,并根据模型的求解结果进行了详细深入的讨论为对供应商运输稳定性进行评价,本文基于过去 240 周的订货量数据与供货量数据,计算了供货完成率、供货误差率、波动可接受性和大额订单比例等指标,使用𝜁作为评价指数,对供应商保障企业生产的重要性进行了评价,并筛选了前50 家企业。
针对最少订购方案与转运方案情境下的规划制定,本文首先构建了以供应商是否选择作为决策变量,以供应商数量最少作为目标函数使用 0-1 规划模型,得到最少需要 127 家供应商进行供货;而后,以 127 家供货商每周的供货量作为决策变量,以最经济原材料价格作为目标函数,建立数学规划模型,利用遗传算法进行求解,得到最优的订货方案;最后,以 127 家供应商与 8 家转运商的选择作为决策变量,以最低损耗率作为目标函数建立 0-1 规划模型,得到最优的转运方案。订购与转运方案见附录三。
针对新采购方案规划中压缩生产成本的情况,为满足尽可能多的采购 A 尽可能少的采购 C 的情况,因此需要对原材料 A 与 C 进行赋权,赋权后的总和最低作为目标函数,建立供货规划模型,转运过程中,利用供货数据,以转运损耗率最低作为目标函数,建立 0-1 规划模型,利用粒子群算法,对模型进行求解,得到最优方案。订购与转运方案见附录四。
针对提高产能下的方案规划,由于并未对各企业的产能进行提升,因此在所有生产单位时间(周)下,各供货商可以按照最大供应量进行材料供应,因此只需要对转运过程进行合理规划即可,并利用改进的粒子群算法求解,得到最优方案。订购与转运方案见附录五。
最后,在本问第六部分对问题二和问题三的方案进行仿真验证,根据既定的订货方案,基本满足题目的约束条件,供货的总误差和转运的平均损耗率均在可接受的范围内,认为两个模型构造合理。
模型假设:
假设一:供应商所供应的原材料都是合格的,不存在不合格的产品;
假设二:转运商的转运损耗率不会由人为因素造成;
假设三:假设生产企业在第一周初始时原材料的储存量为 0;
假设四:假设供应商以及转运商的供应链会延续之前的规律继续进行。
问题分析:
供应商运输稳定性评价
本问题为评价类模型,基于附件 1 的供货量和进货量对供货商的供货特征进行特征增强工作,最终得到 6 个特征,基于这六个特征得到对应的评价指数,而后对每个供应商进行评价,并对按要求排名。
订购方案与转运方案的制定
本小问为规划类问题,需要给出最终的定购方案和转运方案。所以,按照规划类问题的基本思路,从决策变量,目标函数,约束条件三个方向入手,进行规划类的分析,并逐步取得最终答案。 在本小问的求解过程中,需要找到最少的供货商数量,那么也就是所挑选的每家供货商要尽可能地向生产公司供货。由于在本小问的过程中主要着眼于供货阶段,而非转运阶段,所以,不妨将转运过程中的损耗率暂时先取为 2%,也就是说生产企业的接收量统一视作供货量的 98%。
新采购方案规划
第三小问仍旧是一个规划类的问题。相较于第二小问,第三小问并没有考虑最开始供应商数量最小的规定,目标函数发生了变化,变为双变量规划函数,因此考虑粒子群算法但是决策变量和约束条件并没有特别大的变化。
提高产能下的方案规划
第四小问仍旧是一个规划类的问题。相较于第二小问,第四小问去掉了最开始供应商数量最小的规定,目标函数也发生了变化,但是决策变量和约束条件并没有特别大的变化,基于此,本部分求解欲采用优化的粒子群算法(融入退火算法中的跳出局部最优特点)进行求解。
模型的建立与求解整体论文缩略图
全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可
程序代码:(代码和文档not free)
clear all;clc;
disp('');
load('d.mat');
load('g.mat');
a=d2>d1;
yita=sum(sum(a));
A1=sum(a,2)/yita;
disp('std');
load('b.mat');
load('t.mat');
A5=d2>0;
A4=sum(A5,2)/sum(sum(A5));
A11=A1/sum(A1);
A22=A2/sum(A2);
A33=A3/sum(A3);
A44=A4/sum(A4);
A111=[A11 A22 A33 A44];
X=A111;
[n,m] = size(X);
disp(['共有' num2str(n) '个评价对象, ' num2str(m) '个评价指标'])
Judge = input(['这' num2str(m) '个指标是否需要经过正向化处理,需要请输入1 ,不需要输入 0: ']);
if Judge == 1Position = input('请输入需要正向化处理的指标所在的列,例如第 2、3、6 三列需要处理,那么你需要输入[2,3,6]: ');disp('请输入需要处理的这些列的指标类型(1:极小型, 2:中间型, 3:区间型) ')Type = input('例如:第 2 列是极小型,第 3 列是区间型,第 6 列是中间型,就输入[1,3,2]: ');for i = 1 : size(Position,2) X(:,Position(i)) = Positivization(X(:,Position(i)),Type(i),Position(i));enddisp('正向化后的矩阵 X = ')disp(X)
end
Z = X ./ repmat(sum(X.*X) .^ 0.5, n, 1);
disp('标准化矩阵 Z = ')
disp(Z)
D_P = sum([(Z - repmat(max(Z),n,1)) .^ 2 ],2) .^ 0.5;
D_N = sum([(Z - repmat(min(Z),n,1)) .^ 2 ],2) .^ 0.5;
S = D_N ./ (D_P+D_N);
disp('最后的得分为:')
stand_S = S / sum(S)
[sorted_S,index] = sort(stand_S ,'descend')
clear all;
disp('已知 50 个重要商家的 A、B、C 分类数分别为 16 15 19')
disp('导入三类供货商对应的周平均供货量矩阵 ABC');
disp('~~~~~~~~')
load('a.mat');
load('b.mat');
load('c.mat');
disp('导入重要 50 供应商家的分类 A01 B01 C01 及其对应的订货企业A02 B02 C02')
load('a1.mat')
load('a2.mat')
load('a3.mat')
load('a4.mat')
load('a5.mat')
load('a6.mat')
disp('~~~~~~~~')
z1=mean(sum(A01>A02,2)/sum(sum(A01>A02,2)));
z2=mean(sum(B01>B02,2)/sum(sum(B01>B02,2)));
z3=mean(sum(C01>C02,2)/sum(sum(C01>C02,2)));
z=z1+z2+z3;
z1=z1/z;
z2=z2/z;
z3=z3/z;
c=ones(50,1);
intcon=[1:50];