前面的章节把离散数学拆成了许多部件:逻辑、量词、集合、关系、函数、证明方法、归纳、计数、图论。综合建模要做的是把这些部件重新装回一个完整问题里。
现实问题通常不会直接写着“请使用逆否证明”或“请建立冲突图”。它只会给出一段场景、一组约束和一个目标。我们要先判断对象是什么,关系是什么,目标能否写成命题,接着选择证明、计数或图论工具,最后检查模型是否真的回答了原问题。

综合建模不是把所有学过的方法都用一遍。好的模型会保留问题真正依赖的结构,删掉暂时无关的细节,并把“要解决什么”写成可以推理、可以计算、可以检查的形式。
一个离散建模过程可以分成六个动作。它们不一定严格线性进行;建模常常要反复修改,但第一次下手时,按这个顺序能减少混乱。
先圈出对象。对象可能是学生、课程、站点、密码、字符串、自然数、集合中的元素,也可能是算法运行时的状态。对象不清楚,后面的关系和命题就会漂浮。
再写出关系。关系可以是“冲突”“相邻”“可达”“整除”“属于同一类”“先于”“由输入决定输出”。很多问题的关键不在对象本身,而在对象之间哪些配对成立。
接着确定目标。题目是在问是否存在、是否唯一、是否对所有情况成立、有多少种方案,还是某个过程是否一定结束?目标不同,模型会不同。
然后选择结构。成员归属常用集合,配对和相容性常用关系,输入输出常用函数,方案数量常用计数,连接和冲突常用图。
把目标改写成命题。命题要明确量词、条件和结论,例如“对每个合法安排,都不会有相邻课程同色”比“排课是合理的”更适合证明。
最后验证模型。验证包括数学上的证明,也包括回到场景检查假设是否遗漏、边界情况是否合理、输出是否能解释原问题。

下面的工作台把同一套动作放进三个场景。切换案例时,注意右侧摘要怎样从对象、关系、目标命题一步步成形。
建模最容易出错的地方,是太早套方法。看到“排课”就立刻画图,看到“多少种”就立刻套组合公式,看到“算法”就立刻写程序,这些都可能跳过真正的问题。
更稳的做法是先写一张翻译表:
如果把课程集合记为 ,时段集合记为 ,一次排课可以看成函数
若两门课程 有冲突,就要求
这两行公式做了三件事:它说明对象是课程和时段,说明冲突是课程之间的关系,也说明“没有冲突”的目标可以写成一个全称条件。
模型里的符号不是装饰。每个集合、关系、函数都应该能说回现实含义。若一个符号无法解释成原问题中的对象或约束,它很可能只是把问题写得更复杂了。
考虑一个小型排课问题:代数、程序、物理、写作、统计五门课要安排考试。若两门课有学生重叠,或同一位教师负责,就不能放在同一时段。这个场景的关键不是考试地点、试卷页数或课程名称本身,而是哪两门课彼此冲突。

把课程看成顶点,把冲突看成边,就得到一个图
其中 是课程集合, 中的每条边表示“两端课程不能同一时段”。若用颜色表示时段,那么合法排课就是一种顶点着色:每条边的两个端点颜色不同。
这个模型给出一个清楚的命题:
若图 存在 种颜色的合法着色,则这些课程可以安排在 个时段内且没有冲突。
设 是一个合法着色。这里 表示课程 被安排到的时段。
这个证明也暴露了模型的边界。它只保证冲突课程不重叠,不保证教室容量足够,也不保证学生喜欢这个时间。若原问题还要求教室容量,就要加入新的对象和约束。
网络问题适合用图建模,因为它天然关心“谁和谁相连”。站点可以是顶点,线路可以是边;一条从甲到己的路径表示信息、货物或人员可以沿着若干线路到达。

在这个模型里,问题可以有不同目标:
例如,要证明甲到己有备用路径,不能只画一条漂亮路线。我们要明确写出路径上的顶点序列,并检查相邻顶点之间都有边。若备用路径为
就要分别检查 、、 都是图中的边。
图论模型的价值在于把“网络是否可靠”拆成可验证的问题:有没有路径,删掉边后是否仍连通,某个顶点或边是否承担了唯一通道的作用。
计数问题看起来像在套公式,其实第一步仍然是建模。我们要先说清楚“被数的对象”是什么,再判断对象是否能被拆成互斥情况、连续步骤、选择集合或排列序列。

看一个小例子:四场专题讲座甲、乙、丙、丁要放入上午、下午、晚上三个时段。允许多个讲座同一时段,但甲乙不能同一时段,丙丁也不能同一时段。问一共有多少种安排?
若暂时不考虑约束,每场讲座有 个时段可选,所以共有
种函数式安排。现在减去违反约束的安排。设 表示“甲乙同一时段”, 表示“丙丁同一时段”。若甲乙同一时段,先选这个共同时间有 种,再给丙和丁各选一个时间,有 种,所以 。同理 。若两个约束同时违反,甲乙共同选一个时段,丙丁共同选一个时段,共有 种。
用容斥原理得到合法安排数:
这个计算不只是代数。它背后有一个模型:一次安排是从讲座集合到时段集合的函数,两个约束定义了两个坏事件,容斥用来修正重复删除。
计数时不要先问“用排列还是组合”。先问对象是否有顺序、是否允许重复、是否分阶段、不同情况是否互斥、坏情况是否重叠。公式应当从这些判断中长出来。
下面的交互把校园研讨会安排放在同一个场景里。切换目标时,模型会在冲突图、计数决策和算法验证之间改变,这能帮助你看见“同一现实场景不一定只有一个数学模型”。
算法正确性也是离散建模。输入、变量、循环轮次、递归调用都可以看成离散对象;程序每一步改变的是状态;正确性证明要说明这些状态变化不会破坏目标。

以“在有限列表中找最大值”为例。算法从第一个元素开始,把它记作当前最大值;随后逐个检查剩余元素,若发现更大的,就更新当前最大值。要证明它正确,核心不是说“看起来会更新”,而是写出循环不变式:
每轮循环结束后,当前最大值是已经检查过的元素中的最大值。
证明分三段。
初始化。循环开始前,已经检查的部分只有第一个元素。当前最大值等于第一个元素,所以它确实是已检查部分的最大值。
保持。假设某轮开始前不变式成立。检查下一个元素时,若它更大,就把当前最大值更新为它;若它不更大,就保留原值。两种情况下,新当前最大值都是扩大后的已检查部分的最大值。
终止。循环结束时,已检查部分就是整个列表。由不变式可知,当前最大值是整个列表的最大值。
这就是归纳思想在算法里的样子:初始化对应归纳基础,保持对应归纳步骤,终止把不变式翻译成最终结论。
综合建模中,证明路线由命题形状决定。命题若直接展开定义就能推进,优先直接证明;结论是否定式时,逆否证明可能更自然;若假设相反会和已知条件冲突,可以考虑反证法;若命题含“对所有自然数 ”,归纳法通常要进入视野。

证明路线不是身份标签。同一个命题可能有多种证明。选择路线的目的,是降低推理难度,让定义、已知条件和结论之间的连接更短。
若命题形如“若 ,则 ”,先试直接证明:从 出发展开定义,看看能否到达 。若 难以直接得到,但 很具体,可以改证逆否命题 。
若题目要求证明“不存在某对象”,常见路线是反证法:假设对象存在,再推出和定义、已知定理或最小性相冲突的结论。
若命题涉及所有自然数、递归结构、树的层数、算法轮次,可以考虑归纳法。归纳证明的关键不是写出“假设成立”,而是明确当前情形如何依赖前一个或更小情形。
若怀疑命题为假,不要硬写证明。先寻找反例。一个反例要同时满足命题的条件,并违反命题的结论。
证明路线的选择不是靠记忆题型,而是靠命题的逻辑形状。先看量词、条件和结论,再看对象结构,最后才决定使用哪种证明方法。
数学证明说明“在模型假设下,结论成立”。但综合建模还要问:模型假设是否保留了原问题真正需要的东西?
排课模型若只包含课程冲突,就不能回答教室容量问题。网络模型若只记录线路是否存在,就不能回答带宽和延迟问题。计数模型若把讲座当成可区分对象,就不能直接用于“同主题讲座可互换”的场景。算法证明若只覆盖非空列表,就不能声称算法处理了空列表。
验证可以从四个方向进行:
“模型里证明了”不等于“现实中一定可以”。证明保证模型内部的逻辑可靠;建模验证要保证模型没有把关键现实条件删掉。
练习一:某学院要给四个项目组安排展示时段。项目组甲和乙有成员重叠,乙和丙有评委重叠,丙和丁使用同一设备。请把问题建模为图,并说明“两个时段是否足够”对应什么图论问题。
把四个项目组看成顶点甲、乙、丙、丁。甲乙、乙丙、丙丁之间分别有冲突边。两个时段是否足够,对应这个冲突图是否可以用两种颜色合法着色。由于这张图是一条长度为 3 的路径,可以二着色,例如甲和丙用第一时段,乙和丁用第二时段,所以两个时段足够。
练习二:有 5 个不同任务要分配给 3 台服务器。每个任务必须分配给一台服务器,允许一台服务器接多个任务。若任务甲和乙不能在同一台服务器上,先建立计数模型,再求合法分配数。
一次分配可以看成从 5 个任务组成的集合到 3 台服务器组成的集合的函数。没有限制时共有 种。坏情况是甲乙在同一台服务器上:先选共同服务器有 种,其余 3 个任务各有 种选择,所以坏情况有 种。合法分配数为 。
练习三:命题“任意有 个顶点的树都有 条边”适合用什么证明路线?请说明理由。
适合用归纳法,尤其可以按顶点数归纳。树有递归结构:当 时,树至少有一个叶子;删去一个叶子及其相连边后,剩下仍是一棵有 个顶点的树。由归纳假设,剩下的树有 条边,加回叶子边后共有 条边。
这门课从逻辑开始,是因为证明需要准确的句子。命题逻辑和谓词逻辑帮我们分清条件、结论、量词和否定。集合、关系和函数让我们有语言描述对象之间的结构。证明方法训练的是怎样从定义和假设走到结论。归纳和递归处理一步一步生成的对象。计数回答“有多少种可能”。图论处理连接、冲突、路径和分配。
综合建模把这些内容合在一起:先抽象对象和关系,再把目标写成命题,然后选择证明、计数或图论工具,最后回到原问题检查模型。

后续学习可以沿几条路继续走。若你喜欢“有多少种”的问题,可以进入组合数学,继续学习生成函数、递推和更复杂的双计数。若你喜欢网络、匹配、颜色和路径,可以进入图论。若你想证明程序为什么正确,可以继续学习算法设计与分析。若你关注随机选择和样本空间,离散概率会把计数结果转化为概率模型。若你准备学习抽象代数或实分析,本课程中的量词、集合、函数和证明习惯会继续发挥作用。
学完本课程后,最重要的能力不是背出某个公式,而是面对一个新问题时能问出一组稳定的问题:对象是什么,关系是什么,目标是什么,命题怎么写,证明或计算覆盖了哪些情况,模型是否回答了原问题。
对任意一对有冲突的课程 ,图中都有边 。合法着色的定义要求相邻顶点颜色不同,所以 。
颜色就是时段,因此 表示两门冲突课程不在同一时段。由于 是任意冲突课程,所有冲突都被避免。
于是这个着色确实给出一个没有冲突的 时段排课方案。