混合优化示例¶
混合优化问题同时包含线性规划和调度约束,需要编排器在启发式和精确求解器之间交替执行。
生产计划 — 启发式 + 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,
),
],
),
)
运行方式:
使用预设求解混合问题¶
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)
运行方式:
混合优化要点
ExecutionMode.ALTERNATING:编排器在不同求解器之间交替执行- 同一个 DAG 中可以同时包含线性约束(
int_var)和调度约束(interval_var、sequence_var) - 启发式阶段提供初始解,精确阶段在此基础上精化
fallback_on_stall:控制当求解停滞时是否触发回退