跳转至
OptAgent 1.2.0

Flow Shop

Flow Shop

所有工件按相同的工序顺序经过多个阶段。除阶段内容量外,还要把同一个工件 在前后阶段的完成/开始关系串起来。flow_shop.py 使用 sequence、interval 和 precedence 描述该结构,并通过统一的 solve(...) 入口求解。

完整代码

examples/scheduling/flow_shop.py
from __future__ import annotations

from pathlib import Path
import sys

from optagent import ModelBuilder, solve

sys.path.insert(0, str(Path(__file__).resolve().parents[1]))

from _common import print_solution


def build_model() -> tuple[object, int]:
    builder = ModelBuilder(metadata={"case": "flow_shop"})
    seq = builder.sequence_var(size=3, default=[2, 1, 0], name="machine_order")
    cut = builder.interval_var(start=0, length=2, lb_start=0, ub_start=5, lb_length=2, ub_length=2, name="cut")
    drill = builder.interval_var(start=0, length=3, lb_start=0, ub_start=6, lb_length=3, ub_length=3, name="drill")
    pack = builder.interval_var(start=0, length=1, lb_start=0, ub_start=8, lb_length=1, ub_length=1, name="pack")

    builder.constraint(builder.no_overlap(seq, cut, drill, pack), name="machine_capacity")
    builder.constraint(builder.precedence(cut, drill, lag=0), name="cut_before_drill")
    builder.constraint(builder.precedence(drill, pack, lag=0), name="drill_before_pack")
    builder.minimize(builder.interval_end(pack), name="makespan")
    return builder.freeze(), seq.node_id


def main() -> None:
    program, sequence_id = build_model()
    solution = solve(program, time_limit_s=10.0, seed=7, threads=1, log_level="on")
    print_solution("flow shop solved by unified solve", solution, extra={"sequence_variable": sequence_id})


if __name__ == "__main__":
    main()

打开或下载 flow_shop.py