尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

数学建模算法实战指南:从问题分类到Python代码实现

数学建模算法实战指南:从问题分类到Python代码实现 1. 项目概述为什么我们需要一份“活”的算法总结干了这么多年数学建模带过不少队伍也审过很多论文我发现一个特别普遍的现象很多同学尤其是刚接触建模的朋友手里攒了一堆算法代码Matlab的、Python的网盘里几个G但真到了比赛那三天面对一个全新的问题还是不知道从何下手。要么是“手里有锤子看什么都像钉子”硬套一个高级算法结果模型复杂、求解困难、解释不清要么就是面对几个看似都沾边的算法反复纠结浪费了大量宝贵时间。这就是我写这个系列总结的初衷。它不是一个简单的算法列表也不是一本冰冷的代码手册。我想做的是帮你建立一套“算法选择与应用的思维框架”。核心就两点第一这个算法到底能解决什么类型的问题它的“舒适区”和“雷区”在哪里第二在具体场景下代码怎么写才能又快又稳避免那些教科书里不会提的“坑”简单说这份总结的目标是让你手里的算法“活”起来。当看到“优化路径”、“预测趋势”、“分类识别”这些关键词时你能立刻联想到一个清晰的决策树知道该用什么算法以及如何用代码快速实现它。我们这次先从最基础、应用最广的几个算法类别开始结合具体的应用场景和可运行的代码把地基打牢。2. 算法应用场景的深度解析从问题到算法的映射很多教材和资料习惯按算法原理分类比如“启发式算法”、“统计学习算法”等。但对于建模实战我更倾向于从“问题类型”出发进行反向匹配。这是一种更贴近实战的思考方式。2.1 预测类问题趋势外推与关系挖掘预测问题是数学建模竞赛的常客比如预测销量、预测人口、预测气候变化等。这类问题的核心是“基于已知推断未知”。典型场景时间序列预测数据按时间顺序排列如股票价格、月度销售额、每日气温。目标是预测未来时间点的值。回归分析预测探究一个或多个变量自变量与另一个变量因变量之间的定量关系。比如根据广告投入、促销力度预测产品销量。算法选择逻辑数据特征初判首先画图绘制数据的时间序列图或散点图。如果数据随时间呈现明显的趋势上升/下降和/或周期性波动优先考虑时间序列模型。模型复杂度权衡若趋势明显且关系近似线性线性回归是首选。它简单、可解释性强是可靠的基线模型。千万不要因为它简单而轻视它一个解释清晰的线性模型远胜于一个黑箱般复杂的模型。若存在时间依赖即当前值受过去值影响必须使用时间序列模型。ARIMA模型是经典它综合了自回归(AR)、差分(I)和移动平均(MA)能处理趋势和季节性。若变量间关系复杂非线性可以考虑多项式回归、支持向量回归(SVR)或简单的神经网络。但要注意复杂度上升会带来过拟合风险需要更多数据支撑和严谨的验证。注意预测类问题最忌讳“唯R²论”。高拟合优度不代表模型好。一定要用历史数据分割如80%训练20%测试或时间序列交叉验证来评估模型在“未见数据”上的表现。预测未来本质是泛化能力。2.2 优化类问题在约束下寻找最优解“最大利润”、“最小成本”、“最短路径”、“最优分配”这些关键词一出现基本就锁定了优化问题。优化问题的三要素是决策变量、目标函数、约束条件。典型场景路径规划快递配送、旅行商问题(TSP)、AGV调度。资源分配生产计划、投资组合、人员排班。参数调优机器学习模型超参数寻优、工程设计。算法选择逻辑问题规模与性质小规模、线性、凸优化如果目标函数和约束都是线性的直接用线性规划(LP)单纯形法求解效率极高。如果是凸二次规划也有成熟算法。组合优化、离散决策如TSP、背包问题决策变量是整数0-1规划、整数规划。这类问题通常是NP-Hard的。对于中小规模可以尝试分支定界法求精确解对于大规模必须转向启发式算法。启发式与元启发式算法当问题复杂、规模大、难以用传统数学规划方法求解时就是启发式算法的舞台。贪心算法快速得到可行解但往往不是最优。适合做初始解或对最优性要求不高的场景。A*算法在路径规划中堪称经典。它结合了Dijkstra算法保证最优和贪心算法速度快通过启发式函数如曼哈顿距离、欧氏距离引导搜索方向在已知地图信息的静态路径规划中极其高效。这也是为什么“三条AGV基本A*算法”会成为热词它在自动化仓储、机器人导航中应用太广了。现代元启发式算法遗传算法(GA)、模拟退火(SA)、粒子群优化(PSO)以及热词中提到的改进鲸鱼算法。这类算法模仿自然现象通过种群迭代、概率突跳等方式在解空间进行“全局搜索”特别适合处理多峰、非凸、高维的复杂优化问题。选择时GA擅长并行搜索、SA擅长局部逃离、PSO收敛快但可能早熟需要根据问题特性选择。2.3 评价与决策类问题量化与排序这类问题不是预测一个具体值也不是找最优解而是对多个对象方案、企业、城市进行综合评价或排序。典型场景综合评价评价各省份高质量发展水平、大学排名、投资项目风险评级。方案选优从多个设计方案、政策方案中选出最佳。算法选择逻辑指标权重的确定这是评价的核心。主观赋权法如层次分析法AHP能融入专家经验但受主观性影响客观赋权法如熵权法、CRITIC法完全基于数据波动但可能违背常识。实战中常主客观结合比如用AHP确定大类权重用熵权法确定内部具体指标权重。数据标准化不同指标量纲和数量级不同必须标准化。常用方法有极差标准化、Z-score标准化。注意标准化方法会影响最终结果。合成模型选择线性加权综合法最常用假设指标间可线性补偿。TOPSIS法逼近理想解排序法计算每个方案与理想最优解和最劣解的距离相对贴近度作为评价依据。概念直观应用广泛。模糊综合评价当评价本身存在模糊性如“环境很好”、“成本较高”时使用。2.4 分类与聚类类问题发现数据中的结构分类有标签和聚类无标签是数据挖掘和机器学习在建模中渗透最广的领域。典型场景分类信用评级好/坏客户、疾病诊断是/否患病、图像识别。聚类客户细分、异常检测、新闻主题分类。算法选择逻辑数据量与特征维度数据量小、特征少时K近邻(KNN)、决策树、朴素贝叶斯是不错的起点简单有效。数据量大、特征多时需要考虑计算效率和泛化能力。支持向量机(SVM)在小样本、高维分类中表现优异但核函数选择需要技巧。随机森林作为集成算法能有效防止过拟合是当前非常稳健的选择。可解释性要求如果模型需要向评委解释如“哪些因素导致了这个分类结果”那么决策树及其衍生的随机森林可以通过特征重要性进行解释比“黑箱”般的深层神经网络更合适。聚类算法选择最经典的是K-Means但它需要预先指定簇数K且对异常值和初始中心点敏感。DBSCAN不需要指定K能发现任意形状的簇并对噪声鲁棒适用于空间数据聚类。3. 核心算法代码实现与避坑指南Python版理论说得再多不如一行代码。这里我用Python因其在建模中生态最丰富展示几个核心算法的实现并附上我踩过坑才总结出的“实操心得”。3.1 时间序列预测ARIMA模型实战ARIMA模型是时间序列预测的基石但参数(p,d,q)选择让很多人头疼。import pandas as pd import numpy as np import matplotlib.pyplot as plt from statsmodels.tsa.stattools import adfuller from statsmodels.graphics.tsaplots import plot_acf, plot_pacf from statsmodels.tsa.arima.model import ARIMA import warnings warnings.filterwarnings(ignore) # 1. 数据准备与平稳性检验 # 假设df有一个‘value’列索引是时间DatetimeIndex # 绘制原始序列 df[value].plot(title原始时间序列) plt.show() # ADF检验单位根检验 result adfuller(df[value]) print(ADF Statistic: %f % result[0]) print(p-value: %f % result[1]) # 如果p-value 0.05序列不平稳需要差分 if result[1] 0.05: df[value_diff] df[value].diff().dropna() print(原始序列不平稳进行一阶差分。) # 对差分后序列再次进行ADF检验... else: print(原始序列平稳。) # 2. 确定ARIMA的p和q参数 - 观察ACF和PACF图 fig, (ax1, ax2) plt.subplots(2, 1, figsize(12,8)) plot_acf(df[value_diff].dropna(), lags40, axax1) # 观察截尾处确定q plot_pacf(df[value_diff].dropna(), lags40, axax2) # 观察截尾处确定p plt.show() # ACF拖尾PACF在p阶后截尾 - AR(p) # PACF拖尾ACF在q阶后截尾 - MA(q) # 两者都拖尾 - ARMA(p,q) # 3. 模型拟合与预测 # 假设通过观察我们初步确定 (p,d,q) (1,1,1) model ARIMA(df[value], order(1,1,1)) model_fit model.fit() print(model_fit.summary()) # 查看模型详情关注AIC/BIC系数显著性 # 4. 预测未来n步 forecast_steps 10 forecast_result model_fit.get_forecast(stepsforecast_steps) forecast_values forecast_result.predicted_mean confidence_intervals forecast_result.conf_int() # 置信区间 # 5. 绘制结果 plt.figure(figsize(10,6)) plt.plot(df[value], label历史数据) plt.plot(pd.date_range(startdf.index[-1], periodsforecast_steps1, freqM)[1:], forecast_values, label预测值, colorred) plt.fill_between(pd.date_range(startdf.index[-1], periodsforecast_steps1, freqM)[1:], confidence_intervals.iloc[:,0], confidence_intervals.iloc[:,1], colorpink, alpha0.3, label95%置信区间) plt.legend() plt.title(ARIMA模型预测结果) plt.show()实操心得与避坑指南平稳性是前提ADF检验的p值一定要小于0.05或0.01才能认为序列平稳。不平稳的序列做ARIMA预测毫无意义。差分是常用手段但差分次数d不宜过大通常1-2次即可。看图定参是艺术ACF/PACF图是确定p和q的主要工具但现实数据很少完美符合理论“截尾”。更可靠的方法是网格搜索配合AIC/BIC准则。写一个循环遍历p、q的可能组合如0到3选择AIC或BIC最小的模型。AIC倾向于选择更复杂的模型BIC对复杂度惩罚更重。模型诊断不可少拟合后一定要检查残差model_fit.resid是否是白噪声均值为0、无自相关。可以用plot_acf画残差的ACF图如果大部分滞后都在置信区间内说明模型拟合得不错。置信区间的意义预测结果一定要带上置信区间。它告诉你预测的不确定性范围。随着预测步长增加这个区间会迅速变宽这意味着长期预测的可靠性很低。在论文中展示这个区间是专业性的体现。3.2 路径规划A*算法代码精讲A*算法是解决静态环境最短路径问题的利器。理解其代码实现比单纯调用库更能加深理解。import heapq import matplotlib.pyplot as plt class Node: 定义网格节点 def __init__(self, parentNone, positionNone): self.parent parent self.position position # (x, y) self.g 0 # 从起点到当前节点的实际代价 self.h 0 # 当前节点到终点的启发式估计代价曼哈顿距离/欧氏距离 self.f 0 # 总代价 f g h def __eq__(self, other): return self.position other.position def __lt__(self, other): return self.f other.f # 用于优先队列排序 def astar(maze, start, end): A*算法主函数 maze: 二维列表0表示可通行1表示障碍物 start, end: 元组 (x, y) # 创建起始节点和终点节点 start_node Node(None, start) end_node Node(None, end) # 初始化开放列表待探索和关闭列表已探索 open_list [] closed_list set() # 将起点加入开放列表 heapq.heappush(open_list, start_node) # 定义四个移动方向上下左右 directions [(0, -1), (0, 1), (-1, 0), (1, 0)] # 循环直到找到路径或开放列表为空 while open_list: # 弹出f值最小的节点当前最优节点 current_node heapq.heappop(open_list) closed_list.add(current_node.position) # 找到终点回溯路径 if current_node end_node: path [] current current_node while current is not None: path.append(current.position) current current.parent return path[::-1] # 返回反转的路径从起点到终点 # 生成邻居节点 children [] for new_direction in directions: node_position (current_node.position[0] new_direction[0], current_node.position[1] new_direction[1]) # 检查边界 if (node_position[0] (len(maze) - 1) or node_position[0] 0 or node_position[1] (len(maze[0]) -1) or node_position[1] 0): continue # 检查障碍物 if maze[node_position[0]][node_position[1]] ! 0: continue new_node Node(current_node, node_position) children.append(new_node) # 遍历所有邻居 for child in children: # 如果邻居已在关闭列表跳过 if child.position in closed_list: continue # 计算g, h, f值 child.g current_node.g 1 # 假设每步代价为1 # 使用曼哈顿距离作为启发函数 child.h abs(child.position[0] - end_node.position[0]) abs(child.position[1] - end_node.position[1]) child.f child.g child.h # 如果邻居已在开放列表中且新的g值更高跳过 # 这里需要遍历开放列表检查是A*实现中一个可以优化的点通常用字典记录节点和其g值 found_in_open False for open_node in open_list: if child open_node and child.g open_node.g: found_in_open True break if found_in_open: continue # 将邻居加入开放列表 heapq.heappush(open_list, child) # 开放列表为空未找到路径 return None # 示例创建一个10x10的网格并设置障碍物 maze [ [0, 0, 0, 0, 1, 0, 0, 0, 0, 0], [0, 1, 1, 0, 1, 0, 1, 1, 1, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 1, 1, 1, 1, 1, 0, 1, 1], [0, 0, 0, 0, 0, 0, 1, 0, 0, 0], [0, 1, 1, 1, 1, 0, 1, 1, 1, 0], [0, 1, 0, 0, 0, 0, 0, 0, 1, 0], [0, 1, 0, 1, 1, 1, 1, 0, 1, 0], [0, 0, 0, 0, 0, 0, 0, 0, 1, 0], [0, 1, 1, 1, 1, 1, 1, 1, 1, 0] ] start (0, 0) end (9, 9) path astar(maze, start, end) print(找到的路径, path) # 可视化 if path: plt.figure(figsize(8,8)) plt.imshow(maze, cmapbinary, originupper) # 绘制网格 plt.plot([p[1] for p in path], [p[0] for p in path], colorred, linewidth2, labelA* Path) # 注意坐标转换 plt.scatter(start[1], start[0], colorgreen, s200, markers, labelStart) plt.scatter(end[1], end[0], colorblue, s200, markero, labelEnd) plt.legend() plt.title(A* Algorithm Pathfinding) plt.axis(off) plt.show() else: print(未找到可行路径)实操心得与避坑指南启发函数h(n)是关键它决定了A的搜索效率。曼哈顿距离适用于只能上下左右移动的网格欧氏距离直线距离适用于可以斜向移动的场景。h(n)必须永远不大于从当前节点到终点的实际代价否则A不能保证找到最优解。曼哈顿和欧氏距离都满足这个条件可采纳性。开放列表的数据结构使用优先队列Python的heapq来维护开放列表确保每次都能以O(log N)的复杂度取出f值最小的节点这是算法高效的核心。如果使用普通列表每次查找最小节点都需要O(N)的遍历在大地图上会非常慢。处理已探索节点closed_list使用集合set来存储已探索节点的坐标查找效率为O(1)。检查child.position in closed_list比遍历列表快得多。路径权值上面的代码假设每一步代价为1child.g current_node.g 1。在实际应用中比如地形有坡度、不同道路有不同通行成本这里的“1”应该替换为从current_node到child的实际代价cost。性能与优化对于非常大的地图标准的A可能仍然较慢。可以考虑的优化有双向A从起点和终点同时搜索、Jump Point Search用于均匀网格的优化算法、或者使用更复杂的启发函数。3.3 综合评价熵权法TOPSIS代码实现熵权法是一种客观赋权法TOPSIS用于排序两者结合是评价类问题的经典组合拳。import numpy as np import pandas as pd def entropy_weight(data): 熵权法计算权重 data: DataFrame每一行是一个评价对象每一列是一个评价指标。 默认所有指标均为正向指标越大越好。 # 1. 数据标准化 (避免log0) data data.astype(float) data_normalized data / data.sum(axis0) # 比重标准化 # 2. 计算信息熵 k 1 / np.log(len(data)) # 常数k # 避免log(0)将0值替换为一个极小值 data_normalized data_normalized.replace(0, 1e-10) entropy -k * (data_normalized * np.log(data_normalized)).sum(axis0) # 3. 计算差异系数和权重 diversity 1 - entropy weight diversity / diversity.sum() return weight, entropy def topsis(data, weight, positive_indicesNone, negative_indicesNone): TOPSIS法进行综合评价排序 data: 原始数据DataFrame (m个对象, n个指标) weight: 权重数组长度n positive_indices: 正向指标列的索引列表从0开始越大越好 negative_indices: 负向指标列的索引列表越小越好 如果未指定则默认所有指标为正向。 # 1. 向量归一化消除量纲 norm_data data / np.sqrt((data ** 2).sum(axis0)) # 2. 构造加权规范矩阵 weighted_norm norm_data * weight # 3. 确定正理想解和负理想解 # 默认所有指标为正向 if positive_indices is None and negative_indices is None: positive_indices list(range(data.shape[1])) negative_indices [] elif positive_indices is None: positive_indices [i for i in range(data.shape[1]) if i not in negative_indices] elif negative_indices is None: negative_indices [i for i in range(data.shape[1]) if i not in positive_indices] ideal_best np.zeros(data.shape[1]) ideal_worst np.zeros(data.shape[1]) for i in range(data.shape[1]): if i in positive_indices: ideal_best[i] weighted_norm.iloc[:, i].max() ideal_worst[i] weighted_norm.iloc[:, i].min() elif i in negative_indices: ideal_best[i] weighted_norm.iloc[:, i].min() ideal_worst[i] weighted_norm.iloc[:, i].max() # 4. 计算各方案到正/负理想解的距离 dist_best np.sqrt(((weighted_norm - ideal_best) ** 2).sum(axis1)) dist_worst np.sqrt(((weighted_norm - ideal_worst) ** 2).sum(axis1)) # 5. 计算相对贴近度 score dist_worst / (dist_best dist_worst) # 6. 排序 result_df data.copy() result_df[Dist_Best] dist_best result_df[Dist_Worst] dist_worst result_df[Topsis_Score] score result_df[Rank] score.rank(ascendingFalse, methodmin).astype(int) # 分数越高排名越前 return result_df.sort_values(byRank) # 示例评价5个城市的综合发展水平假设有4个指标 # 指标GDP正向、人均收入正向、失业率负向、PM2.5负向 data pd.DataFrame({ City: [City_A, City_B, City_C, City_D, City_E], GDP: [120, 95, 80, 105, 70], Income: [8.5, 7.2, 6.8, 7.9, 6.0], Unemployment: [3.1, 4.5, 5.2, 3.8, 6.0], PM25: [35, 42, 50, 38, 55] }).set_index(City) # 步骤1计算熵权只对数值指标 numeric_data data[[GDP, Income, Unemployment, PM25]] weights, entropies entropy_weight(numeric_data) print(各指标熵值, entropies.values) print(各指标权重, weights.values) # 步骤2TOPSIS评价 # 指定正向和负向指标索引对应 numeric_data 的列序 positive_idx [0, 1] # GDP, Income 是正向指标 negative_idx [2, 3] # Unemployment, PM25 是负向指标 result topsis(numeric_data, weights.values, positive_idx, negative_idx) print(\nTOPSIS综合评价结果) print(result[[Topsis_Score, Rank]])实操心得与避坑指南数据标准化是第一步也是关键一步熵权法对标准化方法敏感。上述代码使用的是“比重法”每个值除以该列总和这是熵权法的标准做法。TOPSIS内部使用的是“向量归一化”。务必注意在将熵权法求得的权重用于TOPSIS或其他方法时要确保权重对应的数据标准化方式与后续方法匹配。通常流程是原始数据 → (如需) 同向化处理将负向指标转为正向→ 熵权法计算权重使用比重标准化→ TOPSIS计算得分使用向量归一化。权重是基于原始数据分布计算出来的客观属性可以直接用于加权。指标同向化TOPSIS需要明确每个指标是正向还是负向。对于负向指标如成本、污染浓度常见的处理方法是取倒数(1/x)或使用max(x) - x进行正向化然后再进行标准化和计算。在上面的代码中我们通过positive_indices和negative_indices参数在计算距离时区分这是一种更清晰的方式避免了提前修改原始数据。熵权法的局限性熵权法完全依赖数据本身的离散程度。如果某个指标在所有评价对象上数值几乎一样离散度极低其熵会接近1权重就接近0。这有时是合理的该指标无区分度但有时可能与实际重要性不符。因此纯客观的熵权法最好与主观赋权法如AHP结合使用例如用加权平均法综合主客观权重。贴近度C的取值范围C dist_worst / (dist_best dist_worst)其值在0到1之间。越接近1说明离正理想解越近方案越优。结果解释时要清晰说明这一点。4. 建模实战中的常见问题与排查技巧理论懂了代码会写了但在72小时的比赛高压下依然会碰到各种诡异的问题。下面是我总结的一些高频“坑点”和应对策略。4.1 算法跑不出结果或结果离谱问题现象程序运行很久不结束或者最终结果明显不合理比如预测值全是NaN优化结果违反常识。排查思路数据检查这是第一步也是最重要的一步。用df.info()、df.describe()、df.isnull().sum()快速查看数据基本信息、统计量、缺失值。缺失值必须处理删除或填充异常值要甄别。对于时间序列检查日期索引是否连续、是否有序。参数初始化很多优化算法如遗传算法、模拟退火对初始参数敏感。如果结果不稳定尝试多次运行取平均或者调整种群大小、变异概率、初始温度等参数。收敛性判断迭代算法要设置合理的停止条件。比如遗传算法设置最大迭代次数和适应度阈值ARIMA模型通过AIC/BIC判断。在代码中增加迭代过程输出绘制适应度曲线或损失函数下降曲线直观判断是否收敛。数学可行性检查你的模型假设是否被数据严重违反。例如用线性回归拟合明显指数增长的数据结果肯定不好。先画散点图观察关系。4.2 模型过拟合与泛化能力不足问题现象在训练数据上表现完美R²高达0.99但在测试数据或新数据上表现糟糕。解决方案坚持训练-测试集分割拿到数据第一件事就是按比例如7:3或8:2随机分割出测试集并且在整个建模过程中绝不偷看测试集。测试集只用于最终评估。使用交叉验证对于数据量不大的情况使用K折交叉验证能更稳健地评估模型性能。sklearn.model_selection中的cross_val_score非常方便。简化模型增加数据量不现实时主动降低模型复杂度是抵抗过拟合最有效的手段。在回归中减少多项式次数在树模型中剪枝、限制树深在神经网络中减少层数和神经元、加入Dropout。引入正则化在损失函数中加入模型复杂度的惩罚项如L1正则化-Lasso L2正则化-Ridge。这能迫使模型在拟合数据和保持简单之间找到平衡。4.3 算法运行效率低下问题现象代码运行缓慢尤其是处理大规模数据或复杂优化时等待时间无法接受。优化策略算法层面选择时间复杂度更低的算法。例如排序大量数据时快速排序比冒泡排序快得多。求解线性规划使用成熟的求解器如PuLP调用CBC或cvxopt比自己写单纯形法快。代码层面向量化操作摒弃Python原生循环尽量使用NumPy/Pandas的向量化运算。np.dot(),df.apply()通常比for循环快几个数量级。避免不必要的复制操作大型DataFrame时使用.loc,.iloc进行索引赋值而不是创建中间副本。使用高效的数据结构频繁查找成员用set维护有序集合用heapq。工具层面使用JIT编译器对于数值计算密集的循环可以尝试Numba库它能将Python函数即时编译为机器码大幅提升速度。并行计算如果算法可以并行如遗传算法中种群评估使用multiprocessing或joblib库进行多进程并行。4.4 结果的可解释性与论文表达数学建模竞赛结果和模型本身一样重要。一个无法解释的“黑箱”模型即使预测准确也很难获得高分。提升可解释性特征重要性对于树模型随机森林、XGBoost直接输出特征重要性排序。对于线性模型查看系数大小和正负。敏感性分析在优化或评价模型中有意识地改变某个关键参数比如权重、约束条件观察结果如何变化。用图表展示这种变化关系能极大地增强论文说服力。可视化可视化再可视化路径规划画出路径图预测问题画出拟合曲线和预测区间聚类问题画出散点图并用颜色区分簇。一图胜千言。论文表达技巧说清逻辑链在论文中你的思考过程应该是“问题分析 → 选择该算法的理由 → 算法关键步骤简述 → 结果展示与分析”。避免直接堆砌公式和代码。突出创新点如果你对经典算法做了哪怕微小的改进比如改进了A*的启发函数或者结合了主客观赋权法一定要清晰、突出地说明你改了什么、为什么改、改之后效果提升了多少用数据对比。诚实讨论局限性没有完美的模型。在结论部分客观指出你模型的假设、适用范围和不足之处并提出可能的改进方向。这体现了严谨的科学态度。
返回列表