美国大学生数学建模竞赛(UMC 2019)那年的现场气氛,估摸比看他们播放《超级玛丽》还要炸锅。主办方在那儿搞了个“最大流量、最小代价”的拓扑图优化难题,好办说就是:地图上的节点(城市或广场)两两相连,如何连让总连线数最少,与此同时把总能耗压到最低?这玩意儿看着是个图论题,实际呢,就是要把你们这帮甲方客户忽悠瘸了。 刚启动看题目,心里就俩数:一个是“大”,另一个是“奇”。图论、概率、线性规划,这些名词一出来,我就知道这比赛要搞啥了。数学建模压根儿不是考哪位脑子转得快,而是考哪位能把实际难题翻译成方程组的本事。U 2019 的难点就在于,题目给的地图数据全是现成的,但你们能不能从中抠出规律来?比如那个著名的“最短路径难题”,在图论里叫 $N$ 个点、$N$ 条边、$O(N^2)$ 的复杂度,建图得让人头昏眼花。我当时就想,要是能把那个图抽象成矩阵,再配合某种特殊的搜索策略,说不定能省下一堆算力。 不过话说回来,这图论难题别看经典,但在实际工程里难不倒计算机。
比如大量城市交通网络,点多了边也多了,直接跑 Dijkstra 算法,工夫复杂度跟 $N$ 的平方成正比,那要是城市有 100 个节点,平方就是 10000,再乘上处理工夫,结局直接爆炸。
这时候就得用剪枝要么启发式算法了。我在草稿纸上画过类似的图,发现要是先算出每个节点的度数,再用某种贪心算法去填充边,往往能收敛得更快。毕竟最短路算法本来就是为了处理稀疏图设计的,要是图全稠密了,那得先做个约简再跑。 至于能耗难题,那是纯粹的线性规划。目标函数是 $sum c_{ij} x_{ij}$,约束条件嘛,无非是两点之间连路要么有要么没有,且出行量不能超过上限。
这个模型实际上挺好办的,但如何凑出合理的数据呢?比如假设节点 $i$ 和节点 $j$ 之间的可变成本是 $p_{ij}$,固定的服务器延迟是 $s$,那总代价就是 $p_{ij} + s$。
这时候就得寻思,是不是有些边确实不该连?比如地理上忒远要么数据源断了,直接设为无穷大。最终解出来的 $x_{ij}$,就是该连不该连的终极决策。 说到数据处理,这局部最烧脑也最出戏。U 2019 的地图数据里,有些节点是重复的,有些边是反方向的。
比如 A 到 B 的连线,和 B 到 A 的连线,要是算出费用一样,那这算不算两条边?这难题拿头撞墙。我在现场纠结了老半天,后来发现要是给每个节点编号,比如 A=1, B=2,那 $x_{12}$ 和 $x_{21}$ 实际上代表的是同一个物理连接,直接设 $x_{12} = x_{21} = 1$ 就能省一半参数。再比如那个“路网聚类”,就是把地图上散乱的点强行分组,让组内两点距离近,组间距离远。
这得用 k-means 之类的聚类算法,把数据降维再建模。 有意思的是,这题实际上是个典型的“小目标,大工程”。表面上看是个拓扑优化,实际是在做网络优化。
比如 telecom 公司想给城市装基站,那就是在找那个“最短路径难题”;银行想算坏账风险,那就是在找“最大流最小切”难题。数学建模就是把现实世界里的不清楚需求,硬生生切成几个清楚的数学难题,然后解出来。 最终得提提那个数据源的难题。U 2019 的原始数据里,有些坐标是必对的,有些是估摸的。
比如地图上标了"Centennial Park"这个点,但它的实际位置可能在几百米外。
这时候就得引入误差项要么加权系数,不然模型出来的结局就是一张废纸。
另外,有些城市的交通数据是断层的,比如早上上班高峰的边突然没了,这时候得补全几条虚拟边,要么干脆把节点合并,避免模型崩溃。 总而言之,这届比赛,真就是一场人机斗智的博弈。主办方想考验你们的算法 brilliance,你们想展示你们的工程落地本事。哪位能把那个复杂的图论模型,略微改改、插插代码,就牛逼哪位。别老盯着那些 fancy 的符号看,那些才是伪命题,能真正解决难题的逻辑,才是硬道理。就像当年解那题一样,只要肯动手,哪怕是把 $x_{ij}$ 设成 0 或 1,也能把难题解得服服帖帖。