OR-tools:根据python中另一个维度的积累添加一个维度(具体是每24小时使用的车辆成本)

Posted

技术标签:

【中文标题】OR-tools:根据python中另一个维度的积累添加一个维度(具体是每24小时使用的车辆成本)【英文标题】:OR-tools: Adding a dimension based on the accumulation of another dimension in python (specifically vehicle costs for every 24 hours used) 【发布时间】:2020-07-15 14:23:49 【问题描述】:

我想为车辆每使用 24 小时添加一个固定成本(使用 Python 版本的 OR-tools)。我不知道如何处理这个问题。

【问题讨论】:

【参考方案1】:

我从 James E. Marca 那里收到了一个解决方案的想法(链接:https://groups.google.com/g/or-tools-discuss/c/zEZ8PaMsV6g/m/W5KwdQN3AAAJ)

“正如你所发现的,你不能在 python 中使用依赖维度。

我建议创建一个明确的每日成本维度。常规的 节点向成本维度添加零,但创建一个虚拟的“日终” 节点,每辆车每天一个,这会增加您的每日成本。所以处理 回调函数中的这个逻辑(检查节点类型,如果不是 end-of-day-node,返回零,否则返回每日费用)。

然后将所有日终节点添加到求解器的最小化中 使用调用 routing.AddVariableMinimizedByFinalizer(daily_cost_dimension.CumulVar(day_i_vehicle_j_index))

也许这为你指明了正确的方向?”

[稍后留言]

我只是在考虑第 1 点。我认为您不需要使用 额外的成本维度,而是可以与您所拥有的任何东西合并 已经让模型最小化(距离或时间)。

我的意思是按照我的描述创建每日节点(每辆车一个 每天),允许它们被丢弃(零析取)但需要 如果车辆的时间维度大于 24 小时的倍数。然后做出到日常节点的距离 等于您每天要承担的额外费用。

例如,在标准示例中,您有这样的:

    def create_data_model():
"""Stores the data for the problem."""
data = 
data['distance_matrix'] = [
...
# set distance from all nodes to dummy end-of-day nodes as daily cost
]

...

# Instantiate the data problem.
data = create_data_model()

def distance_callback(from_index, to_index):
"""Returns the distance between the two nodes."""
# Convert from routing variable Index to distance matrix NodeIndex.
from_node = manager.IndexToNode(from_index)
to_node = manager.IndexToNode(to_index)
#
# this next line will correctly add "cost" of visiting end-of-day nodes
# if the data was set up correctly earlier
#
return data['distance_matrix'][from_node][to_node]

transit_callback_index = routing.RegisterTransitCallback(distance_callback)
routing.SetArcCostEvaluatorOfAllVehicles(transit_callback_index) 

【讨论】:

以上是关于OR-tools:根据python中另一个维度的积累添加一个维度(具体是每24小时使用的车辆成本)的主要内容,如果未能解决你的问题,请参考以下文章

OR-Tools MIP Solver - 根据 int 定义目标,而不是 IntVar

如何在 Java 中使用 OR-Tools 从多个 IntExpr 创建 IntExpr,与 Python 中相同

本地搜索运算符 Python 包装器 Google or-tools

or-tools python中的变量除法

根据打字稿中另一个数组的值过滤数组

如何在 or-tools 中定义复杂的目标函数?