我正在使用谷歌或工具解决特定的多bin背包问题。
其中一个约束假设项被分成几个部分和只能将item的一部分存储在单个bin中.
我已经创建了代表项目id的附加列表。例如:
items = [1, 2, 3, 4]
item_ids = [1, 1, 2, 2]
表示我们有两个项目,每个项目分成两部分。
之后,我想使用约束,强制存储项id列表与存储项id集合相同。
类似:
solver.Add(
[matrix[i][j] * data['items_ids'][i] for i in data['items']] ==
list(set([matrix[i][j] * data['items_ids'][i] for i in data['items']]))
)
(data
是字典,如https://developers.google.com/optimization/bin/multiple_knapsack)
和我得到错误下面:
File "optimiser.py", line 111, in define_constrains
list(set([matrix[i][j] * data['items_ids'][i] for i in data['items']]))
TypeError: unhashable type: 'ProductCst'
我相信这是因为matrix[i][j] * data['items_ids'][i]
的结果不是一个数字,而是谷歌或工具类,但我不知道如何获得谷歌或工具变量的唯一值列表。
我通过改变解决方案的概念来解决它。
正如@sascha在评论中提到的,Or-tools没有做维度修复技巧,所以我改变了我的方法。
我已经为item的每个部分添加了约束:
def item_parts_in_bin(i, j, data, matrix):
return sum(
matrix[_i][j] for _i in data['items']
if data['item_ids'][i] == data['item_ids'][_i]
)
for i in data['items']:
solver.Add(
item_parts_in_bin(i, j, data, matrix) <= 1
)
所以基本上它返回相同项目id放置在bin中的项目部分的计数。这个总和必须是<= 1,这意味着同一时间只能有一部分物品在箱子里。