【数学建模】数学建模应掌握的十类算法
前言
数学建模的核心是 “用算法解决实际问题”,以下十类算法覆盖了竞赛中 90% 以上的场景。下面将从 “算法本质 + 适用场景 + 核心优势 + 简单案例” 四个维度展开,帮你快速理解并落地使用。
数学建模竞赛官网
1. 全国大学生数学建模竞赛官网
2. 美国大学生数学建模竞赛官网
3. Matlab 网站
4. 研究生数学建模竞赛官网
数学建模应掌握的十类算法
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参数估计),重点选择 “拟合优度 R²” 最高的模型(R² 越接近 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)=x²+y² 在 x∈[0,5]、y∈[0,5] 的最小值 —— 用网格算法取 x=0,1,2,3,4,5(6 个点),y 同理,计算 36 个点的函数值,最小的就是近似最优解(实际最优解在 (0,0),函数值 0)。
注意事项:变量多或范围大时,计算量会 “爆炸”(如 3 个变量各取 100 个点,总次数 100³=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)=x³-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(用于图像显示和简单处理)。