跳转至

混合优化示例

混合优化问题同时包含线性规划和调度约束,需要编排器在启发式和精确求解器之间交替执行。

生产计划 — 启发式 + CP-SAT 交替

一个包含产品混合、生产调度和外包决策的混合优化问题。

from optagent import (
    ExecutionMode, HeuristicStrategy,
    ModelBuilder, Orchestrator, OrchestratorConfig, OrchestratorSolver, PhaseConfig,
)

builder = ModelBuilder(metadata={"case": "hybrid_production_planning_small"})

demand_a = 4
demand_b = 3
due_date = 4

line_sequence = 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, name="blend_a")
blend_b = builder.interval_var(start=0, length=1, lb_start=0, ub_start=8, lb_length=0, ub_length=3, name="blend_b")

local_a = builder.int_var(default=2, lb=0, ub=4, name="local_a")
local_b = builder.int_var(default=1, lb=0, ub=3, name="local_b")
outsource_a = builder.int_var(default=2, lb=0, ub=4, name="outsource_a")
outsource_b = builder.int_var(default=2, lb=0, ub=3, name="outsource_b")
tardiness = builder.int_var(default=0, lb=0, ub=8, name="tardiness")

builder.constraint(builder.no_overlap(line_sequence, blend_a, blend_b), name="single_blending_line")
builder.constraint(local_a == builder.interval_length(blend_a), name="local_a_matches_blend_length")
builder.constraint(local_b == builder.interval_length(blend_b), name="local_b_matches_blend_length")
builder.constraint(local_a + outsource_a == demand_a, name="meet_demand_a")
builder.constraint(local_b + outsource_b == demand_b, name="meet_demand_b")
builder.constraint(
    tardiness >= builder.max(builder.interval_end(blend_a), builder.interval_end(blend_b)) - due_date,
    name="due_date_lateness",
)
builder.constraint(tardiness >= 0, name="tardiness_nonnegative")

builder.minimize((outsource_a * 2) + (outsource_b * 3) + (tardiness * 4), name="total_plan_cost")
program = builder.freeze()

result = Orchestrator().run(
    program,
    config=OrchestratorConfig(
        total_budget_iterations=40,
        execution_mode=ExecutionMode.ALTERNATING,
        phases=[
            PhaseConfig(
                name="hybrid_seed",
                solver=OrchestratorSolver.HEURISTIC,
                budget_iterations=12,
                strategy=HeuristicStrategy.TABU,
                restart_limit=1,
            ),
            PhaseConfig(
                name="hybrid_exact",
                solver=OrchestratorSolver.CP_SAT,
                budget_iterations=28,
                fallback_on_stall=False,
            ),
        ],
    ),
)

运行方式

PYTHONPATH=src python examples/hybrid/hybrid_production_planning_small.py

使用预设求解混合问题

from optagent import BuiltInStrategyPreset, ModelBuilder, Orchestrator

builder = ModelBuilder(metadata={"case": "hybrid_production_preset"})
# ... 同样的建模过程 ...
program = builder.freeze()

# 使用混合预设 — 进化搜索后接精确求解
result = Orchestrator().run(program, preset=BuiltInStrategyPreset.HYBRID_EVOLUTIONARY_THEN_EXACT)

运行方式

PYTHONPATH=src python examples/presets/hybrid_production_preset.py

混合优化要点

  • ExecutionMode.ALTERNATING:编排器在不同求解器之间交替执行
  • 同一个 DAG 中可以同时包含线性约束(int_var)和调度约束(interval_varsequence_var
  • 启发式阶段提供初始解,精确阶段在此基础上精化
  • fallback_on_stall:控制当求解停滞时是否触发回退