2021年五一杯数学建模A题(疫苗生产调度问题)详细分析

目录

一、基本介绍

1.1 题目描述

1.2 待解决问题

二、问题分析与求解

2.1 问题一分析与求解

2.2 问题二分析与求解

2.3 问题三分析与求解

 2.4 问题四分析与求解

2.5 问题五分析与求解

三、完整代码

四、总结


一、基本介绍

1.1 题目描述

新冠肺炎肆虐全球, 给世界带来了深重的灾难。各国为控制疫情纷纷研发新冠疫苗。假定疫苗 生产需要经过 CJ1 工位、 CJ2 工位、 CJ3 工位以及 CJ4 工位等 4 个工艺流程。每个工艺流程一次性 均能处理 100 剂疫苗,  100 剂疫苗装进一个加工箱一起送进工位的设备进行处理。而且, 只有按  CJ1-CJ2-CJ3-CJ4 的顺序在 4 个工位都进行了加工以后, 才算完成生产。为防止疫苗包装出现混 乱,某疫苗生产公司生产部门规定,每个工位不能同时生产不同类型的疫苗,疫苗生产不允许插队, 即进入第一个工位安排的每类疫苗的生产顺序一旦确定就要一直保持不变, 而且前一种类型的疫苗 离开某个工位后,后一种类型的疫苗才能进入这个工位。

现有 YM1-YM10  10 种不同类型的疫苗需要生产。为安全起见,每种类型每箱(内装疫苗 100 剂) 疫苗在每个工位上均进行了 50 次模拟生产。发现, 由于生产设备、疫苗纯化等多种原因, 每个工位生产不同类型的每箱疫苗所需的时间并不稳定,详细的数据见附件 1

1.2 待解决问题

(1)请对每箱疫苗在所有工位上的生产时间进行均值、方差、最值、概率分布等统计分析,  以方便疫苗生产公司管理者能够直观的掌握每个工位生产疫苗的能力水平,为疫苗生产提供参考。

(2)某国疫苗检测部门紧急需要 YM1-YM10  100 剂疫苗进行检测。为赶时间,疫苗生 产公司需要对疫苗的生产顺序进行规划, 以便能在最短时间内交付, 以每个工位生产每箱疫苗平均 时间为依据。请建立数学模型, 制定疫苗生产顺序, 初始时刻为 00:00 ,计算生产总时间,并将结 果填入表 1

(3)在实际生产中, 每个工位生产每种疫苗的所需时间具有随机性。如果要求该公司疫苗 交货总时间比问题 2 的总时间缩短 5%,请建立数学模型, 以最大的概率完成这个任务为目标, 定生产顺序, 并给出缩短的时间比例与最大概率之间的关系。

(4)现在该疫苗生产公司接收了 10 种类型疫苗不同规模的生产任务(见附件 2)。由于生  产机器需要检修和维护,每个工位每天生产的时间不能超过 16 小时。为避免疫苗错误包装,要求  每种类型疫苗的生产任务不可以拆分, 即同种类型疫苗生产全部完成之后才能生产另外类型的疫苗。 请建立数学模型,在可靠性为 90%的前提下安排生产方案, 至少多少天可以完成任务?

(5)如果该疫苗生产公司计划在 100 天内选择部分数量的疫苗进行生产,每个工位每天生 产的时间不能超过 16 小时,每种类型疫苗的生产任务可以适当拆分,即每种类型的疫苗可以只完 成一部分。 以最大销售额为目标,请建立数学模型安排生产计划。

二、问题分析与求解

2.1 问题一分析与求解

第一问是从50次时间统计出均值、方差作为正太分布的参数,最值即是公式中的x区间范围。首先对数据进行预处理,再使用MATLAB计算均值、方差、最大值、最小值、峰度和偏度等指标,并使用描述统计、推断统计等方法分析数据特征,设计制作折线图(见图 1)和概率分布直方图,为生产公司管理者提供直观的信息。

正态分布公式如下:

%部分程序如下:
for i = 1:40
    %提取矩阵数据
    YM = x(count:count+4,:);  
    % 求均值,并存入y第一列
    y(i,1) = mean(YM(:));
    % 求方差,并存入y第二列
    y(i,2) = var(YM(:));
    % 求最大值,并存入y第三列
    y(i,3) = max(YM(:));
    % 求最小值,并存入y第四列
    y(i,4) = min(YM(:));
    % 求偏度,并存入y第五列
    y(i,5) = skewness(YM(:));
    % 求峰度,并存入y第六列
    y(i,6) = kurtosis(YM(:));
    % 概率分布,画图
    subplot(4,10,i)  %将图按行列号分布
    histogram(YM(:)) %画直方图
    set(gca,'fontname','宋体','FontSize',14)
    title({['YM',num2str(ceil(i/4)),'-CJ',num2str(mod(i,4))]})
    grid on
    count=count+5;
end

画出各工位的频率分布直方图,可以看出除去某些异常值之后,大致是满足正态分布的,严谨点的话可以画出YM1-YM10各工位的正态分布函数,我会把半成品代码贴在下面~,我当时觉得第一问没必要做这么多,就没弄了,整了个半成品,就注释掉了。

%MATLAB
% for i = 1:40
%     figure
% %     subplot(10,4,i)
%     hold on
%     m=[];
%     m=minzhi(i)-10:0.1:maxzhi(i)+10;
%     n=[];
%     n=exp(-((m-A(i)).^2)./(2*A(i)*A(i)))./(sqrt(2*pi)*S(i));
%     plot(m,n,'b--')
%     m=[];
%     m=minzhi(i):0.1:maxzhi(i);
%     n=[];
%     n=exp(-((m-A(i)).^2)./(2*A(i)*A(i)))./(sqrt(2*pi)*S(i));
%     plot(m,n,'r-')
%     plot([minzhi(i),minzhi(i)],[0,exp(-((minzhi(i)-A(i)).^2)./(2*A(i)*A(i)))./(sqrt(2*pi)*S(i))],'r--')
%     plot([maxzhi(i),maxzhi(i)],[0,exp(-((maxzhi(i)-A(i)).^2)./(2*A(i)*A(i)))./(sqrt(2*pi)*S(i))],'r--')
%     title({['YM',num2str(ceil(i/4)),'—CJ',num2str(mod(i,4)),'正态分布函数:']
%         ['exp(-(x-',num2str(A(i)),'^2)/(2×',num2str(A(i)),'^2))/(sqrt(2*pi)*',num2str(S(i)),')']})
% end

2.2 问题二分析与求解

每种疫苗必须按照CJ1-CJ2-CJ3-CJ4依次加工,题目没有说几条生产线,那么就默认1条,第二问YM1-YM10各100剂已知,疫苗生产也不允许插队,就是说之后的工位也是按第一个工位的加工顺序加工疫苗。那么第二问就直接通过randperm函数生成随机序列就好。加工过程主要有两种增大时间成本的情况:第一种是YM2在CJ1加工完成后YM1还在CJ2上加工,第二种是YM1在CJ2加工完成后,YM2还在CJ1上加工。

造成了等待时间和空挡时间,因此就需要找到一个最优的加工排序方法,在第二问每种疫苗在不同工位的加工时间以附件1中平均时间为依据。
遗传算法流程图如下:

  为了直观,画个甘特图模拟一下各疫苗各工位的生产情况,画的有点丑,没有知乎大神那么牛。

function x=jiaocha(x,n,a)
if nargin < 3
    a=0.3;%未设置交叉率则默认为0.3
end
y=x(end:-1:1);
b=randi(n); %生成随机交叉点
if rand<a   
    x=[x(b:end),x(1:b-1)];
end
​
function selchrom=bianyi(selchrom,n,a)
if nargin < 3
    a=0.7;%未设置变异率则默认为0.7
end
for i=1:length(selchrom)
    if rand<a
        b=randi(n);
        d=selchrom(i);
        c=find(selchrom==b);
        selchrom(i)=b;
        selchrom(c)=d;
    end
End

2.3 问题三分析与求解

利用所给的50次模拟生产数据,拟合出每种疫苗在各个工位上的正态函数曲线,将生产时间与概率联系在一起,考虑到实际生产过程中各个工位生产每剂疫苗所需时间具有随机性,引入蒙特卡洛模拟方法,结合在第二问的基础上使总时间缩短5%这一约束条件,借助MATLAB软件求解

%部分程序如下
%遗传算法
Chromosome=600;%染色体数
chrom=[];%生成初始种群
mt=50;%蒙塔卡罗模拟次数
F=[];%储存初始种群时间
TE=[]; %储存
for i=1:Chromosome
    %生成1 到 10 没有重复元素的整数随机排列,作为初始种群
    %未知数为10种疫苗的顺序
    chrom(i,:)=randperm(10);
   
    %由于此处代码与问题二的一部分,为了减少篇幅,将其封装为fitness函数
    for kk=1:mt
        [TE,B]=fitness(A,S,minzhi,maxzhi,chrom(i,:));
        F(i,kk)=TE;%最后CJ4加工结束时刻,单位分钟
        BB{i,kk}=B;
    end
end

%%以当前最优序列算最大概率,蒙塔卡罗模拟100不同缩短时间对应的最大概率
Y=[];
for kk=1:1000
    [G,~,D1,D2]=fitness(A,S,minzhi,maxzhi,bestx);
    %G返回CJ4结束时间,D1返回YM1-YM10在CJ1-CJ4上的加工时间,D2为对应的概率
    Y=[Y;1-G/184.7786,mean(mean(D2))];
end

x=-0.1:0.01:0.1;
js=[];
for i=1:length(x)-1
    js=[js,length(find(Y(find(Y(:,1)>=x(i)),1)<x(i+1)))];
end
js=js./sum(js);

 2.4 问题四分析与求解

该问在问题三模型的基础上增加两个约束条件:完成各种疫苗不同规模的生产任务、每个工位每天生产的时间小于等于 16 小时。此问题中唯一影响总时间的是生产时间的随机性,利用生产时间的概率密度函数,建立所给天数与完成任务可靠性的函数关系式。在可靠性为 90%的前提下安排生产方案,以一天的时间为单位离散化时间,建立差分方程模型,利用Python即可求得结果。

#部分程序
#将附件二要求生产数分成小份,以100剂为一箱
YMnum = [1000, 500, 600, 1000, 1200, 1600, 1800, 800, 600, 900]
YM_ave = YMave_list[0]
YM_std = YMstd_list[0]

CJ_time = [0, 0, 0, 0]
day_count = 0
print(YM_ave)
print(YM_std )

mcm = list()

for k in range(10000):
    #共计生产10000箱疫苗
    T = list()
    T.append(np.random.normal(YMave_list[0][0], YMstd_list[0][0], 1)[0])
    for i in range(1, 4):
        T.append(np.random.normal(YMave_list[0][0], YMstd_list[0][0], 1)[0] + T[i - 1])
    a = Time_Sum(T, YM_ave, YM_std, 1000)

    for i in range(1, 10):
        Time_Sum(T, YMave_list[i], YMstd_list[i], YMnum[i])
    mcm.append(T[3] / 960)

mcm.sort()

2.5 问题五分析与求解

以最大销售额为目标函数重新规划各种疫苗类型的生产量,工位生产时间和公司生产计划天数为约束条件,以各类型疫苗价格和生产数量序列和出厂价格为决策变量,建立单目标组合优化模型。利用遗传算法迭代寻优,可以对任务进行拆分,将任务拆分并编号,同时记录疫苗种类,可以通过randperm产生随机序列,程序中将算目标函数的for循环改为while循环,终止条件为>100天,目标函数改为销售额。

三、完整代码

2021年五一杯A题(疫苗生产调度问题)可运行程序.zip_生产调度问题

四、总结

数学建模的趣味就是几乎没有正确答案,解法多种多样,没有绝对的好方法,只要自己用着舒服就OK,上述是我对于这道题的一些粗浅的看法,可能有一些忽略的因素,欢迎各位巨佬指点。

在学习中成功、在学习中进步!我们一起学习不放弃~

记得三连哦~ 你们的支持是我最大的动力!!欢迎大家阅读往期文章哈~

小编联系方式如下,欢迎各位巨佬沟通交流,代码什么的加小编私聊哦~

int[] arr=new int[]{4,8,3,2,6,5,1};
int[] index= new int[]{6,4,5,0,3,0,2,6,3,1};
String QQ = "";
    for (int i : index){
        QQ +=arr[i];
}
System.out.println("小编的QQ:" + QQ);

2021五一数模A思路+参考资料+a代码疫苗生产优化问题 问题 1:本需要对于每箱疫苗在所有工位上的生产时间进行描述性统计分析,由于先前对于 不同类型的疫苗进行模拟实验,根据已经掌握的实验数据直接进行描述性分析即可。可以通过 EXCEL、SPSS、R 语言等数据处理软件直接进行分析,建议分析完成之后分别对于均值、方差、 最值、概率分布等不同的指标解释其数理意义以及描述不同工位生产疫苗的能力水平,方便为下一 步的研究打基础。难点在于数据的处理。 问题 2:根据附件中所给出的数据,先对其所有的数据求出平均值。将平均值作为参考指标。 目中原先说明必须按照 CJ1-CJ2-CJ3-CJ4 的顺序完成 4 个工位都进行了加工才算加工完成。当一 种疫苗进入生产步骤之后,必须完成该步骤的生产才可以安排下一种疫苗进入。由于目标函数是实 现生产时间最短,本提供两种可选方案,原理相通。一、可以选择使用 LINGO 软件安排最优线 路,设定每一个步骤所需要实现的时间长短以及该疫苗所需要完成加工的总时间,尽可能实现每一 个加工步骤都有不同类型的疫苗在进行加工,如果每一个加工步骤都能保证中间加工的空挡不断层, 即可实现加工效率的最优化。二、最优化算法中可以使用 TSP 算法安排最优的线路,通过该算法 也可以获得最优的加工顺序。要点在于本选用生产的平均值作为参考指标,大大降低了计算步骤 的难度。难点在于计算好每一类型的疫苗加工生产过程中所需要的总时间和不同加工步骤之间相距 的时间差的,其中的变量在于不同的疫苗进入加工步骤的顺序。加工步骤不可以变动顺序。 问题 3:本问题 2 最明显的区别就是每个工位生产疫苗的时间不再使用平均值来进行代替 了。问题 1 种研究了不同的指标来反映不同工位生产疫苗的能力水平,可以在其中进行选取即可完 成时间变量的选择。目要求交货总时间比问题 2 的总时间缩短 5%,即在原先问题的基础之上进 行优化目标。根据优化算法来进行生产顺序调度安排,本建议使用禁忌搜索算法来寻求最优解, 该算法可以避免陷入局部最优。求解过程与问题 2 相近,不再赘述。确定完成生产顺序之后,由于 生产的每一个过程中的时间并不是一个确定值,而是分布于一个相近的区间内,所以可以通过区间 估计来确定概率数值。本也可以使用遗传算法进行求解,确定完成遗传算法的变异率,通过代码 的计算可以完成。 问题 4:本再次引入新的限制条件,限制生产条件和生产时间。每一天时间长度为 16 小时, 且要求必须完成某一种疫苗的全部生产过程才可以开始生产别的种类的疫苗生产时间长度可以使 用问题一中给出的相关指标变量从而确定单一产品的时间。当确定完成时间之后,分别对于所有的 产品生产的时间进行计算即可得出所需要的生产时间。时间指标可以是一个变动的过程,由于生产 的时间必须为天数的整数单位(达不到一天按一天计算,若一天内能完成两项任务,可以一天安排 两种疫苗生产),生产任务不可以拆分,所以需要读者有耐心选择正确的计算方法计算出不同疫 苗产品的生产时间以及规划不同疫苗生产周期。由于已经限定了可靠性为 90%,生产时间最短 即可。使用不同疫苗产品的生产总时间作为目标变量,通过调动不同的疫苗产品作为自变量的生产 过程,确定约束条件即可计算出预期时间。 问题 5:安排生产计划是一项运筹规划类型目。根据附件给出的不同疫苗产品的报价、生产 疫苗所需要的时间、不同产品疫苗的最大任务数量进行线性规划,难点在于线性规划的约束条件是 函数关系,根据生产单一疫苗所需要的时间进行确定相关参数。销售额=疫苗的出厂价格×出厂数 量,则控制不同的疫苗的产量可以通过神经网络模型等深度学习算法进行自动求解。规划模型的条 件和生产的顺序可以通过模型计算过程自动求得最优解。由于神经网络模型自身容易陷入局部收敛 的死循环中,可以加入优化算法对该模型进行优化。切记全文所使用的优化算法一定不能重复。可 以参考:遗传算法、蚁群算法、粒子群算法等。 备注:由于生产过程的不确定性,所以生产单一疫苗的时间确定需要根据实际模拟的数据进行 确定。目中问题 2 要求使用平均值进行确定,别的目仍然可以使用,但是有能力的话建议使用 别的指标进行确定。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

饲养猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值