使用OR Tools中的垃圾箱包装限制垃圾箱中的物品数量

时间:2020-06-11 12:57:45

标签: python or-tools

我正在遵循以下文档中的装箱示例:https://developers.google.com/optimization/bin/bin_packing

我想在这里添加另一个条件,该条件限制了可以放入垃圾箱的物品数量。

目前,我可以通过以下方式实现它-但是我不确定这是否是正确的方法。该代码复制如下

    data = create_data_model(store_weights, bin_capacity, max_items)
    # Create the mip solver with the CBC backend.
    solver = pywraplp.Solver('simple_mip_program', pywraplp.Solver.CBC_MIXED_INTEGER_PROGRAMMING)

    # Variables
    # x[i, j] = 1 if item i is packed in bin j.
    x = {}
    for i in data['items']:
        for j in data['bins']:
            x[(i, j)] = solver.IntVar(0, 1, 'x_%i_%i' % (i, j))

    # y[j] = 1 if bin j is used.
    y = {}
    for j in data['bins']:
        y[j] = solver.IntVar(0, 1, 'y[%i]' % j)

上面的内容与文档中的示例完全相同。

下面的部分是我进行更改的地方。 data ['max_items']是可以放入垃圾箱的最大项目数。我将其与其他约束一起添加:

 # Constraints
    # Each item must be in exactly one bin.
    for i in data['items']:
        solver.Add(sum(x[i, j] for j in data['bins']) == 1)

    # The amount packed in each bin cannot exceed its capacity.
    for j in data['bins']:
        solver.Add(
                sum(x[(i, j)] * data['weights'][i] for i in data['items']) <= y[j] *
                data['bin_capacity'])

    # Cannot have more than data['max_items'] items in a bin
    for j in data['bins']:
        bin_count = 0
        for i in data['items']:
            bin_count += x[i, j]
        solver.Add(bin_count <= data['max_items'])


    # Objective: minimize the number of bins used.
    solver.Minimize(solver.Sum([y[j] for j in data['bins']]))

其余内容与文档示例中一样。

你们认为这是限制垃圾箱中物品数量的正确方法吗?您是否认为这会引起我没有考虑的任何问题?

输出似乎将项目数限制为data ['max_items'],但我不确定这是否是正确的方法。

谢谢!

0 个答案:

没有答案