建模与求解的完整流程
快速开始提供可执行入口。本章解释一次求解中的对象、依赖与结果流,不要求先把小模型拆成多个业务上下文。
1. 从输入到业务方案
一次求解包含输入冻结、数据检查、表达式构建、模型组装、后端执行和结果映射。模型构建完成不代表已求解,求解调用返回也不代表已经有可读取的可行方案。
| 阶段 | 输入 | 输出 |
|---|---|---|
| 输入准备 | 业务记录、场景参数 | 本次运行使用的确定数据 |
| 表达构建 | 数据、业务索引 | 变量和中间值 |
| 模型组装 | 表达、规则和目标 | 具有完整变量域和约束的模型 |
| 转换与执行 | 模型、后端能力和配置 | 求解状态、解、界及诊断信息 |
| 结果映射 | 已确认的解、业务索引 | 业务方案和指标 |
2. 例子:两种产品共享工时
概述、概念与集合
生产上下文分配一个班次的工时。产品集合
变量
中间值
已用工时
断言、约束与目标
单位工时为正、预算非负是数据断言。资源约束与收益目标为:
枚举
3. 先建身份,再建依赖
先建立稳定产品索引与变量,再定义
业务标识如“产品 A”与后端列号不同。结果映射应保留本次运行的变量到业务实体关系,而不是假定第一个数永远属于 A。集合排序变化时尤其如此。
中间值可以被多条约束和多个报告指标复用;模型也不能仅靠名字相同就认定两个符号是同一个对象。关于注册与转换的职责,见类编译器架构。
4. 输入断言与求解约束
如果
这种区分决定错误应该在输入准备、建模还是求解结果中报告。数据断言检查已知事实,求解约束限制未知决策,两者不能互相替代。
5. 配置、执行与结果读取
选择能处理整数线性模型的后端,设置本次运行的时间限制和结果需求。不要把表达式可构造等同于任意后端都能处理,也不要把后端配置直接混进业务约束定义。
执行返回后先读取状态,确认是否存在可行解,再映射
业务报告同时保留状态和指标。例如“收益 11,存在可行解,尚未证明最优”与“最优收益 11”不是同一句话。详细解释见理解求解结果。
6. 生命周期与复用
复用的是规则定义和组件,而不是不加区分地复用上一轮变量实例。新场景应建立自己的输入与绑定;warm start 是向后端提供候选解信息,不是跳过新模型可行性判断。
模型规模扩大后,可以把工时指标交给资源上下文、收益交给经营上下文,由应用组装。阅读DDD 架构了解职责拆分;阅读滚动优化了解业务数据变化后的更新。