微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用边缘成本函数计算网络x中的最短路径

如何解决使用边缘成本函数计算网络x中的最短路径

我想使用 networkx 来计算节能路线。为此,我考虑将电池约束建模为边缘成本函数。在下面的示例中,我想根据车辆的电池负载 (b) 计算 s 和 t 之间的最短路线。我的网络的约束将决定边缘成本函数

例如在 sv1 之间,如果 s 处的电池负载优于 18 或(接近无限)如果小于 18,边缘成本将为 18 .

是否可以定义网络x中最短路径算法将使用的边成本函数

example

或者您认为最好的解决方案是创建一个新的 MultiDiGraph,其中根据起点的初始费用重新计算所有可能的不同边成本?

编辑 1: 为了简化问题,我们可以将负权重(对应于电池的充电)视为为零。第二次,我将看到如何使用Johnson's algorithm。好像是在networkx(https://networkx.org/documentation/stable/reference/algorithms/generated/networkx.algorithms.shortest_paths.weighted.johnson.html)

中实现的

编辑 2: 最大电池负载为 20,这解释了为什么电池负载在 s 和 v_3 之间没有增加以及为什么不可能通过 s->v3->v2

到达 t

解决方法

  1. 假设初始电池电量无穷大。
  2. 搜索最负的计算成本。
  3. 将最大负成本 (X) 的绝对值添加到每个链接的成本中。
  4. 运行 Dijsktra 算法以找到从源到距离的最低成本。
  5. 从路径成本中减去 X ( P - X )
  6. 如果初始电池电量大于 ( P - X ),则可以到达目的地。

例如

C:\Users\James\code\PathFinder\bin>gui
l s v1 38
l s v3 0
l v1 v2 0
l v3 v2 38
l v2 t 23
s s
e t

s -> v3 -> v2 -> t ->

( PathFinder 是 Dijsktra 的 boost::graph 实现的 C++ 包装器)

所以,现在我们有一个新的先前隐藏的限制,即电池容量最大为 20。所以我提出了另一种方法,它应该可以证明任何可能出现的进一步限制。它基于 A* algorithm

  1. 重新表述问题,使充电站位于节点处,充电站之间的链接具有恒定的正成本。 (在我看来,这是一个更自然的现实世界模型)

  2. 使用 Dijsktra,仅考虑链接成本,找到从连接到当前完成的每个节点(最初是起始节点)到目的地的最便宜的路径

  3. 对于连接到当前的每个节点,将当前链接的成本与以 1 计算的到目的地的成本相加,减去该节点提供的任何充电。

  4. 从 3 中花费的每个节点中,选择最便宜的。跟踪用于到达此节点的路径并使其成为当前节点。

  5. 从第 2 步开始重复,直到到达目标节点。

这是一个非常专业的问题,我不会将它添加到路径查找器选项中。如果它代表了一个严重的现实世界问题,而不仅仅是家庭作业或学术练习,请在 PathFinder github 存储库上提出问题,我们可以讨论为此开发一次性应用程序的详细信息。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。