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

时间:2016-12-04 14:21:48

标签: algorithm graph-algorithm dijkstra

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

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

但是:

城市有类似合伙协议的东西 - 当您访问并支付其中一个时,在这个特殊合作关系中进入其他城市免费

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

是否存在针对此类问题的算法?

谢谢。

2 个答案:

答案 0 :(得分:2)

Dijkstra对于这个问题非常好,如果你正确建模的话。

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

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

注意:如果报名费是保守的,订单可能无关紧要(协议条款中的所有城市都提供相同的成本效益,无论订单如何?)。如果是,则将历史记录表示为Set,您将获得更小的搜索空间:

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

所有这些都使您的搜索空间相当大。如果您的伙伴模型允许,您可以再次进一步处理它。例如,卡车的有用状态可以是其位置,以及Set未锁定的Agreements。如果这些可解锁的协议少于城市,则将您的状态压缩到最低限度。

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

[编辑]:订单似乎很重要:您需要向协议池的第一个城市支付入场费。您需要首先跟踪协议的哪个城市。然后我建议采用以下状态:

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

注意:使用A-star将很难非常,因为找到一个可接受的启发式算法将不会是微不足道的。我不能建议,因为我不知道你的费用是否包括某种类型的距离功能。目前,由于成本可能因国家而变为零,因此可能唯一允许的Heurisitic是常数值0。没用......

答案 1 :(得分:1)

您想要做的是群集。

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

这与在两个有协议的城市之间的边缘将相关道路的费用更改为0非常相似。