Google OR-Tools - 路由 - 惩罚 - 将不同的惩罚添加到不同的位置(Python)

数据挖掘 Python 优化
2022-03-02 10:33:55

我正在使用 Google 的 OR-Tools 进行路线优化。参考资料可以在这里找到。

我正在执行优化,其中根据每个位置的惩罚丢弃某些拾取位置。该文档给出了一个示例并指出:“在这种情况下,析取只是一个变量,求解器使用它来决定是否在解决方案中包含给定位置。在此示例中,该方法向每个位置添加相同的惩罚,但一般来说,您可以对不同的位置添加不同的惩罚。” ,并提供以下代码块作为向每个位置添加常量惩罚的示例:

penalty = 1000
for node in range(1, len(data['distance_matrix'])):
    routing.AddDisjunction([manager.NodeToIndex(node)], penalty)

其中data是一个dict包含n x n距离矩阵 ( distance_matrix)。(此代码运行并返回一个合理的结果)。

现在,我想改变每个位置的惩罚,我使用了以下代码:

for node in range(1, len(data['distance_matrix'])):
    routing.AddDisjunction([manager.NodeToIndex(node)], data['penalty'][manager.NodeToIndex(node)])

其中是包含每个位置惩罚penalty的长度数组。n(在这些示例中,假定仓库位于第一个位置并且没有惩罚;range从 1 开始)。

当我运行我的代码时,我收到以下错误消息:

TypeError: Wrong number or type of arguments for overloaded function 'RoutingModel_AddDisjunction'.
Possible C/C++ prototypes are:
operations_research::RoutingModel::AddDisjunction(std::vector< int64 > const &,int64,int64)
operations_research::RoutingModel::AddDisjunction(std::vector< int64 > const &,int64)
operations_research::RoutingModel::AddDisjunction(std::vector< int64 > const &)

问题:我做错了什么?如何在不同的位置添加不同的惩罚?有人可以将 C/C++ 翻译成 Python 吗?

1个回答

鉴于您的代码,它看起来data['penalty'][manager.NodeToIndex(node)]不是整数,可能是浮点数,因此它与函数签名不匹配,如错误消息所示。尝试将其转换为整数。