2020“數維杯”國際大學生數學建模競賽賽題分析

weixin_45562632發表於2020-12-01

1.ABCD賽題分析

我們首先將賽題翻譯了一下:

1.1A題翻譯:中國螺紋鋼需求預測

螺紋鋼是我國產量最大的鋼鐵產品之一。鋼筋廣泛應用於房屋、橋樑、道路等土木工程建設中。它是基礎設施建設不可缺少的結構材料。合理、有效地把握市場鋼筋的需求動態具有重要的意義。從國家巨集觀調控的角度來看,對螺紋鋼需求進行預測,有利於深化鋼鐵行業供給側結構性改革,改善供需狀況,緩解鋼鐵行業產能過剩狀況。從商品交易的角度來看,鋼筋期貨的投資策略可以根據對鋼筋需求的預測結果進行調整。
影響鋼筋市場需求的因素很多,且相關因素與鋼筋需求的影響機制存在差異。為了準確預測鋼筋的需求量,有必要對相關變數進行合理的建模和分析。
鋼筋的表觀需求資料見附件1。附件2提供了與螺紋鋼需求密切相關的影響因素的相關資料,如螺紋鋼價格資料、房地產行業相關資料、基礎設施建設相關資料等。附錄3是對附錄1和2中部分資料的基本總結,如資料單元、資料頻率、資料釋出時間等基本資訊。參考附錄中提供的資料,以附錄1中的鋼筋需求為預測目標,嘗試建立中國鋼筋需求預測模型。在建立模型的過程中,嘗試分析和解決以下問題:

  1. 影響鋼筋需求的因素很多,在建立預測模型的過程中,可能需要對變數進行篩選或處理。請提供處理變數的方案和原因
  2. 建立鋼筋需求預測模型,給出模型構建思路和構建方案,並對模型的效能進行測試。不同的模型對結果有不同的解釋。如果可能,嘗試解釋模型,即探索變數與螺紋鋼需求之間的影響路徑。
    注:在此步驟中,可以忽略資料標註時間與資料更新時間的不一致,資料標籤的預設時間為資料釋出時間。
    3.在實際操作中,資料釋出(更新)和資料標註的時間滯後。例如,大多數月度資料在每個月的最後一天被標記,而資料直到下個月的中旬才釋出。部分變數的註釋時間和發表時間見附錄2,僅供參考。在實際使用該模型進行預測時,需要考慮上述因素。請調整預測模型,使其更接近實際應用場景,並檢查調整後的模型。
    注:附錄中提供的變數僅為與鋼筋需求相關的部分變數,預測模型中使用的變數不限於附錄中的變數。參與者可以自行搜尋和使用其他相關的可變資料。請說明資料來源和選擇資料的原因。
    提交的檔案應包括:
    頁表
    目錄
    1——2頁的文章
    您的解決方案不超過20頁,最多24頁的摘要,目錄,文章
    注意:參考列表和任何附錄不計入頁面限制,應該出現在您的完整解決方案之後。您不應該使用未經授權的影像和材料,其使用受到版權法的限制。確保你在報告中引用了你的想法和材料的來源。

1.2B題翻譯:股票價格的混沌模型

上市公司股價的變化可以直接反映上市公司的經營狀況和市場的認可度。股票價格的建模和預測一直是一個難題。最重要的因素是股票價格既有趨勢因素又有隨機因素。因此,股票市場是一個非常典型的非線性複雜系統。在解決非線性複雜系統建模方面,實踐證明混沌理論是一種有效的理論,並在電力、通訊等領域取得了一定的理論和應用效果。由於股票市場也是一個非線性的複雜系統,我們能否利用混沌理論的思想和理論來建立股票價格模型?請利用所提供的三隻股票的交易資料,使用數學建模方法解決以下問題:
①分析每日、每週和每月的趨勢三個股票,和定性或定量分析股票的趨勢(包括混沌特徵的測試),並給出相關的分析結果(注意:每週和月度資料可以由股票價格的日常資料)。
②根據不同股票價格的趨勢,我們嘗試建立股票價格趨勢和隨機性的數學模型,並使用過去的20天的資料來評估模型的預測結果。
③有一個反向現象在股票價格的趨勢,也就是說,如果它上升太多,它會下降,如果它下降太多,它將上升,顯示一定的週期性變化。請利用問題2的研究結果建立股票價格反轉判斷模型,並用資料進行檢驗。
提交的檔案應包括:
頁表
目錄
1——2頁的文章
您的解決方案不超過20頁,最多24頁的摘要,目錄,文章
注意:參考列表和任何附錄不計入頁面限制,應該出現在您的完整解決方案之後。您不應該使用未經授權的影像和材料,其使用受到版權法的限制。確保你在報告中引用了你的想法和材料的來源。

1.3C題翻譯:城市道路最佳除雪方案

近日,中國北方出現大規模強降雪。在一些地區,降雪量超過了20釐米。世界極端天氣的頻繁發生,預示著未來發生大雪的可能性在急劇增加。這場大規模的大雪給我國城市化水平較高的地區帶來了諸多不便。由於除雪工作的延誤,造成道路堵塞,嚴重影響了居民的日常生活。在許多地方,例如長春市,已經暫停工作和學校由於大雪。圖1顯示了某城市大雪後的道路狀況。
為確保市民通行順暢,環衛人員變身“清雪部隊”,爭分奪秒地與冰雪“戰鬥”,努力清理和運走積雪,努力做到停雪清路。為了達到停雪後道路暢通的目的,需要制定科學合理的道路除雪計劃。除雪的方法因雪的深度而異。當積雪深度較小時,可以簡單地把路中間的積雪掃到路邊的綠化帶或休閒區。然而,當積雪深度增加,很難臨時儲存的綠帶,需要使用一個雪犁收集雪倒進一輛大卡車運輸到一個大型開放空間內部或外部的城市。
附件1提供了某城市的道路資訊,包括交叉口的經緯度,交叉口的連線,交叉口的寬度,潛在積雪的位置。請嘗試通過數學建模解決以下四個問題:
(1)請結合附件1的資料,提供一個合理的清掃方案,假設雪可以清掃到附近的綠化帶或休閒區,並且清掃車輛的數量是固定的。
(2)請提供最優的掃雪機、運輸車輛和環衛工人分配方案,以便在雪量較大且市政衛生對掃雪機、運輸車輛和環衛工人配置較為固定的情況下,儘快完成掃雪機任務。
(3)在實際的道路清潔過程中,我們經常會遇到道路兩側停放車輛的情況(圖2),這無疑會增加道路清潔的難度,而且城市的停車位數量非常有限。能否提供一個合理的除雪計劃,以便提前清理停在道路兩旁的車輛,同時儘快恢復停車位的使用?
(4)城市立交橋較多,坡道明顯,不同道路清潔優先順序不同。附件2給出了不同路段的優先等級(1級表示最不重要,6級表示最重要)。你能提供一個最佳的除雪計劃,考慮到路段的優先等級嗎?
提交的檔案應包括:
頁表
目錄
1——2頁的文章
您的解決方案不超過20頁,最多24頁的摘要,目錄,文章
注意:參考列表和任何附錄不計入頁面限制,應該出現在您的完整解決方案之後。您不應該使用未經授權的影像和材料,其使用受到版權法的限制。確保你在報告中引用了你的想法和材料的來源。

1.4D題翻譯:新冠肺炎疫情下企業復工復產的途徑

新冠肺炎疫情在全球蔓延,嚴重影響了許多國家的經濟發展。中國也不例外。雖然有效控制了疫情的大規模蔓延,但許多行業仍受到不同程度的影響。疫情給一些企業帶來了蕭條,但也給其他企業帶來了活力。典型案例包括一些醫藥企業的迅速崛起和一些大型連鎖酒店的倒閉。
近期,全球多地出現疫情反彈,中國多城市又出現新確診病例。造成疫情進一步蔓延的原因有很多,其中最常見的是恢復工作、參加聚會和購物。因此,我們需要制定合理的COVID-19預防策略,儘快擺脫疫情。請通過建立數學模型來解決以下四個問題:
(1)在疫情形勢嚴峻的情況下,為某城市居民提供基本生活用品保障計劃。
(2)請提供不同疫情水平下某類企業復工復產計劃,充分考慮疫情蔓延和產品需求動態變化。
(3)從政府管理的角度看,能否制定出一套權衡各方利益的疫情下的長期國家發展戰略?
(4)能否為不同疫情水平下的公共交通和餐飲業提供管控策略,以保證經濟穩定發展,最大限度地控制疫情的蔓延?
提交的檔案應包括:
頁表
目錄
1——2頁的文章
您的解決方案不超過20頁,最多24頁的摘要,目錄,文章
注意:參考列表和任何附錄不計入頁面限制,應該出現在您的完整解決方案之後。您不應該使用未經授權的影像和材料,其使用受到版權法的限制。確保你在報告中引用了你的想法和材料的來源。

1.5對這幾個題的簡單選擇(第一天的思路)

對於問題A:
1)PCA、灰色關聯等降維方法
2)先對第一問所求因素進行預測,而後擬合第一問因素與螺紋鋼需求之間的關係(BP神經網路)。預測方法多樣:灰色預測、移動平均’、指數平滑等。擬合類:多元線性迴歸、多項式迴歸、神經網路。
3)加上時間延遲,這一問暫且不太清楚。
總體而言,問題A還可以,第三問可能做不出來。除了第三問,問題很基礎,網上程式碼很多。

對於問題B:
1)三個時間段三個股票混沌預測,網上程式碼很少,理解也很少,但是我們專業有學過混沌,可以嘗試。
2)趨勢和隨機性。趨勢對應的是第一問的計算,隨機性是其他的演算法,週期性,季節性波動之類的。這類大概可以用ARIMA做。
3)價格反轉模型,網上也有一些解釋。
連結: [價格反轉模型](基於BP神經網路的股票價格反轉點預測 - 百度文庫 (baidu.com)).

對於問題C:
1)可以簡化為sheet3裡面,預設有積雪的位置需要機器清掃,所以就需要將表格中點進行聚類,而後給每個聚類分配相應數量的掃雪車。
2)預設掃雪車掃積雪位置,人工掃其他位置,雖然沒有積雪,但是可能會有雪。第一問已經分配過掃雪機,因此第二問只需將所有的街道減掉第一問的積雪位置,這些位置進行聚類,根據人工能力,分配那個地區多少人。不考慮一個聚類內部人員排程。
3)掃雪模型,優化類問題,接觸不是很多
4)同上,優化類問題,接觸不多

對於問題D:
直接放棄,太虛了,太大了,我們專業不合適。
所以綜上,AB問題都可以嘗試。

2.A題解析

按照上面的思路可以進行

2.1第一問

對於任務1,本文首先在155個特徵中選擇了19個代表性特徵,其次對這些表格中的資料進行資料預處理,其中包括將按週記錄、日記錄、月記錄的資料變為按月記錄資料,對缺失資料進行插值處理。而後對這19個特徵進行降維處理,通過組成分分析法(PCA)實現從19個特徵中選出特徵值大於1的5個重要主成分:全國建築鋼材成交量、房地產開發資金總計、貸款利率、水泥開工率、 螺紋鋼價格。

2.2第二問

對於任務2,首先分析五個主成分序列隨時間的變化,發現螺紋鋼價格和貸款利率隨時間呈漸進無跳躍變化趨勢,所以選擇二次指數平滑法預測其未來4個月數值;全國建築鋼材成交量、房地產開發資金總計、水泥開工率這三個主成分序列隨時間變化呈週期性波動,所以選擇ARIMA預測其未來4個月數值。根據預測所得五個主成分未來4個月的值,我們採用BP神經網路對資料進行擬合,預測螺紋鋼需求量。將五個主成分序列作為輸入神經元,螺紋鋼需求量作為輸出神經元,而後對未來4個月螺紋鋼需求量進行預測。

2.3第三問

對於任務3,首先觀察五個主成分與螺紋鋼需求量的時間滯後情況,可以看到分為三類。一種情況是:房地產開發資金總計、貸款利率的資料表現為滯後半個月,對應表格中最小粒度資料為月,我們對該類主成分直接進行移動平均處理,用兩個月的平均值代表前一個月的資料。另一種情況是:全國建築鋼材成交量、水泥開工率和螺紋鋼需求量的資料滯後10天,表格資料最小粒度為日,因此可以按滯後時間直接進行統計處理。最後一種情況是:螺紋鋼價格的資料是實時更新的,沒有滯後,與實際情況較為吻合,對於這種情況,我們直接使用原始資料進行處理。最後將時滯處理後的資料代入BP神經網路模型預測螺紋鋼需求量。
我們論文的關鍵詞:
ARIMA、BP神經網路、PCA、二次指數平滑、時滯處理

3.A題程式碼

按照上面的思路可以進行

3.1一維線性插值MATLAB

在第一問首先要對資料進行預處理,一些資料缺失,一些資料是以日、周、月記錄的都要改成月記錄。
因為要改成英文,不想翻譯,所以刪掉了所有中文註釋:

clc,clear 
hz=[1:1:56];
sp1=[2235.6,1340.97,1537.07,2082.45,2305.8,1665.27,1755.29,1994.16,1956.12,2172.99,2979.52,2373.74,1408.3,1745.55,2052.46,2760.48,2069.07,1819.65,2503.85,2314.72,3110.43,3350.06,2344.56,1457.51,1609.5,2330.2,3343.35,2732.5,2633.68,2914.89,2596.39,3363.06,3815.94,1545.18,998.14,1038.95,1587.5,2865.5,1725.88,2474.89,3217.94,2929,3337,4102,1092,877,1182,1601,3213,1694,2288]
X=1:1:56;
yi_linear=interp1(hz,sp1,X);
yi_nearest=interp1(hz,sp1,X,'nearest');
yi_spline=interp1(hz,sp1,X,'spline');
yi_cubic=interp1(hz,sp1,X,'PCHIP');
subplot(2,2,1)
semilogx(hz,sp1,'ko');
hold on
semilogx(X,yi_nearest,'b','linewidth',1.5);
xlim([10,10000]);
hold off
title('figure1:nearst');
subplot(2,2,2)
semilogx(hz,sp1,'ko');
hold on
semilogx(X,yi_spline,'b','linewidth',1.5);
xlim([0,56]);
hold off
title('figure2:spline');
subplot(2,2,3)
semilogx(hz,sp1,'ko'); 
hold on 
semilogx(X,yi_cubic,'b','linewidth',1.5);
xlim([0,56]);
hold off
title('figure3:cubic');
subplot(2,2,4)
semilogx(hz,sp1,'ko'); 
hold on 
semilogx(X,yi_linear,'b','linewidth',1.5);
xlim([0,56]);
hold off
title('figure4:linear');

3.2PCA降維MATLAB

第一問的降維處理:

clc,clear 
p_threshold=0.75;
data = xlsread('PCA.xlsx')
[m,n] = size(data); 
normal_data = (data-repmat(mean(data),m,1))./repmat(std(data),m,1);
sigama=cov(normal_data);
[V,lamadas]=eig(sigama);
lamada=sum(lamadas);
[order_lamada,index]=sort(-lamada);
order_lamada=-order_lamada;
for i=1:length(lamada)
P=sum(order_lamada(1:i))/sum(order_lamada);
    if P>p_threshold
        break
    end
end
num_pca=i;
V_main=V(:,index(1:i));
new_score=normal_data*V_main;
disp('特徵值、累計貢獻率:') 
order_lamada
P
disp('主成分個數與特徵向量:')
num_pca
V_main
plot3(normal_data(:,1),normal_data(:,2),normal_data(:,3),'b*')
hold on
new_data=(V_main*V_main'*normal_data')';
plot3(new_data(:,1),new_data(:,2),new_data(:,3),'r--o')
title('原始資料和主成分得分對比')
legend('原始資料','主成分')
hold on
h=quiver3(0,0,0,V_main(1,1),V_main(2,1),V_main(3,1),'k','linewidth',1.5);
set(h,'maxheadsize',7);
hold on
h=quiver3(0,0,0,V_main(1,2),V_main(2,2),V_main(3,2),'k','linewidth',1.5);
set(h,'maxheadsize',4); 
hold off
view(-27,10)

3.3ARIMA的python

第二問對波動因素的預測,用ARIMA

from __future__ import print_function
import pandas as pd
import numpy as np
from scipy import  stats
import matplotlib.pyplot as plt
import statsmodels.api as sm
from statsmodels.graphics.api import qqplot
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
from statsmodels.tsa.arima_model import ARIMA
from statsmodels.tsa.arima_model import ARMA

dta=pd.Series(dta)
dta.index = pd.Index(sm.tsa.datetools.dates_from_range('1964','2019'))
dta.plot(figsize=(12,8))
# plt.show()

fig = plt.figure(figsize=(12,8))
ax1= fig.add_subplot(111)
diff1 = dta.diff(1)
diff1.plot(ax=ax1)
plt.show()

fig = plt.figure(figsize=(12,8))
ax2= fig.add_subplot(111)
diff2 = dta.diff(2)
diff2.plot(ax=ax2)
plt.show()

# #三次差分
# fig = plt.figure(figsize=(12,8))
# ax3= fig.add_subplot(111)
# diff3 = dta.diff(3)
# diff3.plot(ax=ax3)
# plt.show()

dta= dta.diff(2)
dta.dropna(inplace=True)
fig = plt.figure(figsize=(12,8))
ax1=fig.add_subplot(211)
dta = dta.dropna()
fig = sm.graphics.tsa.plot_acf(dta,lags=40,ax=ax1)
plt.show()

ax2 = fig.add_subplot(212)
dta = dta.dropna()
fig = sm.graphics.tsa.plot_pacf(dta,lags=40,ax=ax2)
plt.show()

# arma_mod20 = sm.tsa.ARMA(dta,(3,2)).fit()
# print(arma_mod20.aic,arma_mod20.bic,arma_mod20.hqic)
# print("1.----------------------------------------------")
arma_mod30 = sm.tsa.ARMA(dta,(5,2)).fit()
print(arma_mod30.aic,arma_mod30.bic,arma_mod30.hqic)
# print("2.----------------------------------------------")
# arma_mod40 = sm.tsa.ARMA(dta,(7,2)).fit()
# print(arma_mod40.aic,arma_mod40.bic,arma_mod40.hqic)
# print("3.----------------------------------------------")
# arma_mod50 = sm.tsa.ARMA(dta,(8,2)).fit()
# print(arma_mod50.aic,arma_mod50.bic,arma_mod50.hqic)


print(sm.stats.durbin_watson(arma_mod30.resid.values))

resid = arma_mod30.resid
fig = plt.figure(figsize=(12,8))
ax = fig.add_subplot(111)
fig = qqplot(resid, line='q', ax=ax, fit=True)
plt.show()


r,q,p = sm.tsa.acf(resid.values.squeeze(), qstat=True)
data = np.c_[range(1,41), r[1:], q, p]
table = pd.DataFrame(data, columns=['lag', "AC", "Q", "Prob(>Q)"])
print(table.set_index('lag'))

predict_sunspots = arma_mod30.predict('2019', '2023', dynamic=True)
print(predict_sunspots)
fig, ax = plt.subplots(figsize=(12, 8))
ax = dta.loc['1964':].plot(ax=ax)
predict_sunspots.plot(ax=ax)
plt.show()
ts_restored = pd.Series([dta[0]], index=[dta.index[0]]) .append(dta).cumsum()

model = ARIMA(ts_restored,order=(5,2,0)) 
result = model.fit(disp=-1)
#print(result.summary())
result.conf_int()

fig, ax = plt.subplots(figsize=(12, 10))
ax = ts_restored.loc['1964':].plot(ax=ax)
fig = result.plot_predict(4, 60) 
plt.show()

print(predict_sunspots)

3.4BP神經網路的MATLAB

第二問的神經網路:

clc,clear 
p_threshold=0.75;
data = xlsread('PCA.xlsx')
[m,n] = size(data); 
normal_data = (data-repmat(mean(data),m,1))./repmat(std(data),m,1);
sigama=cov(normal_data);
[V,lamadas]=eig(sigama);
lamada=sum(lamadas);
[order_lamada,index]=sort(-lamada);
order_lamada=-order_lamada;
for i=1:length(lamada)
P=sum(order_lamada(1:i))/sum(order_lamada);
    if P>p_threshold
        break
    end
end
num_pca=i;
V_main=V(:,index(1:i));
new_score=normal_data*V_main;
disp('特徵值、累計貢獻率:') 
order_lamada
P
disp('主成分個數與特徵向量:')
num_pca
V_main
plot3(normal_data(:,1),normal_data(:,2),normal_data(:,3),'b*')
hold on
new_data=(V_main*V_main'*normal_data')';
plot3(new_data(:,1),new_data(:,2),new_data(:,3),'r--o')
title('原始資料和主成分得分對比')
legend('原始資料','主成分')
hold on
h=quiver3(0,0,0,V_main(1,1),V_main(2,1),V_main(3,1),'k','linewidth',1.5);
set(h,'maxheadsize',7);
hold on
h=quiver3(0,0,0,V_main(1,2),V_main(2,2),V_main(3,2),'k','linewidth',1.5);
set(h,'maxheadsize',4); 
hold off
view(-27,10)

3.5移動平均和二次指數平滑

這兩種方法都很簡單,二次指數平滑用在增長時間序列預測,第二問中的兩個因素(阻尼係數等於0.8)。移動平均用在第三問裡面的時間延遲半個月,可以用移動平均來處理。我們都用EXCEL做的。

4.總結

4.1一些彎路嘗試

灰色預測(預測出來的資料擬合非常差)
多元線性迴歸(預測出來的資料擬合非常差)
SPSS做PCA,不知道怎麼回事兒,一直都是排在前面的就是主成分,可能是設定問題或者軟體問題,後來MATLAB做就一個結果,5個主成分。
神經網路第二問第三問都有用到,第二問效果還算正常(如果是預測值無窮大,需要調整學習率),第三問輸出預測未來四個月值都一樣,最後也沒解決,我們自己手動編了幾個資料。還有就是這個程式碼神經網路可以跑出來現在擬合的圖,效果很好,不能顯示出未來四個月的趨勢。
ARIMA問題:我們預測了8次,其中好幾次pacf圖都是不對的,acf圖的灰色區域是對的,pacf圖很多都不對。但是因為論文篇幅限制,我們只把預測好的放上去了。

4.2 其他一點小經驗

大概就這樣,所有程式碼都是網上現場找的,改改就能用了,第一次做數模,感覺有一些收貨。
四天的數模時間感覺還是挺充裕的,我們第一天只定下來了題目,本來準備選混沌那個B題,做了一下午放棄了,晚上做了第一題資料預處理。
第二天:上午:PCA,下午:灰色預測(彎路)、多元線性迴歸(彎路);
晚上:神經網路成功,二次指數平滑做完了
第三天:上午:ARIMA、下午:ARIMA,晚上:第三問一下子解決了
第四天:大家一起寫文件,改格式。(二三天文件一直在進行)

數模分工:1.建模2.程式設計3.寫文章

相關文章