我正在使用 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 吗?