混合优化示例¶
混合优化示例展示同一个 DAG 里同时存在线性数量平衡、区间调度、启发式阶段和精确阶段时,如何用编排器组合求解。
https://github.com/Dongbox/optagent-examples
问题说明¶
hybrid_production_planning_small.py 是一个小型生产计划问题:
- 本地生产量由 interval 长度决定。
- 外包量和延期惩罚是线性变量。
- 两种产品共用一条生产线,需要
no_overlap。 - 编排器先用启发式阶段找可行/较好初值,再尝试 CP-SAT 精确细化。
目录结构¶
代码示例¶
from optagent import ExecutionMode, HeuristicStrategy, ModelBuilder, Orchestrator, OrchestratorConfig, OrchestratorSolver, PhaseConfig
builder = ModelBuilder(metadata={"case": "hybrid_plan"})
line = builder.sequence_var(size=2, default=[0, 1], name="line_sequence")
blend_a = builder.interval_var(start=0, length=2, lb_start=0, ub_start=8, lb_length=0, ub_length=4)
local_a = builder.int_var(default=2, lb=0, ub=4, name="local_a")
outsource_a = builder.int_var(default=2, lb=0, ub=4, name="outsource_a")
builder.constraint(builder.no_overlap(line, blend_a), name="single_line")
builder.constraint(local_a == builder.interval_length(blend_a), name="local_matches_time")
builder.constraint(local_a + outsource_a == 4, name="meet_demand")
builder.minimize(outsource_a * 2, name="plan_cost")
result = Orchestrator().run(
builder.freeze(),
config=OrchestratorConfig(
execution_mode=ExecutionMode.ALTERNATING,
phases=[
PhaseConfig(name="seed", solver=OrchestratorSolver.HEURISTIC, strategy=HeuristicStrategy.TABU),
PhaseConfig(name="refine", solver=OrchestratorSolver.CP_SAT),
],
),
)
运行¶
注意事项¶
- 输出中的
solver_traces用来检查每个阶段是否求解、回退或停滞。 - 混合模型并不表示所有约束都能同时由同一个 exact backend 完整接收;编排器会按阶段尝试。
- 对生产类问题,建议同时记录最终解和阶段 trace,便于解释为什么采用当前解。
混合求解的显式阶段配置见 求解接口 和 Orchestrator API。