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 oncount=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)),')']}) % end2.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 < 3a=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 < 3a=0.7;%未設置變異率則默認為0.7 end for i=1:length(selchrom)if rand<ab=randi(n);d=selchrom(i);c=find(selchrom==b);selchrom(i)=b;selchrom(c)=d;end End2.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))]; endx=-0.1:0.01:0.1; js=[]; for i=1:length(x)-1js=[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天,目標函數改為銷售額。
?三、總結
數學建模的趣味就是幾乎沒有正確答案,解法多種多樣,沒有絕對的好方法,只要自己用著舒服就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题(疫苗生产调度问题)详细分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: R之Excel文件读取与程序包的安装调用
- 下一篇: 因子分析——matlab