0

Googleまたはツールに慣れるために使用しようとしています。Employee Scheduling Python の例の簡易版を試してみました。

from __future__ import print_function
import sys
from ortools.constraint_solver import pywrapcp


def main():
    # Creates the solver.
    solver = pywrapcp.Solver("employee_scheduling")

    num_nurses = 3
    num_shifts = 3
    num_days = 1

    # [START]
    # Create shift variables.
    shifts = {}

    for j in range(num_nurses):
        for i in range(num_days):
            shifts[(j, i)] = solver.IntVar(
                0, num_shifts - 1, "shifts(%i,%i)" % (j, i))
    shifts_flat = [shifts[(j, i)] for j in range(num_nurses)
                for i in range(num_days)]

    # Create nurse variables.
    nurses = {}

    for j in range(num_shifts):
        for i in range(num_days):
            nurses[(j, i)] = solver.IntVar(
                0, num_nurses - 1, "shift%d day%d" % (j, i))
    # Set relationships between shifts and nurses.
    for day in range(num_days):
        nurses_for_day = [nurses[(j, day)] for j in range(num_shifts)]

        for j in range(num_nurses):
            s = shifts[(j, day)]
            solver.Add(s.IndexOf(nurses_for_day) == j)

    # Create the decision builder.
    db = solver.Phase(shifts_flat, solver.CHOOSE_FIRST_UNBOUND,
                    solver.ASSIGN_MIN_VALUE)
    # Create the solution collector.
    solution = solver.Assignment()
    solution.Add(shifts_flat)
    collector = solver.AllSolutionCollector(solution)

    solver.Solve(db, [collector])
    print("Solutions found:", collector.SolutionCount())
    print("Time:", solver.WallTime(), "ms")
    print()


if __name__ == "__main__":
    main()

ご覧のとおり、私が保持している唯一の制約は、シフトと看護師の間の関係です。num_nurses = 3、num_shifts = 3、num_days = 1 の場合、ソルバーは 6 つの解を見つけることができます。ただし、num_shifts を 2 に変更すると、ソルバーは 0 個の解を返します。これにも 3 つの解決策があるはずではありませんか (1 人の看護師を割り当て、他の 2 人は未割り当てのままにしておきます) ?

4

2 に答える 2

0

結局のところ、これは現在の employee_scheduling の記述方法の制限です。それの書き直しは現在進行中であり、数週間で完了するはずです。

https://github.com/google/or-tools/issues/932

于 2018-11-14T17:40:25.630 に答える