【數學建模】數學建模應掌握的十類算法
- 前言
- 數學建模競賽官網
- 1. 全國大學生數學建模競賽官網
- 2. 美國大學生數學建模競賽官網
- 3. Matlab 網站
- 4. 研究生數學建模競賽官網
- 數學建模應掌握的十類算法
- 1. 蒙特卡羅方法(Monte-Carlo方法, MC)
- 2. 數據擬合、參數估計、插值等數據處理算法
- 3. 規劃類問題算法
- 4. 圖論問題
- 5. 計算機算法設計中的問題
- 6. 最優化理論的三大非經典算法
- 7. 網格算法和窮舉算法
- 8. 連續問題離散化的方法
- 9. 數值分析方法
- 10. 圖象處理算法
前言
數學建模的核心是 “用算法解決實際問題”,以下十類算法覆蓋了競賽中 90% 以上的場景。下面將從 “算法本質 + 適用場景 + 核心優勢 + 簡單案例” 四個維度展開,幫你快速理解并落地使用。?
數學建模競賽官網
1. 全國大學生數學建模競賽官網
CUMCM 網站
2. 美國大學生數學建模競賽官網
MCM和ICM 網站
3. Matlab 網站
Matlab 網站
4. 研究生數學建模競賽官網
GMCM 網站
數學建模應掌握的十類算法
1. 蒙特卡羅方法(Monte-Carlo方法, MC)
該算法又稱計算機隨機性模擬方法,也稱統計試驗方法。這 一方法源于美國在第一次世界大戰進行的研制原子彈的“曼哈頓計劃”。該計劃的主持人之一、數學家馮·諾伊曼用馳名 世界的賭城—摩納哥的 Monte Carlo—來命名這種方法。 MC方法是一種基于“隨機數”的計算方法,能夠比較逼真地 描述事物的特點及物理實驗過程,解決一些數值方法難以解 決的問題。MC方法的雛型可以追溯到十九世紀后期的蒲豐(Buffon) 隨機投針試驗,即著名的蒲豐問題。 MC方法通過計算機仿真(模 擬)解決問題,同時也可以通過模擬來檢驗自己模型的正確 性,幾乎是比賽時必用的方法。
算法本質:通過 “大量隨機模擬” 逼近真實結果的統計試驗方法。核心邏輯是 “用隨機性解決確定性問題”—— 比如想算圓的面積,可向正方形內隨機投點,用 “圓內點數 / 總點數” 乘以正方形面積近似圓面積(類似蒲豐投針試驗)。
適用場景:?
- 無法用公式精確計算的復雜問題(如不規則圖形面積、復雜系統風險概率);?
- 驗證模型正確性(比如用 MC 模擬結果對比理論模型,判斷是否合理);?
- 隨機過程問題(如股票價格波動、排隊系統等待時間預測)。?
核心優勢:邏輯簡單、易實現,無需復雜公式推導,僅需通過 “足夠多的模擬次數”(通常數千至數萬次)保證精度。?
案例:預測某商場節假日排隊結賬的平均等待時間 —— 隨機生成顧客到達間隔、收銀員處理速度,模擬 10000 次結賬流程,統計等待時間的平均值。?
工具提示:Python(numpy.random庫)、MATLAB(rand函數)均可快速實現,重點控制 “隨機數種子” 確保結果可復現。
2. 數據擬合、參數估計、插值等數據處理算法
在實際建模問題中,常常需要對實驗或實地采集到的數據進行處理,通過擬合出具有規律的數學表達式,以及估計其中的未知參數。
常用技術有:最小二乘擬合、極值擬合、指數/平方擬合,插值包括線性插值、方差插值、分段插值等,也包括正態分布下的最大使然率估計等。
算法本質:“從雜亂數據中找規律” 的基礎工具 ——
- 數據擬合:用一條曲線(如直線、二次曲線、指數曲線)近似描述數據趨勢(比如用線性擬合找 “溫度與冰淇淋銷量” 的關系);
- 參數估計:根據樣本數據反推模型中的未知參數(比如已知 “人口增長符合 Logistic 模型”,用歷年人口數據估計 “最大人口容量”
這個參數); - 插值:當數據存在缺失時,用已知點 “補全” 中間值(比如已知每天的氣溫,用插值算每小時的氣溫)。
適用場景:幾乎所有涉及 “數據” 的建模問題 —— 比如環境監測數據趨勢分析、經濟指標預測、實驗數據誤差修正。
核心優勢:將 “離散數據” 轉化為 “連續規律”,為后續建模(如預測、優化)提供基礎;且工具成熟,無需手動推導公式。
案例:給定某城市 2010-2020 年的 GDP 數據,用 “二次函數擬合” 預測 2025 年 GDP;若 2015 年數據缺失,用 “線性插值”(2014 和 2016 年數據的平均值附近)補全。
工具提示:MATLAB(polyfit擬合、interp1插值)、Python(scipy.optimize.curve_fit參數估計),重點選擇 “擬合優度 R2” 最高的模型(R2 越接近 1,擬合效果越好)。
3. 規劃類問題算法
此類問題主要有線性規劃、整數規劃、多元規劃、二次規劃等。競賽中很多問題都和數學規劃有關,可以說不少的模型都可以歸結為一組不等式作為約束條件、幾個函數表達式作為目標函數的問題,遇到這類問題,求解就是關鍵了。
算法本質:“在約束條件下找最優解” 的決策工具 —— 比如 “如何分配資源(人力、資金),讓收益最大 / 成本最小”。根據變量類型和目標函數形式,分為:?
-
線性規劃:變量和目標函數均為 “線性關系”(如 “生產 A、B 兩種產品,原料有限,求最大利潤”);?
-
整數規劃:變量必須是整數(如 “招聘員工人數、采購設備臺數”,不能是 0.5 人 / 臺);?
-
二次規劃:目標函數是 “二次函數”(如 “投資組合優化,讓收益最大且風險最小”,風險通常用方差表示,是二次項);?
-
多目標規劃:有多個目標(如 “既想成本低,又想質量高”),需權衡找到 “最優折中解”。?
適用場景:資源分配、生產計劃、路徑規劃、投資決策等 “求最優” 問題。?
核心優勢:將實際問題轉化為 “數學不等式約束 + 目標函數”,通過成熟工具直接求解,無需手動編寫算法。?
案例:某工廠生產甲、乙兩種零件,甲每件利潤 5 元(耗原料 2kg),乙每件利潤 8 元(耗原料 3kg),每天原料最多 100kg,求每天生產多少甲、乙零件讓利潤最大 —— 這是典型線性規劃問題,最優解可通過工具直接算出。?
工具提示:MATLAB(intlinprog整數規劃、fmincon非線性規劃)、Python(scipy.optimize.linprog線性規劃)、Lingo(專門用于規劃問題,語法更簡潔)。
4. 圖論問題
這類問題算法有很多,包括:
Dijkstra
、Floyd
、Prim
、Bellman-Ford
,最大流,二分匹配等問題。
算法本質:解決 “由點和邊組成的圖結構” 問題,比如交通路線、社交網絡、物流網絡等。核心算法及用途如下:?
- 最短路徑:Dijkstra 算法(求 “單起點到其他點的最短路徑”,如從學校到各景點的最短路線,邊權非負)、Floyd 算法(求
“所有點之間的最短路徑”,如多個城市間的最短交通距離);? - 最小生成樹:Prim 算法(從 “點” 出發構建最小樹)、Kruskal 算法(從 “邊” 出發構建最小樹),用于
“連接所有點且總代價最小”(如鋪設通信電纜,讓所有村莊連通且成本最低);? - 最大流:用于 “網絡中最大傳輸能力” 問題(如水管網絡最大輸水流量、公路網最大通行車輛數);?
- 二分匹配:用于 “兩類元素配對” 問題(如 “員工 - 任務分配”“學生 - 宿舍分配”,確保每個元素只配對一次)。?
適用場景:網絡優化、路徑規劃、資源匹配、社交關系分析等問題。?
核心優勢:將 “網絡結構” 抽象為圖,用現成算法解決,邏輯清晰且效率高。?
案例:某快遞網點需給 5 個小區送貨,求從網點出發,遍歷所有小區且總路程最短的路線 —— 可轉化為 “旅行商問題”(圖論中的 NP 問題,可用近似算法求解);若僅求網點到每個小區的最短路線,用 Dijkstra 算法即可。?
工具提示:Python(networkx庫,封裝了所有圖論算法,調用簡單)、MATLAB(graph和digraph類,處理有向圖 / 無向圖)。?
5. 計算機算法設計中的問題
計算機算法設計包括很多內容:動態規劃 (多段計劃)、回溯搜索 (通過遞歸析算)、分治算法 (分而治之,后聚結)、分支限界 (精確搜索最優)等計算機算法。適合于解決給定規則下的字符串、排列、組合類規劃問題。
算法本質:解決 “復雜問題分解與求解” 的通用思路,是編程實現模型的核心能力:?
- 動態規劃(DP):將 “大問題拆成多個小問題,記住小問題的解,避免重復計算”(如 “背包問題”—— 有一個容量為 10kg
的背包,選哪些物品裝,讓總價值最大,每個物品只能裝一次);? - 回溯搜索:“嘗試所有可能解,不符合條件就回溯”(如 “N 皇后問題”—— 在 N×N 棋盤放 N
個皇后,互不攻擊,枚舉所有可能位置),適合解空間小的問題;? - 分治算法:“將大問題分成多個獨立小問題,分別求解后合并結果”(如 “快速排序”“大數乘法”,適合并行計算);?
- 分枝定界:“不斷分割解空間,排除不可能的區域,快速找到最優解”(如 “整數規劃的精確求解”,比回溯法效率高)。
適用場景:組合優化、排列組合、搜索匹配等 “需枚舉或分解” 的問題。
核心優勢:通過 “分解 / 剪枝” 降低計算量,讓原本 “算不完” 的問題變得可解。
案例:“湊零錢問題”—— 用 1 元、5 元、10 元硬幣湊出 27 元,求最少用多少枚硬幣 —— 用動態規劃,先算湊 1 元、2 元… 的最少硬幣數,再遞推到 27 元,避免重復計算。
工具提示:無專門工具,需用 Python/MATLAB 手動編寫代碼,重點是找到 “動態規劃的狀態轉移方程”“回溯的剪枝條件”,減少計算量。
6. 最優化理論的三大非經典算法
適用于處理非規則、處于應用實際地方的處理問題。
模擬退火法 (Simulated Annealing, SA)
遺傳算法 (Genetic Algorithm, GA)
神經網絡 (Neural Network, NN)
這類算法常用于非線性處理、形狀識別、對系統進行較高級的擬合和預測。
算法本質:解決 “傳統算法難求解的復雜優化問題”(如非線性、多峰、高維問題),屬于 “啟發式算法”,思路源于自然現象:?
-
模擬退火法(SA):模仿 “金屬退火” 過程 —— 先高溫(隨機搜索,接受差解),再降溫(逐漸聚焦最優區域,少接受差解),適合 “避免陷入局部最優”(如旅行商問題,避免找到 “局部最短路徑” 而非 “全局最短”);?
-
神經網絡(NN):模仿 “人腦神經元連接”,通過大量數據 “訓練模型”,適合 “非線性擬合、分類預測”(如 “根據天氣、溫度、促銷活動預測商品銷量”,數據越多,預測越準);?
-
遺傳算法(GA):模仿 “生物進化”—— 選擇(保留優解)、交叉(優解結合)、變異(隨機變異,避免局部最優),適合 “多變量、多約束的復雜優化問題”(如 “工廠生產流程優化,涉及多個環節參數調整”)。?
適用場景:復雜優化、非線性預測、分類識別等 “傳統算法效果差” 的問題。?
核心優勢:無需知道問題的數學表達式,僅通過 “迭代搜索 / 數據訓練” 找到解,魯棒性強(對噪聲數據不敏感)。?
案例:預測某地區下個月的降雨量 —— 用過去 10 年的 “溫度、濕度、氣壓” 數據訓練神經網絡,輸入當月數據即可預測下月降雨量;若用傳統線性擬合,因降雨量與因素是非線性關系,誤差會很大。?
工具提示:Python(scikit-learn庫的MLPRegressor神經網絡、deap庫的遺傳算法)、MATLAB(simulannealbnd模擬退火、feedforwardnet神經網絡),重點是調整算法參數(如 SA 的降溫速率、GA 的交叉概率)。?
7. 網格算法和窮舉算法
網格算法和窮舉法一樣,只是網格法是連續問題的窮舉。比如要求在
N
個變量情況下的最優化問題,那么對這些變量可取的空間進行采點,比如在[a, b]
區間內取M+1
個點, 就是a,a+(b-a)/M,a+2(b-a)/M,...,b
。那么這樣循環就 需要進行(M + 1)^N
次運算,所以計算量很大。
算法本質:“暴力搜索最優解” 的基礎方法,適合 “變量少、范圍小” 的問題:
- 窮舉算法:對 “離散變量” 逐一嘗試(如 “密碼破解,嘗試所有可能的數字組合”);
- 網格算法:對 “連續變量” 進行 “網格化采點”,再逐一嘗試(如變量 x 在 [0,10] 區間,取 0、2、4、6、8、10 共 6
個點,變量 y 在 [0,5] 區間取 3 個點,總嘗試次數 6×3=18 次)。
適用場景:變量少(通常≤3 個)、范圍小的簡單優化問題,或作為 “驗證其他算法結果是否正確” 的基準(比如用網格算法驗證動態規劃的解是否最優)。
核心優勢:邏輯最簡單,絕對能找到最優解(只要變量范圍和點數足夠),無需復雜代碼。
案例:求函數 f (x,y)=x2+y2 在 x∈[0,5]、y∈[0,5] 的最小值 —— 用網格算法取 x=0,1,2,3,4,5(6 個點),y 同理,計算 36 個點的函數值,最小的就是近似最優解(實際最優解在 (0,0),函數值 0)。
注意事項:變量多或范圍大時,計算量會 “爆炸”(如 3 個變量各取 100 個點,總次數 1003=100 萬次;4 個變量就是 1 億次),此時需用其他算法(如遺傳算法)替代。
8. 連續問題離散化的方法
很多問題都是實際來的,數據可以是連續的,而計算機只能處理離散的數據,因此需要將連續問題進行離散化處理后再用計算機求解。比如差分代替微分、求和代替積分等思想都是把連續問題離散化的常用方法。
算法本質:將 “計算機無法直接處理的連續問題” 轉化為 “離散的數值問題”,核心是 “用近似代替精確”:?
- 差分代替微分:比如函數 f (x) 的導數 f’(x)≈[f (x+h)-f (x)]/h(h 是很小的數,如
0.001),用于求解微分方程(如人口增長的微分方程,轉化為差分方程后迭代求解);? - 求和代替積分:比如求曲線下面積(積分),用 “多個小矩形面積之和” 近似(矩形越窄,結果越精確),即數值積分;?
- 時間離散化:將 “連續時間” 拆成 “時間步長”(如模擬一天的溫度變化,每小時取一個時間點,共 24 個離散時間)。?
適用場景:微分方程求解、連續系統模擬、數值積分 / 微分等問題。?
核心優勢:讓連續問題可通過計算機 “分步計算”,是連接 “理論模型” 和 “計算機實現” 的關鍵橋梁。?
案例:求解 “物體自由下落的位移”—— 自由下落的位移滿足微分方程 s’(t)=gt(g 是重力加速度),用差分代替微分,將時間 t 拆成 0.1 秒的步長,從 t=0 開始,每次迭代計算 s’(t+0.1)=s(t)+g×t×0.1,逐步得到任意時刻的位移。?
工具提示:MATLAB(ode45求解常微分方程,內置離散化邏輯)、Python(scipy.integrate.solve_ivp微分方程求解、scipy.integrate.quad數值積分)。?
9. 數值分析方法
數值分析研究各種求解數學問題的數值計算方法,特別 是適合于計算機實現的方法與算法。它的主要內容包括 函數的數值逼近、數值微分與數值積分、非線性方程的 數值解法、數值代數、常微分方程數值解等。數值分析 是計算數學的一個重要分支,把理論與計算緊密結合,是 現代科學計算的基礎 。
MATLAB
等數學軟件中已經有很 多數值分析的函數可以直接調用。
算法本質:研究 “如何用數值計算解決數學問題” 的方法,是數學建模的 “底層工具庫”,核心內容及用途:
-
函數數值逼近:用簡單函數(如多項式、樣條函數)近似復雜函數(如用多項式近似三角函數 sinx,便于計算);
-
數值微分與積分:見 “連續問題離散化”,是求解導數和積分的具體實現方法;
-
非線性方程求解:比如求解 f (x)=x3-2x-1=0 的根(手動算難,用數值方法如牛頓迭代法,逐步逼近真實根);
-
數值代數:求解線性方程組(如 Ax=b,A 是矩陣,x 是未知向量,用高斯消元法、LU 分解等快速求解)、矩陣特征值計算(如主成分分析
PCA 中需算協方差矩陣的特征值); -
常微分方程數值解:見 “連續問題離散化”,如歐拉法、龍格 - 庫塔法(比歐拉法精度更高)。
適用場景:幾乎所有 “需要數值計算” 的問題,是其他算法(如規劃、微分方程模擬)的基礎。
核心優勢:提供 “可靠、高效” 的數值計算方法,避免因手動計算誤差導致模型結果錯誤。
案例:求解線性方程組 “2x+y=5,x+3y=6”—— 用高斯消元法(數值代數中的方法),先消去 x,得到 y=1,再代入得 x=2,過程可通過工具自動化實現。
工具提示:MATLAB(內置大量數值分析函數,如inv矩陣求逆、eig特征值計算)、Python(numpy.linalg線性代數庫、scipy.linalg高級數值代數工具)。
10. 圖象處理算法
賽題中有一類問題與圖形有關,即使問題與圖形無 關,論文中也會需要圖片來說明問題,這些圖形如 何展示以及如何處理就是需要解決的問題,通常使 用
MATLAB
進行處理。
算法本質:對 “圖像數據” 進行處理,提取信息或優化顯示,核心用途:
-
圖像預處理:降噪(去除圖像中的干擾點)、增強(讓圖像更清晰,如提高對比度)、裁剪 / 縮放(調整圖像大小);
-
特征提取:從圖像中提取有用信息(如識別交通標志中的 “圓形”“紅色” 特征,用于交通標志識別);
-
圖像分割:將圖像分成不同區域(如醫學圖像中,把 “腫瘤區域” 和 “正常組織區域” 分開);
-
圖像生成:根據數據生成圖像(如將 “溫度分布數據” 轉化為彩色熱力圖,更直觀展示)。
適用場景:賽題中涉及圖像的問題(如車牌識別、醫學圖像分析)、論文中 “數據可視化”(用圖像展示結果,比表格更直觀)。
核心優勢:將 “圖像” 轉化為 “可分析的數據”,或讓 “抽象數據” 通過圖像更易理解,提升論文表現力。
案例:某賽題要求 “根據衛星圖像統計某地區的綠地面積”—— 先對圖像進行 “閾值分割”(將綠色區域和其他區域分開),再計算綠色區域的像素數,乘以每個像素對應的實際面積,得到綠地總面積。
工具提示:MATLAB(image processing toolbox,功能全面,如imread讀圖像、imfilter降噪)、Python(OpenCV庫,cv2.imread讀圖像、cv2.threshold閾值分割)、matplotlib(用于圖像顯示和簡單處理)。