On this page · 6 sections

在计算之前,我们已经做了选择

“数学是工具箱”容易让人以为:现实先提出一个完整问题,然后我们挑选公式求解。但很多困难发生在公式之前。把什么当作对象,哪些差异可以忽略,什么算作更好,都会改变问题本身。

我更愿意把数学理解为一门翻译语言:它把模糊诉求转成可讨论的结构,再让计算检验这些结构的后果。这个理解并不意味着数学比材料、软件或组织更高一等;翻译若遗漏了关键语境,表达得越精确,反而越容易让人过度相信它。

三个节点足以暴露问题的层次

考虑一张说明性有向图:A 到 B 的代价为 2,B 到 C 为 2,A 直接到 C 为 7。若目标仅是总代价最小,A→B→C 的代价为 4,优于直接路径。这里的数字只是教学设定,不代表某个城市的距离或实际项目结果。

2 →2 →7 → 可行B → C 关闭ABC
说明性图结构 · 同一个目标,在可行边集合变化后产生不同答案
min cost(path), subject to every edge being available
目标是总代价最小;约束是路径中的每条边都可用。先限定可行集合,再比较代价。

现在关闭 B→C。把原先的最短路径继续显示出来,会得到一个数值漂亮却无法执行的答案。正确处理是从可行图中移除这条边,重新求解,选择代价为 7 的直接路径。这不是算法变差了,而是问题已经改变。

模型如何进入软件

从现实到程序的四个接口
层次本例中的决定需要检查
对象位置成为节点,可通行关系成为边方向与可达性是否表达完整
目标最小化边权之和代价单位是否一致
约束关闭的边不可使用新状态能否及时进入图
实现求解并返回路径或无解返回结果是否仍满足当前约束

程序需要的不只是一个最短路函数,还包括明确的数据结构、输入验证和无解分支。只有当代价满足所用算法的前提,计算保证才适用;假设改变时,不能只换一份输入,却保留原来的保证。

测试也应从模型出发:关闭某条边后结果不能再包含它;所有出口都关闭时应返回不可达;返回路径的总代价应该等于各段代价之和。这样的检查把数学语言变成了程序可以承担的约束。

最低代价,不一定是最好的决定

假如代价只表示时间,模型不会自动考虑台阶、照明或使用者的体力。对于不同的人,同一条路径的可行性就可能不同。算法无法主动补上我们没有表达的需求。

反过来,把所有关切都压成一个分数也不总是进步。安全或基本可达性可能应成为硬约束,而不是允许用少量时间收益抵消的惩罚项。某些取舍需要先与实际使用者讨论,再决定能否量化。

共同语言的价值,也包括知道何时停下

数学抽象让问题可以被证明、比较、实现和反驳。但一次访谈、一段异常记录,可能提醒我们重新画图,而不是继续优化求解速度。共同语言的力量,在于让不同领域看见彼此的假设,不在于消除领域知识。

因此,我希望把学习分成一个循环:提出结构,写出前提,做出实现,再让现实指出缺口。数学不是最终裁判,而是让这个循环更清晰的一种纪律。

数学与技术不是一条单向箭头

我曾用数学指导物理、物理指导技术的链条整理知识。它能说明基础知识的重要,但现实关系也会反过来发生:工程遇到新问题,推动模型与方法改变;测量工具进步,又让原来无法观察的现象进入研究。

因此,“数学为王”对我更有用的含义,是掌握一种跨问题组织结构的能力,而不是给所有学科排等级。它需要与领域经验相遇,才能知道该抽象什么、该保留什么。

Sources & further reading

  1. ACM / IEEE-CS / AAAI · CS2023 ↗

    Further reading · 计算机科学课程框架,作为学科范围的延伸阅读。