2021年五一杯数学建模A题(疫苗生产调度问题)详细分析_2021五一杯数学建模-程序员宅基地

技术标签: 自动驾驶  数学建模  人工智能  big data  

目录

一、基本介绍

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);

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_48774513/article/details/120719016

智能推荐

关于小米笔记本上的智慧互联通道被占用的问题解决_小米妙享当前信道被占用-程序员宅基地

文章浏览阅读1.6w次,点赞11次,收藏4次。小米笔记本进行智慧互联时,提示通道被占用!!!1.问题复现最近新入手了一款红米笔记本,特地奔小米互联功能去的,可能我买的时候(2019/11/1)并没有这个功能,问客服说过段时间才会上线此功能,真是心塞!!!后来终于等到了,等不及要测试一下它的速度到底有多快,于是断断续续测试了好几回,发现电脑传手机还是比较慢的,这还能忍受吧,但是今天问题又有新问题出来了,居然传不了文件,电脑端显示通道被占用(..._小米妙享当前信道被占用

Centos7.3使用脚本自动静默安装oracle11.2.0.4数据库-程序员宅基地

文章浏览阅读240次。一直想着写一个脚本实现自动化安装oracle数据库。以下内容实验过几次了,可能还存在些小问题,如果在跑以下脚本中遇到问题,自己仔细排查即可挣扎了好久,总算还是没实现,目前只能通过依次执行多个脚本来安装,起码比以前一个一个复制粘贴和修改好多了我总共写了四个脚本来实现。主要是困在几个问题上,导致无法直接整合到一个脚本中,一个是脚本的执行用户需要从root转oracle再转root再转oracl..._oracle 11g 11.2.0.4 自动安装脚本

Get the F4 help of a fiel based on the avlue of another help For Mulitple selection Field(联动的搜索帮助)_mongowriteexception:performing an update on the pa-程序员宅基地

文章浏览阅读652次。...TABLES: tvko.SELECT-OPTIONS: s_bukrs FOR tvko-bukrs, s_vkorg FOR tvko-vkorg.*custom F4 help for Sales Org.AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_vkorg-low. PERFORM form_f_mongowriteexception:performing an update on the path '' would modify the imm

java打印语句输出年龄_java的输入输出-程序员宅基地

文章浏览阅读1.7k次。0x01:输出流java常用的输出语句有下面三种:System.out.println();//换行打印,输出之后会自动换行System.out.print();//不换行打印System.out.printf();//按格式输出0x02:输出示例public classtest {public static voidmain(String []args){System.out.println(1..._如果o引用的是man类,则打印出它的年龄

通过调整LCD驱动参数解决播放高帧率视频卡的问题_单片机lcd显示动图帧率低怎么办-程序员宅基地

文章浏览阅读1.7k次。视频播放一般都是解码的事,可这次遇到怎么调整解码库也没能解决,要么格式识别不了,要么播放卡顿,要么播放一不动了,最后实在没办法,把注意力转移到屏幕驱动上,解决!_单片机lcd显示动图帧率低怎么办

keil5工程 AC5 编译器升级 AC6编译器_keil vc5转vc6-程序员宅基地

文章浏览阅读4.8k次,点赞9次,收藏48次。这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar_keil vc5转vc6

随便推点

Hyper-V搭建免费桌面云_hyper-v 云桌面-程序员宅基地

文章浏览阅读3.5k次,点赞3次,收藏28次。本文介绍了在Hyper-V虚拟化平台上部署DoraCloud免费版 ,在Windows/Linux桌面上安装DoraClient客户端程序,实现免费的桌面云办公方案。DoraCloud是一款多平台的桌面虚拟化管理软件,支持Hyper-V、VMware、Proxmox、XenServer等多种虚拟化平台。_hyper-v 云桌面

Unity合并网格和贴图_unity 通过代码合并网格贴图-程序员宅基地

文章浏览阅读3.6k次。如需转载请注明出处最近项目中由于场景中的小物件比较多导致在进入场景的时候DrawCall数量明显升高,所以就需要针对场景中的小物件进行网格的合并与贴图的合并,下面是贴图与网格合并的代码,更详细的逻辑需要根据需要去补充,如:搜索场景中的应用了这些贴图的GameObject。private static void CombineTex_Mesh() { List_unity 通过代码合并网格贴图

Android事件的分发(一)-程序员宅基地

文章浏览阅读403次。Android的事件分发是一个重点,同样也是一个难点,用到的地方非常的多,比如复杂的listview和srcoview嵌套, 带有侧拉功能的listView和viewPager相结合,listView下拉刷新和viewPager,很多个例子都是需要事件分发的,碰巧这个玩意又比较复杂,所以我们就来聊一聊Android的事件分发。View的事件分发View事件的分发相对ViewGroup的分发来说还是比

linux五种IO模型_:::::i:::::io::!':o:i!-程序员宅基地

文章浏览阅读4.1k次,点赞2次,收藏12次。为了更好的理解五种IO模型,我们先来说一下几个概念:同步,异步,阻塞和非阻塞。同步和异步  这两个概念与消息的通知机制有关。同步  所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。比如,调用readfrom系统调用时,必须等待IO操作完成才返回。异步  异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。比如:调用aio_read系统调用时,不必等IO操作完成就直接返回,调用_:::::i:::::io::!':o:i!

波动数列 蓝桥真题-程序员宅基地

文章浏览阅读336次。http://lx.lanqiao.cn/problem.page?gpid=T122我哭了 模数居然是1e8+7。。。。。。也好 长个记性第i第(i+1)个数之间的差记为di di对整个序列和的贡献是di*(n-i) 先假设首项为0 看怎么用这(n-1)个相邻差组成的数凑出s%n 因为相邻两项差确定之后 只剩首项不确定 首项e1对序列和的贡献是e1*n 所以只要保证s减去相邻差组成的数是...

VS2010/MFC编程入门之前言_vs2010 mfc 入门-程序员宅基地

文章浏览阅读1.8k次,点赞5次,收藏4次。转载自:http://www.jizhuomi.com/software/137.html鸡啄米的C++编程入门系列给大家讲了C++的编程入门知识,大家对C++语言在语法和设计思想上应该有了一定的了解了。但是教程中讲的例子只是一个个简单的例程,并没有可视化窗口。鸡啄米在这套VS2010/MFC编程入门教程中将会给大家讲解怎样使用VS2010进行可视化编程,也就是基于窗口的程序。 ..._vs2010 mfc 入门