1

我浏览了谷歌的教程,我似乎理解了大部分代码。我的问题是他们只根据硬约束选择解决方案。大多数论文也使用软约束,每个约束都有它的系数。所有约束的总和乘以它们的系数会产生花名册的成本,因此目标是最小化这个值。我的问题是,如何将其添加到代码中?

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

我不确定决策生成器做了什么(或它的参数),也不知道solver.Assignment(),也不solver.AllSolutionCollector(solution)

我唯一发现的是这个,但我不知道如何使用它。(也许打电话solver.Minimize(cost, ?)而不是分配?)

4

1 回答 1

0

0

如果你看:

https://github.com/google/or-tools/blob/stable/examples/python/shift_scheduling_sat.py

数据定义了员工请求:

https://github.com/google/or-tools/blob/stable/examples/python/shift_scheduling_sat.py#L219

该模型直接为每个元组(员工、工作日、轮班)创建一个布尔变量。

因此,将其添加到目标很简单:

# Employee requests
for e, s, d, w in requests:
    obj_bool_vars.append(work[e, s, d])
    obj_bool_coeffs.append(w)

这在最小化代码中使用:

# Objective
model.Minimize(
    sum(obj_bool_vars[i] * obj_bool_coeffs[i]
        for i in range(len(obj_bool_vars))) + sum(
            obj_int_vars[i] * obj_int_coeffs[i]
            for i in range(len(obj_int_vars))))
于 2019-03-23T11:22:50.067 回答