如何比较set()和list()在谷歌或工具?



我正在使用谷歌或工具解决特定的多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,这意味着同一时间只能有一部分物品在箱子里。

相关内容

  • 没有找到相关文章

最新更新