跳转至

混合优化示例

混合优化示例展示同一个 DAG 里同时存在线性数量平衡、区间调度、启发式阶段和精确阶段时,如何用编排器组合求解。

https://github.com/Dongbox/optagent-examples

问题说明

hybrid_production_planning_small.py 是一个小型生产计划问题:

  • 本地生产量由 interval 长度决定。
  • 外包量和延期惩罚是线性变量。
  • 两种产品共用一条生产线,需要 no_overlap
  • 编排器先用启发式阶段找可行/较好初值,再尝试 CP-SAT 精确细化。

目录结构

examples/hybrid/
  README.md
  hybrid_production_planning_small.py

代码示例

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),
        ],
    ),
)

运行

PYTHONPATH=. python examples/hybrid/hybrid_production_planning_small.py

注意事项

  • 输出中的 solver_traces 用来检查每个阶段是否求解、回退或停滞。
  • 混合模型并不表示所有约束都能同时由同一个 exact backend 完整接收;编排器会按阶段尝试。
  • 对生产类问题,建议同时记录最终解和阶段 trace,便于解释为什么采用当前解。

混合求解的显式阶段配置见 求解接口Orchestrator API