我正在遵循以下文档中的装箱示例: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'],但我不确定这是否是正确的方法。
谢谢!