当前位置: 首页 > 知识库问答 >
问题:

图中成本取决于遍历历史的最短路径

黄伟
2023-03-14

我的目标是找到与道路(边)相连的给定城市(顶点)之间的最短路径(成本最低)。每条道路和每个城市都有进入该道路/城市之前必须支付的费用(成本)。

如果这是整个任务,我会使用Dijkstra算法找到最短路径(并将城市成本添加到之前连接的道路成本中)。

但是:

城市有类似于伙伴关系协议的东西——当你访问其中一个并支付费用时,进入这个特殊伙伴关系中的其他城市是免费的。

因此,顶点(在它之前连接的边)的成本取决于已经遍历的顶点。

那种问题有算法吗?

谢谢你。

共有3个答案

阮飞翔
2023-03-14

这里要做的是集群。

在您开始运行Dijkstra或其他一些算法之前,请在您的图形上运行一些更改,其中所有彼此有协议的城市都转换为一个新节点。
从这个节点,您可以到达其中任何一个城市到达的任何城市(当然是选择最便宜的边缘)。

这将非常类似于将相关道路的收费更改为0对于有协议的两个城市之间的边缘。

何楷
2023-03-14

Dijkstra非常适合这个问题,如果你对它进行适当的建模。

正确地说,我的意思是你需要认识到你的卡车的状态不仅是当前位置,而且是它的历史。

class TruckState {
    City current;
    List<City> visited;
}

注:如果入场费是保守的,那么订单可能无关紧要(协议条款中的所有城市都提供相同的成本效益,无论订单如何?)。如果是这样,请将历史表示为一个集,您将获得更小的搜索空间:

class TruckState {
    City current;
    Set<City> visited;
}

所有这些都使得您的搜索空间相当大。如果您的合作模式允许,您可以再次重复使用它。例如,卡车的有用状态可能是其位置,以及一组未锁定的协议。如果这些不可锁定的协议少于城市,那么你就把你所在的州压缩到最低限度。

class TruckState {
    City current;
    Set<Agreement> unlocked;
}

[编辑]:看起来顺序很重要:你向协议池的第一个城市支付入场费。您需要跟踪协议的哪个城市最先访问。然后我建议如下状态:

class TruckState {
    City current;
    Map<Agreement, City> visited;
}

注意:使用A-star将非常困难,因为找到一个可接受的启发式将不那么简单。我不能提供建议,因为我不知道你的费用是否包括某种距离函数。目前,由于成本可能会根据状态变为零,因此唯一可接受的启发式算法可能是常量值。没有用。。。

郎星汉
2023-03-14

您可以将集合覆盖问题简化为此问题。这意味着你的问题是NP难的,你不应该期望找到一个有效的解决方案(通常)。

这意味着您应该希望合作伙伴的数量很小,然后您也许可以考虑所有可能的非单身道路/城市合作伙伴子集,并为每个子集找到最短路径(假设您的路径将只通过您正在考虑的给定子集中的道路/城市)。然后,您的算法将在2^P*(N M)时间内运行,其中P是伙伴关系的数量,N和M分别是城市和道路的数量。

为了完整起见,下面是从集合覆盖到图形问题的简化:

集合覆盖问题是给定一个有限集S={S[1],…,S[n]},以及S的子集:S[1],S[1],S[2]。。。,S【N】。我们要求您找到覆盖S的这些子集的最小数目。

要使用您的城市问题来找到最小覆盖率,请构建这样的图。设图的顶点为起点、终点和对(S[i],t),其中和t在S[i]中。在图形中的以下位置之间添加边:

  • 开始和(S[i],S[1]),对于每个S[i],S[1]在S[i]中

让边权重都为1,输入(S[i],S)的成本也为1。所有城市/顶点(S[i],S),(S[i],t)共享相同的成本。没有两条道路/边缘共享成本。

现在,从START到END的最低成本路径对应于找到覆盖S的最小S[i]集。该路径的成本将为1np,其中p是最小覆盖的大小。

 类似资料:
  • 主要内容:src/runoob/graph/ShortestPath.java 文件代码:广度优先遍历从某个顶点 v 出发,首先访问这个结点,并将其标记为已访问过,然后顺序访问结点v的所有未被访问的邻接点 {vi,..,vj} ,并将其标记为已访问过,然后将 {vi,...,vj} 中的每一个节点重复节点v的访问方法,直到所有结点都被访问完为止。 我们可以分为三个步骤: (1)使用一个辅助队列 q,首先将顶点 v 入队,将其标记为已访问,然后循环检测队列是否为空。 (2)如果队列不为空

  • 无论是调试的需要还是修改节点和边,你可能都需要在现有的有向有环图中进行遍历,下面就介绍图遍历的一些方法。 简单访问 节点和边有很多属性和方法是用来遍历的,边的 from 和 to 属性就是例子,而节点更多: 类型 名称 作用 属性 upstreamNodes 当前节点的所有上游节点 属性 downstreamNodes 当前节点的所有下游节点 属性 upstreamTransforms 当前节点的

  • 我正在编写一个程序,从左下角到右上角遍历网格,其中有效移动是向右移动1,向上移动1,或向上或向右跳跃跳跃跳跃数组中指定的数量。输入是2D数组格式的网格、网格的尺寸:X和Y,以及必须按顺序完成跳转的跳转数组。输出是最短路径,其中路径的长度是所有接触的数字的总和,包括左下角和右上角 示例输入: 输出是5,因为我们从(0,0)开始,它是3,然后使用第一个1块跳转到(2,0),它是1,然后第二个1块跳转到

  • 本文向大家介绍JavaScript中的图遍历,包括了JavaScript中的图遍历的使用技巧和注意事项,需要的朋友参考一下 图遍历(也称为图搜索)是指访问(检查和/或更新)图中每个顶点的过程。此类遍历按访问顶点的顺序分类。

  • 历史版本信息请查看SDK中心的版本信息。

  • 更多历史版本信息请查看SDK中心的版本信息。 V3.9.0.6( 更新时间:2018-06-10 ) 新增信息流分析功能,针对列表栏目的智能分析 优化SDK基础性能,提升稳定性 V3.9.0.0( 更新时间:2018-03-16 ) 新增自定义名单方式创建分群 支持上传用户识别ID,标记业务目标用户 错误报告升级,支持异常信息主动上报并展示 优化SDK开发者日志输出 V3.8.2.2( 更新时间: