精确求解器接口兼容性¶
本页说明 ModelBuilder 接口在 CP-SAT 和 MILP 两种精确解模式下的支持范围。完整接口签名和示例见 Builder API。
以完整表达式图为准
变量类型兼容不代表整个模型兼容。只要目标或约束中包含当前后端不支持的节点,精确解 lowering 仍会拒绝该模型。
标签¶
| 标签 | 含义 |
|---|---|
| HEURISTIC | 启发式路径可评估或搜索该语义。 |
| CP-SAT | 可进入当前 cp_sat 精确路径。 |
| MILP | 可进入当前 mathopt_mp / highs_cpp 精确路径。 |
| MODEL | 建模、登记或导出接口,不直接决定后端支持。 |
CP-SAT 模式¶
CP-SAT 当前适合整数、布尔、组合逻辑和调度结构。它不接收连续变量、集合变量、黑盒调用,也不支持所有序列操作。
CP-SAT 支持¶
| 建模接口 | 支持条件 |
|---|---|
| const | 参与 CP-SAT lowering 的常量必须是整数或布尔值。 |
| bool_var | 支持。 |
| int_var | 必须有有限 lb / ub。 |
| sequence_var | 支持绑定到 no_overlap 的调度序列,或作为直接 sequence_transition_sum(...) objective 输入。 |
| interval_var / optional_interval_var | 支持 mandatory / optional interval 的开始、结束、持续时间和 presence。 |
| abs | 支持整数表达式绝对值。 |
| sum | 支持整数表达式求和。 |
| at_most_one / at_least_one / exactly_one | 支持布尔/整数输入上的计数关系。 |
| min / max | 支持整数表达式聚合。 |
| and_ / or_ / not_ | 支持布尔表达式组合。 |
| iif | 支持整数条件选择,会降为 enforcement literal 约束和辅助整数变量。 |
比较表达式 <= / >= / < / > / == / != |
支持整数和布尔上下文中的比较。 |
| all_different | 支持。 |
| interval_start / interval_end / interval_length / interval_presence | 支持 interval 派生标量和 presence。 |
| selected_start / selected_end / selected_duration | 支持基于 presence 的 selected projection;调用方仍需用 exactly-one 约束保证唯一选择。 |
| alternative / add_alternative | 支持 exactly-one alternative。 |
| cumulative | 支持调度累积资源约束。 |
| no_overlap | 支持,并负责把 sequence_var 绑定到 interval 组。 |
| precedence | 支持前后工序约束。 |
sequence_transition_sum |
支持 IR-owned dense integer path/cycle objective;要求直接作为 objective root、min sense、非负整数成本。 |
| constraint / minimize / maximize | 登记接口可用;内部表达式必须属于 CP-SAT 支持范围。 |
CP-SAT 不支持¶
| 建模接口 | 原因 |
|---|---|
| float_var | 当前 CP-SAT 路径构建整数域模型,不接收连续变量。 |
| set_var、set_len、set_contains | 当前 canonical CP model 没有集合变量语义。 |
| sequence_contains | 仅动态 membership 不支持;常量 membership check 会按排列域静态 lowering。 |
sequence_transition_sum sparse / forbidden / default-cost / score / non-min / negative or non-integer cost modes |
当前 CP-SAT exact slice 只支持 dense non-negative integer min path/cycle。 |
| element / table | 未接入 CP-SAT 原生 element/table 约束。 |
| external_call | 精确解后端不能调用任意 Python 黑盒函数并证明全局最优。 |
MILP 模式¶
MILP 当前是线性 MP lowering,适合布尔、整数、连续变量上的线性目标和线性约束。它不自动做调度、逻辑、集合、黑盒或非线性表达式改写。
MILP 支持¶
| 建模接口 | 支持条件 |
|---|---|
| const | 支持数值和布尔常量;不支持 list/dict 常量参与线性表达式。 |
| bool_var | 支持,降为 0/1 变量。 |
| int_var | 支持整数变量,可带上下界。 |
| float_var | 支持连续变量,可带上下界。 |
| sum | 支持线性求和。 |
| at_most_one / at_least_one / exactly_one | 支持布尔变量上的线性计数关系。 |
| alternative / add_alternative | 支持布尔 presence 上的 exactly-one 线性关系。 |
| 加减与取负表达式 | 支持线性组合。 |
| 乘常量表达式 | 支持 变量或线性表达式 * 常量;不支持变量乘变量。 |
比较表达式 <= / >= / == |
支持线性比较。 |
严格比较 < / > |
仅当比较表达式可判定为整数时支持,会转为相差至少 1。 |
| constraint / minimize / maximize | 登记接口可用;内部表达式必须为线性 MP 支持范围。 |
MILP 不支持¶
| 建模接口 | 原因 |
|---|---|
| set_var、set_len、set_contains | 当前 canonical MP model 只包含标量变量和线性约束。 |
| sequence_var、sequence_contains | 当前 MILP 路径不自动生成排列或路径 formulation。 |
| interval_var、optional_interval_var、interval_start、interval_end、interval_length、interval_presence | 当前 MILP 路径不接收 interval 结构。 |
| selected_start、selected_end、selected_duration | 依赖 interval 和 iif,当前不做 MILP lowering。 |
| abs | 未自动改写为辅助变量和线性约束。 |
| min / max | 未自动生成 epigraph / hypograph 线性 formulation。 |
| and_ / or_ / not_ / iif | 未自动做逻辑约束或 big-M 线性化。 |
!= 比较 |
当前线性 MP lowering 不支持 disjunction。 |
| all_different | 未自动构造 pairwise 或 assignment 线性化。 |
| element / table | 未自动线性化。 |
| cumulative / no_overlap / precedence | 调度结构当前不自动生成 MILP formulation。 |
| external_call | 精确解后端不能调用任意 Python 黑盒函数并证明全局最优。 |
选择建议¶
| 模型特征 | 建议 |
|---|---|
| 纯线性目标和线性约束,包含连续变量 | 优先尝试 MILP。 |
整数、布尔、调度 interval、no_overlap、cumulative |
优先尝试 CP-SAT。 |
| 典型 JSSP/FJSP/RCPSP 建模 | 优先使用 Scheduling API 表达任务、资源和 alternatives,再按模型结构选择 solve(...) 或 CP-SAT。 |
| 黑盒目标、集合变量、路线评分函数 | 优先使用 solve(...),必要时显式声明 GaConfig。 |
| 同一模型同时包含线性和调度/黑盒结构 | 优先使用 solve(...) 的 strategy-first 路线;只有明确需要 exact backend 时再使用 direct exact API。 |