2021年数学建模国赛C题问题四及模型检验
2021年數學建模國賽C題問題四詳細思路和代碼
小編本次建模雖然沒能獲得國獎,但是還是想把思路分享給大家,希望大家多多批評與指正
1 問題分析
問題四要求確定企業每周產能可以提高多少,從題意來看,企業每周的產能是描述其生產能力和實力的指標,應當是企業長期的體現。并且題目中明確給出了企業當前情況下每周的產能為2.82萬立方米,故我們認為:企業每周的產能應當是一個固定值,體現其本身的生產能力和綜合情況。
確定概念后,我們對問題進行了分析,發現題目中實際上是要求我們對未來24周企業每周的產能進行優化,在相應的訂購方案和轉運方案下,達到盡量提高的目的。確定優化任務后,我們需要對優化目標進行量化。
結合前幾個問題的分析,我們發現優化出來的訂購方案和轉運方案其實每周都可以滿足企業當前的產能(2.82萬立方米),為了找到企業到底能提高多少,我們對某一個訂購方案和轉運方案進行了分析,發現每周原材料都有剩余,數量各不相同。庫存原料主要是為了防止未來某一周原料不夠時出現停產情況,但是目前的情況是:每一周都有剩余,所以不會出現停產情況。那么,如果我們記錄下24周中最小的庫存量,然后在此基礎上,每周均多用最小庫存量的原料,這樣該企業在每周的產能就得到了提高,且不會出現停線情況。
 分析后,我們又發現只要找到不同方案下最小庫存量的最大值,即可達到最大化提高企業每周產能的目的。而這個目的,完全可通過模擬退火算法得到,以最小庫存量為優化目標,通過產生不同的訂購和轉運方案,優化最小庫存量,使其最大化。問題三的具體思路如圖8.1所示。
2 產能模型與方案產生
為了能優化企業每周的產能,我們給定的訂購方案和轉運方案下,通過每周原料的庫存量構建了產能目標函數,下面給出第 周庫存產能的計算方法:
 
 關于訂購方案,首先我們基于402家供應商后24周的訂貨數據,結合AdaBoost算法對未來24周的訂購量進行了預測,然后采用與問題三中公式(7-3)一致的初始化條件,但是不再采用優先級初始化方法,隨機對訂貨數據進行初始化,得到訂購方案。
關于轉運方案,也需要基于已經初始化得訂購方案進行初始化,其初始化方法和滿足的條件與問題二一致,我們可參考公式(6-8)給出,這里不再贅述。
下面給出本問題優化的目標函數和相關限制條件:
 
3 優化結果
在實際優化過程中,我們選取外循環500次,內循環100次,初始溫度 給定為1000,溫度衰減系數 為0.98。最后通過模擬退火算法,優化出企業的最優產能為3萬立方米左右,比起原產能2.82萬立方米提高了6.4%左右。
 
 對應的訂購方案和轉運方案如下表所示:
 
模型的評估與檢驗
本文主要建立了經濟效益模型與損耗模型,借助模擬退火算法對建立的模型進行了優化,給出了對應的訂購和轉運方案。
模型優點
(1)引入了隨機森林算法構建經濟效益模型,用隨機森林算法訓練時,各屬性節點的權重量化解決了時間序列對經濟效益的影響,同時利用了模型的預測概率量化了供應商的供貨能力,一舉兩得。
 (2)通過分析發現了數據呈周期性變化的特點,并以最后14周的數據為支撐,引入AdaBoost集成學習算法,對未來24周的訂貨量、供貨量和損耗率進行了預測,模型回歸系數高,可信性高。
 (3)借助AdaBoost算法預測的未來24周的損耗率數據,構建了損耗模型;
 (4)對于問題三中的雙目標優化問題,提出“線性加權”的思路,實現優化問題的簡化;
 (5)引入灰度關聯分析算法驗證了供應商重要性模型的正確性;
模型缺點
隨機森林模型、AdaBoost均是以預測為主,預測結果雖然精度高,但實際產生的意義難以準確說明,“黑盒性”比較大。
模型的檢驗
本部分旨在說明經濟效益模型算法和AdaBoost算法選擇的合理性:
(1)隨機森林經濟效益模型
為了衡量時間序列對經濟效益的影響,我們考慮使用決策樹類或者神經網絡類算法,能夠在訓練結束后返回屬性節點(即訓練集中各維度)的重要性,得到時間序列權重。下表反映了在訓練集:測試集為“8:2”的情況下,利用隨機森林、決策樹和多層感知機神經網絡的精度:
 
 比起其他兩種算法隨機森林算法用于經濟效益模型訓練時,隨機森林在測試時能達到更高的精度和更高的F1值,故選擇了隨機森林算法具有合理性。
(2)AdaBoost集成學習回歸模型
在前期算法選擇上,我們嘗試了常見的用于回歸的算法:嶺回歸、支持向量機、Logistic回歸,但是擬合效果均很差,所以嘗試使用集成學習的強學習算法AdaBoost進行回歸預測,上述算法的回歸系數如下表:
 
 從回歸系數來看,AdaBoost在性能上遠超其他常用的擬合預測算法,這是也是集成學習器是強學習器的體現。故我們選擇AdaBoost算法用于擬合預測未來24周訂貨量、供貨量和損耗率。
模型的推廣
對于國內生產企業原材料的訂購和轉運場景,可以將本文所建立的模型經過一定的改進與優化,用到實際生產中。可為企業定制訂購和轉運方案,將算法模型寫入企業管理系統中,實際嵌入到企業的管理平臺中,對原材料的訂購和轉運問題進行實時管控,進而達到助工助產的目的。
隨機初始化轉運方案代碼
% 隨機初始化轉運方案 function [trans_plan] = Init_trans(order_plan, waste) trans_plan = zeros(402, 8 * 24); for i = 1:24waste_week = waste(:, i);ranp = zeros(8, 1);transporter = [];for t = 1:8if waste_week(t) ~= 0transporter = [transporter, t];endendfor j = 1:402if order_plan(j, i) ~= 0rand_num = transporter(randperm(numel(transporter), 1)); if ranp(rand_num) + order_plan(j, i) < 6000ranp(rand_num) = ranp(rand_num) + order_plan(j, i);trans_plan(j, (i - 1) * 8 + rand_num) = order_plan(j, i);elsesurplus = ranp(rand_num) + order_plan(j, i) - 6000;ranp(rand_num) = 6000;trans_plan(j, (i - 1) * 8 + rand_num) = order_plan(j, i) - surplus;rand_num = transporter(randperm(numel(transporter), 1));while ranp(rand_num) + surplus > 6000if ranp(rand_num) < 6000surplus = surplus - (6000 - ranp(rand_num));trans_plan(j, (i - 1) * 8 + rand_num) = (6000 - ranp(rand_num));ranp(rand_num) = 6000;endrand_num = transporter(randperm(numel(transporter), 1)); endranp(rand_num) = ranp(rand_num) + surplus;trans_plan(j, (i - 1) * 8 + rand_num) = surplus;endendend end end退火代碼
load('..\predict_402.mat'); load('..\predict_waste.mat'); load('..\prob.mat'); class = prob(:, 3);%% 模擬退火算法尋找產能最大 T0 = 1000; T = T0; maxOutTimes = 500; % 外循環 maxInTimes = 100; % 內循環 alfa = 0.98; %隨機產生初始解 [x10, x20, capacity0] = t4_init(predict_402, predict_waste, class); y0 = min(capacity0);%% 定義一些保存中間過程的量 max_y = y0; MAXY = zeros(maxOutTimes, 1); temp = zeros(maxOutTimes, 1);%% 模擬退火過程 % 外循環 for iter = 1 : maxOutTimes % 內循環for i = 1 : maxInTimes %% 隨機產生新解[x1, x2, capacity] = t4_init(predict_402, predict_waste, class);%% 記錄新解,并計算新解的函數值,保存最優解y1 = min(capacity);% 如果新解函數值大于當前解的函數值if y1 > y0 % 更新當前解為新解x10 = x1; x20 = x2;y0 = y1;capacity0 = capacity;%%根據Metropolis準則計算一個概率elsep = exp(-(y0 - y1) / T); if rand(1) < p% 更新當前解為新解x10 = x1; x20 = x2;y0 = y1;capacity0 = capacity;endend% 判斷是否要更新找到的最佳的解if y0 > max_y max_y = y0; best_x1 = x10; best_x2 = x20; best_c = capacity;endend% 記錄本次外循環結束后找到的最優解MAXY(iter) = max_y; T = alfa * T; temp(iter) = T; enddisp('該企業每周的產能為:'); disp(max_y); xlswrite('..\附件A 訂購方案數據結果.xlsx', best_x1, '問題4的訂購方案結果', 'B7:Y408'); xlswrite('..\附件B 轉運方案數據結果.xlsx', best_x2, '問題4的轉運方案結果', 'B7:GK408');%% 畫出每次迭代后找到的最小值的圖形 fig = figure; X = 1:maxOutTimes; yyaxis left plot(X, MAXY); ylabel('產能'); yyaxis right plot(X, temp); ylabel('溫度'); xlabel('迭代次數'); title('模擬退火算法尋找企業最優產能'); legend('產能', '溫度');總結
以上是生活随笔為你收集整理的2021年数学建模国赛C题问题四及模型检验的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Android自己的自动化测试Monke
- 下一篇: 【JSP】jsp报错:Syntax er
