
注本文主要分享建模思路、比赛过程和论文打磨经验。为避免影响后续学习与交流部分核心算法、关键参数、完整公式及代码细节不作公开。【配图1文章背景图】一、先说结果这是一次比预想中更“工程化”的建模今年参加数学建模国赛最终我们的 B 题获得了拟推国一。比赛结束之后再回头看这篇论文我觉得它最有意思的地方并不在于用了多少复杂算法而在于整个模型是一步一步“长出来”的。刚开始看到题目的时候第一反应其实很直接找干扰源不就是多测几次方向然后求交点吗但真正开始建模以后才发现问题远没有这么简单。我们不仅要回答“干扰源大概在哪里”后面还要继续解决“下一步机器狗应该往哪里走”“怎样减少无效检测”“怎样覆盖整个区域”“如果干扰源只能朝某个方向发射信号怎么办”“如何把搜索、定位、移动和清除统一起来”所以最后我们真正解决的其实是一个逐步升级的几何定位 → 检测点选择 → 路径规划 → 动态决策问题。【配图2四问关系图】二、我们没有一上来就追求“高级算法”比赛过程中一个比较深的感受是数学建模最怕的不是模型简单而是模型之间没有逻辑。我们最开始也考虑过直接上很多优化算法但后来逐渐意识到四个问题实际上是递进关系。因此我们的处理思路一直遵循一个原则后一问尽量复用前一问已经得到的信息而不是每道题重新建立一个完全独立的模型。例如第一问先解决定位区域的表达问题第二问再考虑“怎样选择下一次检测位置”第三问进一步把局部检测决策放进全局巡检路径里第四问再处理更加复杂的信号方向问题。这样做之后整篇论文就不再是四个模型拼起来而更像是一个不断升级的决策系统。【配图3模型演化图】三、第一问真正重要的不是“求交点”这一问表面上是一个比较标准的几何定位问题。多个检测位置分别得到一个方向信息由于测量存在误差实际得到的并不是一条绝对准确的射线而是一个具有一定范围的方向区域。多个区域相交之后就得到干扰源可能存在的位置。我们将多个测向约束转化为一个有限多边形区域再通过几何方法描述这个区域的大小和形态。【配图4交会定位示意图】我们求的不是一个“点”而是一个“不确定区域”。四、第二问是我认为整道题比较关键的一步当机器狗第一次检测到干扰源之后一个很自然的问题出现了第二次到底应该去哪里检测离得太近两次观测方向差别可能太小离得太远又可能收不到信号走错方向还会增加大量额外移动距离。所以这个问题实际上存在几个相互制约的目标再次收到信号 ↘ 合适的第二检测位置 ↗ 提高定位效果同时还必须考虑机器狗移动成本。我们最后没有简单寻找一个“唯一最优点”而是先得到一个候选区域。这是我觉得这道题非常有意思的地方。【配图5候选区域艺术化示意图】不同位置并不是等价的。综合信号接收可靠性和定位效果之后可行检测位置会自然收缩到特定空间区域。五、第三问开始题目从“数学题”变成了“决策题”到了第三问我们发现只解决单个干扰源已经没有意义了。因为机器狗面对的是数量未知、位置未知的多个干扰源。这时候真正的问题变成怎么走机器狗不可能站在原点等着所有信号自己出现因此必须规划一条能够覆盖整个任务区域的基础巡检路线。于是我们开始把问题拆成两层第一层保证“找得到” ↓ 建立全局覆盖骨架 第二层保证“找得快” ↓ 在巡检过程中动态插入定位和清除任务这一步之后整个模型开始明显具有“工程决策系统”的味道。【配图6覆盖路径概念图】我们首先构造能够覆盖任务区域的基础巡检骨架再将实时获得的干扰源信息动态插入原有路径中。六、我们后来意识到“最短路径”并不等于“最快完成任务”这是比赛过程中一个比较重要的转变。刚开始做路径规划时我们很容易陷入机器狗走得越短越好。但实际上机器狗的总任务时间还包括移动信号检测频道切换二次检测精准定位清除检测失败后的重新处理。所以后面我们的优化目标逐渐从最短移动距离变成整个“检测—定位—清除—继续巡检”流程的综合时间。【配图7耗时组成环形图】一个局部看起来很好的检测位置如果需要机器狗大幅绕行那么放到完整任务中未必是最优选择。这也是我们后期对模型进行调整的重要原因。七、问题四是整个模型第一次真正“失效”第四问加入定向干扰源之后我们之前的一个重要假设被打破了没检测到信号不再意味着附近没有干扰源。因为它可能只是没有朝你这个方向发射。这是比赛后期比较麻烦的一点。原来很多判断逻辑都建立在有信号 → 存在 无信号 → 不存在而现在变成有信号 → 存在 无信号 → 可能不存在 也可能方向不对所以模型必须增加新的判断和重新检测机制。我们增加了方向识别与信号重获机制使模型能够在一次检测失败后主动调整检测位置而不是直接排除该干扰源。【配图8全向 vs 定向】八、真正花时间的地方其实不是写公式如果让我重新回顾这次数模我会把时间消耗大致分成【配图9比赛时间轴】很多人第一次参加数学建模容易觉得建模比赛 想出一个高级模型。但真正参加以后会发现模型只是其中一部分。大量时间其实花在模型能不能运行极端情况下会不会崩前后问题能不能衔接图是不是能说明问题表格是不是支持结论论文中的符号是否统一代码结果和论文数字是否一致。这些小问题中的任何一个到了最后几个小时都会非常致命。九、我们后期主要做的不是“加模型”而是“删模型”比赛中后期一个比较明显的变化是开始阶段会不断想还能不能再加一个算法后来变成这个东西真的需要吗因为论文篇幅有限。模型太多通常会导致三个问题模型很多 ↓ 每个模型解释不充分 ↓ 模型之间缺少关系 ↓ 论文看起来复杂但不完整所以我们后期做了大量简化。最终希望保留下来的每一个模型都必须回答一个问题它到底解决了什么如果说不清就删。这也是我这次比赛最大的收获之一。十、几个我觉得非常值得注意的坑第一不要先写代码再想模型。很容易写出大量程序最后却发现论文无法解释。第二不要只追求某一个指标。局部定位精度最好不一定意味着整个任务最快。第三Monte Carlo 不是“跑得越多越高级”。更重要的是解释为什么模拟以及结果是否稳定。第四图比很多文字更重要。如果一个模型用了三段文字还说不清楚很可能需要一张图。第五四问之间一定要有关联。如果四问看起来像四篇独立论文整体感会非常弱。十一、如果重新参加一次我还会做什么我应该仍然会保留现在这种总体框架定位 → 选点 → 覆盖 → 决策。但会更早确定论文主线。因为比赛后期才真正意识到这篇论文真正的核心并不是某个单独算法而是如何让机器狗利用不断获得的信息持续更新自己的下一步行动。换句话说它最终其实是一个动态决策问题。十二、最后拟推国一当然是一个很开心的结果。但比结果更有意思的是三天比赛里我们经历了很多次“这个方案好像可以。”“等等好像有问题。”“代码为什么又炸了”“这个图为什么和论文结论对不上”“算了重新来。”最后把几十页模型、代码、实验和图表拼成一篇逻辑完整的论文时那种感觉还是挺奇妙的。如果你正在准备下一次数学建模竞赛我觉得最值得记住的一句话是不要为了复杂而复杂。一个能够解释清楚、计算稳定、前后连贯的模型往往比堆很多高级算法更重要。