1. 从“拯救大象”到“重构生态”美赛B题的解题思维跃迁每年美赛的B题总能在数学建模圈子里掀起一阵讨论热潮。2023年的B题题目直指肯尼亚马赛马拉国家保护区的野生动物管理与旅游可持续发展问题。乍一看这又是一个典型的“资源分配-冲突协调”型题目很多队伍会下意识地套用线性规划、多目标优化或者博弈论的框架。但如果你只做到这一步很可能就与Outstanding奖失之交臂了。这道题的精髓恰恰藏在“重构”二字里——它要求的不是对现有系统的修修补补而是基于数据和模型对保护区的人、动物、土地关系进行一次系统性、前瞻性的再设计。我当年带队时第一眼就被这个“重构”吸引了。我们意识到评委想看到的不是又一个“最优巡逻路线”或“游客承载量计算”而是一个能够自洽、可持续且具备韧性的生态-经济系统动态模型。这意味着我们必须跳出单一的“保护 vs. 发展”的二元对立思维将保护区视为一个复杂的自适应系统其中野生动物种群动态、非法偷猎压力、旅游业经济收益、当地社区生计以及气候变化影响等多个子系统相互耦合、彼此反馈。我们的核心思路是以“生态承载力”和“社区福祉”为双基石构建一个多层级的智能体模拟模型并耦合一个用于长期策略评估的优化框架。简单说就是用MATLAB搭建一个“数字马赛马拉”在这个虚拟世界里模拟各种政策如改变游览区划分、调整门票分成、引入社区监测实施后未来20年的演变情况然后从中找出能让整个系统走向良性循环的“杠杆解”。下文我将详细拆解我们当时构建的模型框架、关键算法实现以及那些决定成败的建模细节和MATLAB编程技巧。无论你是准备冲击未来美赛还是对复杂系统建模感兴趣相信这些从实战中沉淀下来的思路和代码都能给你带来启发。2. 模型内核一个耦合了生态与经济的智能体模拟系统我们的模型主体是一个基于智能体的模拟模型。为什么选择ABMAgent-Based Modeling因为保护区系统里的核心参与者——动物种群、偷猎者、游客、保护区管理员、当地社区——各有其行为规则和目标它们之间的局部互动会涌现出全局模式。用微分方程虽然简洁但很难刻画这种异质性和空间显式的交互。2.1 核心智能体定义与交互规则我们定义了五类智能体每一类都有其属性和行为规则库。1. 野生动物种群智能体以大象为例属性种群数量、年龄结构幼年、成年、性别比、空间分布网格坐标、健康状态、迁移记忆对水源、食物的路径熟悉度。行为规则日常移动基于“感知-决策”模型。每个时间步代表一个月智能体会感知周围网格的植被丰度、水源距离、人类活动强度游客偷猎者。决策函数是一个加权和移动倾向 w1*食物吸引力 w2*水源吸引力 - w3*人类干扰惩罚。权重w1, w2, w3可以通过历史数据或文献校准。种群动态每月按一定的出生率和死亡率更新数量。关键点死亡率与偷猎压力、食物压力种群密度相关以及应激水平与游客遭遇频率相关挂钩。我们引入了“慢性应激”累积变量频繁暴露于旅游车辆会导致该值升高进而提升死亡率、降低出生率。空间记忆为模拟大象的真实迁徙我们为种群智能体添加了“记忆网格”记录历史上在不同季节于不同区域找到食物/水的成功经验。这避免了随机游走的幼稚行为使模拟更真实。2. 偷猎者智能体属性数量动态变化、装备水平、风险偏好、空间位置、对执法力量的感知。行为规则决策入行偷猎者数量并非固定。我们建立了一个简单的经济学模型当地社区个体是否选择偷猎取决于其“预期收益”象牙黑市价格 × 成功概率与“预期成本”被捕惩罚 × 被捕概率 道德成本之差再与从事旅游业等合法工作的收入对比。这是一个基于收益差的概率函数。狩猎行为偷猎者会向大象种群密度高、执法巡逻密度低的区域移动。他们的搜索算法借鉴了“粒子群”的思想既有向历史高收益区域的趋向性也有随机探索。与执法的博弈偷猎者有一个“风险感知”值。当保护区增加巡逻频次或提升破案率模型中体现为巡逻智能体的“探测半径”和“逮捕概率”偷猎者的风险感知上升其活动会变得更为谨慎或直接退出。3. 游客智能体属性游客类型摄影爱好者、普通观光、科考、数量随时间/季节波动、满意度、消费能力。行为规则游览路径游客沿着预设的游览路线road network移动但其“观赏体验”取决于沿途看到动物的数量和距离。我们使用一个视野锥模型来判断游客是否“看到”动物。满意度与消费满意度是一个动态变量与看到动物的次数、种类、距离以及拥挤程度遇到其他游客车辆数负相关。满意度直接影响其人均消费纪念品、住宿升级等和重游意愿影响未来的游客数量预测。4. 保护区管理员智能体属性预算、巡逻队数量与位置、执法效率、基础设施建设与维护状态。行为规则预算分配每月管理员根据模型模拟的“上一阶段绩效”如偷猎事件数、游客总收入、大象种群趋势来动态调整预算分配。分配方向包括增加巡逻、投资社区共享项目、修复游览道路、开展反偷猎宣传。这里我们嵌入了一个强化学习的雏形管理员尝试不同的分配策略并根据系统反馈一个综合评分来学习。巡逻调度巡逻队的路径不是固定的。我们将其建模为一个动态覆盖问题。巡逻队会优先前往偷猎风险预测高的区域根据偷猎者智能体活动热力图生成和象群活动的敏感区域如繁殖地。这使用了结合了先验信息的改进型蚁群算法进行每月路径规划。5. 当地社区智能体属性人口、平均收入、对保护区的态度支持/中立/反对、从旅游业或偷猎中获利的比例。行为规则收入与态度社区的整体收入来源于模型计算的旅游业分成门票收入的一部分和非法的偷猎收益。总收入水平和对保护区的态度相互影响。态度越支持其成员成为偷猎者的概率基础值越低且更可能参与志愿监测为巡逻队提供信息这会在模型中提高巡逻队的“探测效率”。动态反馈这是模型的关键反馈环之一。保护区的政策如提高门票分成比例直接影响社区收入进而改变其态度再反过来影响偷猎压力和巡逻效率最终又作用于大象种群和旅游业。2.2 模型耦合与运行流程这五类智能体在一个共享的地理网格环境中交互。每个网格有属性植被类型、海拔、水源距离、道路网络、土地类型核心区、缓冲区、旅游区等。模型的月度运行流程如下环境更新根据季节更新各网格的植被丰度旱季/雨季。动物行为各大象种群根据规则移动、觅食、繁殖、死亡。偷猎事件偷猎者智能体搜索并尝试猎杀大象成功与否取决于距离、装备、大象的警觉状态与人类干扰相关以及巡逻队是否在附近。旅游模拟游客智能体沿路线移动生成“观测事件”计算满意度及消费。管理决策计算本月各项指标旅游收入、偷猎数、大象数量变化管理员智能体根据规则调整下月预算分配和巡逻方案。社区动态根据本月旅游分成和偷猎收益更新社区平均收入和整体态度。数据记录记录所有关键指标的时间序列数据。这个ABM模型是我们整个方案的“仿真引擎”用于评估在给定政策参数下系统长期的、动态的演变结果。3. 从仿真到优化寻找系统重构的“帕累托前沿”ABM可以模拟单一策略的效果但题目要求“重构”即从无数种可能的政策组合中找到较优的那些。这就需要优化算法。我们的策略是将ABM作为目标函数评估器嵌入一个多目标优化框架中。3.1 决策变量与目标函数我们定义了三个核心的、可调控的“政策杠杆”作为决策变量空间分区比例 (x1)核心保护区严格禁入、生态旅游区、缓冲区允许有限社区活动三者面积占总面积的比例。这决定了人类与动物活动空间的重叠度。收益分配比例 (x2)门票总收入中分配给社区发展基金的比例。直接影响社区收入和态度。执法投入强度 (x3)每月预算中用于巡逻、监控技术的比例。影响偷猎成功率和偷猎者风险感知。我们需要同时优化三个目标多目标优化f1: 生态目标模拟期20年末的大象种群数量与初始数量的比值最大化。f2: 经济目标模拟期内累计的旅游业净收入最大化。净收入需扣除管理、巡逻、社区分成等成本。f3: 社会目标模拟期内社区平均态度的均值最大化我们将态度量化为-1到1的连续值。显然这三个目标相互冲突。增加核心区面积(x1)可能保护大象但减少旅游收入提高社区分成(x2)可能减少偷猎但降低保护区直接收入增加执法投入(x3)增加成本但保护大象。不存在一个“最好”的解而是一系列“非劣解”帕累托最优解集。3.2 优化算法选择与MATLAB实现我们选择了NSGA-II (Non-dominated Sorting Genetic Algorithm II)这一经典的多目标进化算法。它非常适合处理我们的问题决策变量是连续或离散的目标函数没有解析形式需要跑一遍耗时的ABM仿真且需要得到一组分布均匀的帕累托解。在MATLAB中我们没有使用全局优化工具箱自带的gamultiobj虽然它实现了NSGA-II因为我们需要深度定制染色体编码、目标函数计算以及约束处理。我们选择自己实现核心循环灵活性更高。关键实现步骤初始化种群popSize 100; % 种群大小 nVar 3; % 决策变量数 lowerBound [0.2, 0.05, 0.1]; % [x1_min, x2_min, x3_min] upperBound [0.7, 0.3, 0.4]; % [x1_max, x2_max, x3_max] % 生成初始种群实数编码 population rand(popSize, nVar) .* (upperBound - lowerBound) lowerBound;每个个体一行就是一组(x1, x2, x3)政策组合。目标函数评估最耗时的部分function [f1, f2, f3] evaluatePolicy(policy, abmModelParams) % policy: 一个包含x1, x2, x3的向量 % abmModelParams: ABM模型的其他固定参数 % 1. 根据policy设置ABM模型的初始条件 setZoneRatio(policy(1)); % 设置分区比例 setRevenueShare(policy(2)); % 设置社区分成 setPatrolBudgetRatio(policy(3)); % 设置执法投入比例 % 2. 运行ABM仿真例如240个月20年 % 这是一个封装好的函数内部是第2章描述的月度循环 [elephantTrend, tourismRevenue, communityAttitude] runABMSimulation(240, abmModelParams); % 3. 从仿真结果中计算三个目标值 f1 elephantTrend(end) / elephantTrend(1); % 种群数量比 f2 sum(tourismRevenue); % 累计旅游净收入仿真中已计算净收入 f3 mean(communityAttitude); % 平均社区态度 % 注意实际中runABMSimulation非常耗时。我们采用了并行计算和代理模型来加速。 end非支配排序与拥挤度计算 这是NSGA-II的核心。我们实现了nonDominatedSorting和crowdingDistance函数。对种群中每个个体计算它被多少其他个体支配在所有目标上都差以及支配多少其他个体。根据支配关系进行分层排序。在同一层内再根据个体在目标空间中的“拥挤度”与相邻个体的距离进行排序以保证解集的多样性。选择、交叉、变异% 选择使用二元锦标赛选择优先选层级高rank小的同层级选拥挤度大的。 parents tournamentSelection(population, fitness, popSize/2); % 交叉模拟二进制交叉SBX适用于实数编码。 offspring sbxCrossover(parents, crossoverProb, distributionIndex); % 变异多项式变异。 offspring polyMutation(offspring, mutationProb, distributionIndex);精英保留 将父代和子代合并对这个更大的集合进行非支配排序和拥挤度计算然后选出前popSize个最优的个体作为下一代种群。循环与终止 重复步骤2-5直到达到最大代数例如100代或目标函数收敛。一个重要的加速技巧代理模型Surrogate Model直接为每一代100个个体都运行240个月的ABM仿真即使并行时间成本也无法接受。我们的策略是第一阶段探索在优化开始时用拉丁超立方采样方法生成200-300个政策样本点并运行完整的ABM仿真。用这些数据训练一个Kriging高斯过程代理模型。这个模型可以快速预测任意政策(x1,x2,x3)对应的(f1,f2,f3)。第二阶段优化在NSGA-II的主循环中目标函数评估不再调用耗时的runABMSimulation而是调用训练好的Kriging代理模型进行预测。这使迭代速度提升数百倍。第三阶段精炼在NSGA-II找到近似帕累托前沿后我们从前沿上选择几十个有代表性的解再运行完整的ABM仿真进行精确评估并据此更新代理模型。这个过程可以迭代一两次以确保最终结果的可靠性。在MATLAB中我们使用fitrgp函数Statistics and Machine Learning Toolbox来拟合高斯过程回归模型作为我们的Kriging代理模型。4. 结果可视化与策略解读从数据到洞察优化算法运行完毕后我们会得到一组帕累托最优解集每个解对应一套(x1, x2, x3)政策和其预测的(f1, f2, f3)目标值。如何解读这些结果并提炼出可执行的“重构”建议是论文出彩的关键。4.1 多维数据可视化三维帕累托前沿散点图figure; scatter3(F(:,1), F(:,2), F(:,3), 40, filled, MarkerFaceAlpha, 0.6); xlabel(大象种群增长比 (f1)); ylabel(累计旅游净收入 (f2)); zlabel(社区平均态度 (f3)); title(马赛马拉保护区管理策略的帕累托最优前沿); grid on; rotate3d on;这张图直观展示了三个目标之间的权衡关系。你会发现没有解能在三个方面都做到最好。点云构成了一个曲面决策者需要在这个曲面上根据自己的偏好进行选择。平行坐标图 对于高维决策空间平行坐标图非常有用。它将每个解的政策变量和目标变量用一条折线表示。% 假设X是决策变量矩阵F是目标值矩阵 data [X, F]; % 合并决策变量和目标变量 figure; parallelcoords(data, Group, ones(size(data,1),1)); % 暂时不分组 xticklabels({核心区比例(x1),社区分成(x2),执法投入(x3),生态目标(f1),经济目标(f2),社会目标(f3)}); title(策略解集的平行坐标图);通过观察线条的走向可以分析出哪些变量组合倾向于产生哪些类型的结果例如高x2和x3的线其f1和f3往往较高但f2可能较低。决策空间到目标空间的映射热图 我们固定其中一个决策变量如x2社区分成绘制另外两个决策变量(x1, x3)与某个目标f1的关系热图。这能清晰展示政策杠杆如何影响单一目标。% 假设我们有一组在x20.15时采集的网格化数据 [X1g, X3g] meshgrid(linspace(0.2,0.7,50), linspace(0.1,0.4,50)); F1g griddata(x1_subset, x3_subset, f1_subset, X1g, X3g); % 插值 figure; contourf(X1g, X3g, F1g, 20, LineStyle, none); colorbar; xlabel(核心区比例 (x1)); ylabel(执法投入比例 (x3)); title(当社区分成x20.15时大象种群增长比(f1)的响应面);4.2 策略聚类与典型方案提炼面对几十上百个帕累托解我们需要归类总结。我们使用K-means聚类算法根据三个目标值(f1, f2, f3)将这些解分成3-4类。[idx, C] kmeans(F, 3); % 将目标空间的数据聚为3类 % C是聚类中心代表了3类典型策略的效果 % idx是每个样本点所属的类别 % 可视化用不同颜色标记不同类别 figure; scatter3(F(:,1), F(:,2), F(:,3), 40, idx, filled); xlabel(f1); ylabel(f2); zlabel(f3); legend(Cluster 1, Cluster 2, Cluster 3);然后我们检查每一类解对应的决策变量(x1, x2, x3)的统计特征均值、范围。这样就可以提炼出几套具有代表性的“重构方案”方案A生态优先型特征是高x155%的核心区、中等偏高x330%的执法投入、x2适中。预测效果大象种群恢复最好f1高但旅游收入一般f2中社区态度中等f3中。适合生态危机时期。方案B平衡发展型特征是x1,x2,x3都处于中等水平。预测效果三个目标都取得不错但不极端的值。这是稳健的长期方案。方案C社区共管型特征是最高x225%的社区分成、中等x1、较低x3。预测效果社区态度最好f3高偷猎因社区参与而减少f1中上旅游收入因社区支持而稳定f2中。适合偷猎压力主要源于贫困社区的地区。4.3 敏感性分析与鲁棒性测试“我们的方案是否可靠”这是评委必问的问题。我们进行了两项关键分析单参数敏感性分析对于选定的“平衡发展型”方案我们单独微调每个政策参数±10%观察目标函数的变化率。在MATLAB中这可以通过中心差分法快速计算。base_policy [0.5, 0.15, 0.25]; delta 0.01; sensitivity zeros(3,3); % 3个参数对3个目标的敏感性 for i 1:3 policy_plus base_policy; policy_minus base_policy; policy_plus(i) policy_plus(i) * (1delta); policy_minus(i) policy_minus(i) * (1-delta); F_plus evaluatePolicyViaSurrogate(policy_plus); % 使用代理模型快速评估 F_minus evaluatePolicyViaSurrogate(policy_minus); sensitivity(i, :) (F_plus - F_minus) / (2 * delta * base_policy(i)); end结果可能显示f1大象种群对x3执法投入最敏感而f2收入对x1核心区比例最敏感。这为政策执行的优先级提供了依据。蒙特卡洛鲁棒性测试考虑到模型参数如大象出生率、象牙黑市价格波动、游客增长率的不确定性我们对这些关键外部参数在其可能范围内进行随机采样例如1000次然后在每次采样下运行我们的推荐方案。统计三个目标值的分布均值、标准差、5%-95%分位数。这能证明我们的方案在不确定环境下依然表现稳定而不是“过拟合”于一组特定参数。5. MATLAB实战关键代码模块与效率陷阱纸上谈兵终觉浅。这套思路的实现对MATLAB编程提出了不低的要求。以下分享几个核心模块的代码片段和那些“踩过坑才懂”的效率优化技巧。5.1 智能体模拟的核心循环结构ABM的主循环不建议用过于面向对象的语法虽然MATLAB支持因为大量智能体对象的属性访问在循环中会极慢。我们采用结构数组Struct of Arrays而非对象数组Array of Objects来存储智能体数据。% 初始化用结构数组存储所有大象智能体属性 numElephants 100; elephants struct(); elephants.id 1:numElephants; elephants.x rand(numElephants, 1) * mapWidth; % x坐标 elephants.y rand(numElephants, 1) * mapHeight; % y坐标 elephants.health ones(numElephants, 1); % 健康值 elephants.age randi([1, 60], numElephants, 1); % 年龄 % ... 其他属性 % 月度循环的主干 for month 1:totalMonths % 1. 环境更新如季节变化 vegetation updateVegetation(vegetation, month); % 2. 动物移动与更新向量化操作避免for循环遍历个体 % 计算每个网格的人类活动强度矩阵运算 humanActivityGrid calculateHumanActivityGrid(tourists, poachers, patrols); % 计算每头象的移动倾向向量化 [foodAttract, waterAttract] getAttraction(elephants.x, elephants.y, vegetation, waterSources); humanPenalty interp2(humanActivityGrid, elephants.x, elephants.y); % 二维插值获取人类干扰 movePropensity w1*foodAttract w2*waterAttract - w3*humanPenalty; % 根据倾向决定移动方向和距离仍可部分向量化 theta 2*pi*rand(numElephants, 1); % 随机方向 moveDist baseSpeed * (1 movePropensity); % 基础速度受倾向影响 elephants.x elephants.x moveDist .* cos(theta); elephants.y elephants.y moveDist .* sin(theta); % 处理边界向量化 elephants.x max(0, min(mapWidth, elephants.x)); elephants.y max(0, min(mapHeight, elephants.y)); % 3. 偷猎事件检测基于距离矩阵避免双重循环 % 计算所有偷猎者与所有大象的距离矩阵 distMatrix pdist2([poachers.x, poachers.y], [elephants.x, elephants.y]); [poacherIdx, elephantIdx] find(distMatrix poachingRange); % 找到在猎杀范围内的配对 % 对每一对根据概率判断是否成功猎杀向量化概率判断 successProb calculatePoachingProb(poachers.risk(poacherIdx), elephants.health(elephantIdx)); success rand(size(poacherIdx)) successProb; % 标记被成功猎杀的大象 killedElephantIdx unique(elephantIdx(success)); elephants.alive(killedElephantIdx) false; % 添加一个alive逻辑数组 % 4. 种群更新出生、自然死亡 % ... 基于当前存活个体数量、年龄结构等计算 % 5. 记录本月数据 record.monthlyElephantCount(month) sum(elephants.alive); record.poachingEvents(month) sum(success); % ... 记录其他数据 end关键技巧尽可能使用矩阵运算和向量化函数如pdist2,interp2避免对智能体进行for循环。将逻辑判断向量化如rand(...) prob。这能将仿真速度提升数十倍。5.2 代理模型Kriging的构建与应用% 假设我们有N个样本点X_train (Nx3矩阵政策参数) Y_train (Nx3矩阵三个目标值) % 为每个目标分别训练一个高斯过程回归模型 gpModels cell(1, 3); for i 1:3 gpModels{i} fitrgp(X_train, Y_train(:,i), ... Basis, constant, ... % 基函数 KernelFunction, ardsquaredexponential, ... % ARD平方指数核能自动学习各维度重要性 Standardize, true, ... % 标准化数据 FitMethod, exact, ... % 精确拟合适用于样本量不大(1000)的情况 PredictMethod, exact); end % 使用代理模型进行快速预测 function F_pred predictWithSurrogate(policy, gpModels) F_pred zeros(1,3); for i 1:3 [F_pred(i), ~] predict(gpModels{i}, policy); end end % 在NSGA-II循环中调用 % 假设offspring是子代种群 for i 1:size(offspring, 1) fitness(i, :) predictWithSurrogate(offspring(i,:), gpModels); end踩坑提醒fitrgp在样本量较大2000或输入维度很高时计算协方差矩阵的逆会非常慢且内存消耗大。此时需考虑使用FitMethod, sd子集近似或PredictMethod, bcd块坐标下降等近似方法。在我们的问题中3个输入变量、几百个样本点使用exact方法是可行的。5.3 并行计算加速仿真评估ABM仿真和代理模型预测是主要的计算瓶颈。MATLAB的并行计算工具箱Parallel Computing Toolbox是救命稻草。% 在初始化优化时对大量样本点进行并行仿真以构建初始代理模型 samplePoints lhsdesign(300, 3); % 拉丁超立方采样300个点 samplePoints samplePoints .* (upperBound - lowerBound) lowerBound; % 缩放到实际范围 % 打开并行池 if isempty(gcp(nocreate)) parpool(local); % 使用本地核心 end % 并行运行仿真 parfor i 1:size(samplePoints, 1) policy samplePoints(i, :); % 注意runABMSimulation必须是一个独立的函数且内部变量不相互依赖 [f1, f2, f3] runABMSimulation(240, policy, otherParams); Y_train(i, :) [f1, f2, f3]; end % 现在有了X_trainsamplePoints, Y_train可以训练代理模型了。 % 在NSGA-II中如果需要对帕累托解进行精确评估精炼阶段同样使用parfor selectedPolicies paretoFrontSolutions; % 从代理模型优化结果中选出的解 exactFitness zeros(size(selectedPolicies, 1), 3); parfor i 1:size(selectedPolicies, 1) exactFitness(i, :) runABMSimulation(240, selectedPolicies(i,:), otherParams); end重要警告使用parfor时必须确保循环体内部的函数是“无状态”的即不修改共享的全局变量。所有输入数据都应在循环开始前定义好。runABMSimulation函数内部应使用传入的参数避免读取或修改外部持久化变量否则会导致数据竞争或错误。5.4 内存管理与预分配长时间运行ABM和优化循环内存管理不当会导致MATLAB越跑越慢。预分配数组在记录时间序列数据如每月大象数量时务必预先分配足够大小的数组。totalMonths 240; monthlyElephantCount zeros(totalMonths, 1); % 预分配 for month 1:totalMonths % ... 计算 monthlyElephantCount(month) currentCount; % 直接赋值而不是动态增长 end清理不必要的大变量在循环中如果生成了大型临时矩阵如距离矩阵distMatrix在下次迭代前用clear或赋值为[]释放内存。使用profile工具定期使用profile viewer查看代码的耗时热点针对性地优化。通常你会发现90%的时间花在10%的代码上如距离计算、随机数生成。重构马赛马拉的建模之旅本质上是一次对复杂系统进行“计算实验”的尝试。它教会我们的不仅仅是MATLAB编程或某个算法更是一种系统思维将定性的管理问题转化为可量化、可模拟、可优化的科学决策过程。这套融合了ABM、多目标优化、代理模型和并行计算的技术框架其价值远超一道赛题它可以被迁移到城市规划、交通管理、供应链设计等众多涉及多主体、多目标、动态反馈的现实问题中。最后我想说在数学建模竞赛中清晰的思路、合理的假设、严谨的验证往往比炫技的算法更重要。我们的模型做了大量简化但在论文中我们花了大量篇幅说明这些简化的合理性以及它们对结论可能产生的影响。这种审慎和坦诚同样是打动评委的关键。