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 中相同