我的目标是找到与道路(边缘)相关的特定城市(顶点)之间的最短路径(最低成本)。 每条道路和每个城市都有费用(费用),必须在进入该道路/城市之前支付。
如果那是完整的任务,我会使用Dijkstra算法找到最短的路径(并将城市成本加到它之前连接的道路的成本上)。
但是:
城市有类似合伙协议的东西 - 当您访问并支付其中一个时,在这个特殊合作关系中进入其他城市免费。
因此,顶点(在它之前连接的边)的成本取决于已遍历的顶点。
是否存在针对此类问题的算法?
谢谢。
答案 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
非常相似。