【发布时间】:2022-12-17 16:29:47
【问题描述】:
正如标题所示,我正在使用 Google OR-Tools 来解决装箱问题。我想要求装在给定卡车中的所有订单都具有相同的交货目的地。以下是我尝试实现这一点,但似乎没有用:
# x[i, j] = 1 if item i is packed in bin j
x = {}
for i in data['orders']:
for j in data['trucks']:
x[(i, j)] = solver.IntVar(0, 1, 'x_%i_%i' % (i, j))
data['trucks'] = [0, 1, 2, 3, ...]
data['orders'] = [0, 1, 2, 3, ...]
data['delivery_county_id'] = [8, 8, 8, 1, 3, 2, ...]
from itertools import groupby
# Checks if all elements of list are equal
def all_equal(iterable):
g = groupby(iterable)
return next(g, True) and not next(g, False)
for j in data['trucks']:
solver.Add( all_equal ( [ x[(i, j)] * data['delivery_county_id'][i] for i in data['orders'] if x[(i, j)] == 1 ] ) == True )
奇怪的是,我在执行代码时没有收到任何错误,但我的约束没有得到遵守。我不确定为什么会这样。任何帮助或建议将不胜感激!
【问题讨论】:
-
在最后一行代码中,您将重载的 IntVar 运算符与 Python 运算符混合在一起,因此约束根本没有按照您的想法进行。我的建议是,如果卡车 j 中有 k 县的订单,则创建另一个数组 y[j, k] = 1。然后为 y[j, k] 添加约束 MaxEquality 作为所有 i 的 x[i, j] 的最大值,其中 data['delivery_county_id'][i] == k 以确保 y 具有正确的值,然后为每辆卡车 j (所有 k 的 y[j,k] 之和) <= 1。
-
@ChristopherHamkins 您能否分享代码的外观?我正在努力将其翻译成 python。我目前正在运行求解器 n 次,其中 n 是目的地的数量。这意味着我将数据集拆分为单独的数据集,并为每个数据集运行一次求解器。您提出的解决方案似乎是更好的答案。
标签: knapsack-problem or-tools mixed-integer-programming bin-packing