第一步:把愿望改写成可观察的问题

“更好”“更快”“更合理”适合作为动机,却还不足以成为模型。先说明当前系统、可以改变的部分、希望改善的结果,以及比较所依据的时间和条件。指标只是问题的一个表达,应检查它是否真的对应原来的需要。

例如,安排若干项任务时,希望尽量缩短总耗时,还可能要求某些任务先完成、某类资源不能同时使用。先从这个简单情境出发,逐步明确模型中的各个部分。

第二步:区分变量、参数和观测

变量是准备求解或决定的量,参数是当前模型中视为已知的量,观测是实际获得的数据。三者的角色取决于问题设置:某个量在一个模型中固定,在另一个模型中也可以成为需要估计的变量。先给符号、单位和允许取值,再写公式。

沿着任务安排的例子,开始时间可以是决策变量,预计耗时可以是输入参数,实际完成时间则是之后的观测。如果预计耗时不确定,应该记录不确定性的来源,不能因为它写进了公式就把它当作准确事实。

第三步:分别写目标和约束

目标函数表达偏好,约束表达允许的范围。一个常见抽象是:在 gᵢ(x) ≤ 0、hⱼ(x) = 0 与 x ∈ X 的条件下,寻找使 f(x) 尽量小的 x。约束可能来自物理规律、业务规则或建模简化,需要注明出处。

多目标问题未必能自然合成一个数字。若将时间、成本和误差加权求和,权重就表达了取舍;单位不同的量也不能直接相加。先展示可接受的方案范围,再讨论偏好,有时比急着给一个“最优解”更清楚。

问题:希望改善什么,如何测量?
变量:可以决定什么,取值范围是什么?
参数:哪些量暂时已知,单位是什么?
目标:什么结果更好,为什么?
约束:什么必须满足,来自哪里?
假设:忽略了什么,何时可能失效?
验证:用什么证据判断模型是否有用?

第四步:先检验小情形,再讨论复杂算法

先用可以手算的例子检查符号与单位,再检查极端输入、空输入和约束冲突。若不存在满足条件的方案,应报告不可行,而不是强行输出一个看起来不错的数字。若有简单基线,也应比较复杂方法增加的成本是否带来相应收益。

还可以逐个扰动关键参数,观察结论是否突然改变。对输入误差极其敏感的方案,需要更谨慎地解释。计算出的最优性只针对写下的模型,不自动等于现实中的最佳选择。

第五步:把验证方式写在求解之前

需要预测的模型,应考虑独立数据上的表现;用于决策的模型,应检查可行性、成本与实际后果;纯理论问题,则需要明确证明覆盖的假设。每一类证据回答的问题不同,不能互相替代。

保留一个朴素的问题:什么观察会说明这个模型不够好?把答案写出来,模型才具有被修正的机会。建模不是尽快把问题写成公式,而是让假设、计算与现实之间的关系逐步变得清楚。