修改贝尔曼-福特算法以维护基于成本的有序列表
Modifying the Bellman-Ford Algorithm to maintain an ordered list based on cost
假设您正在寻找火车之旅。您会对乘车的价格以及乘车所需的时间感兴趣。现在假设您有一个图表,其中每条边都有成本和持续时间,并且您希望在图形中找到不超过给定最大成本的最短持续时间路径(任意两个顶点之间可能有多个边)。
这是我遇到的问题。我认为解决这个问题的最好方法是修改贝尔曼-福特算法。
这是我到目前为止所拥有的:
// A struct to represent an Edge in graph
struct Edge
{
int source, dest, cost, duration;
};
// A struct to reporesented a connected, directed
//and wieghted graph
struct Graph
{
int V, E;
struct Edge* edge;
};
// Creates Graph with V vertices and E edges
struct Graph* createGraph(int V, int E)
{
struct Graph* graph = new (struct Graph);
graph -> V = V;
graph -> E = E;
graph -> edge = new Edge[E];
return graph;
}
我已经用他们需要的所有信息填充了结构。现在我只需要根据成本"组织"数据。所以我意识到对于每个顶点,我需要存储一个通向它的路径列表。对于我认为需要将路径从第一个顶点列表复制到第二个顶点列表(增加成本和距离)。但是我如何实际编写这个,我被困在上面的部分。
这个问题是一个经过充分研究的问题:公共交通网络中的行程规划问题。
基于Bellman-Ford的方法可能会变得有问题并且过于昂贵,具体取决于网络,因为您无法考虑顶点已被"访问",或者在算法执行期间已经计算出到达顶点的最短路径。
这些概念("访问"或"最短")仅适用于单个客观最短路径问题。这是因为给定u, v
几个顶点,有趣的路径数量可能呈指数级增长,因为您不能只考虑更快或更便宜的选择。您必须将任何路径保留在内存中,以便没有其他路径更便宜,更快,并且如果您开始在现实网络上工作,则此数量的路径可能会迅速失控(这可能非常大,~100k停止和数百万次旅行)。
我建议你阅读多目标最短路径问题,还有一个事实,即通常,代表网络的图是一个随时间变化的图。
我认为值得您阅读有关多目标最短路径的页面,以了解该领域使用的主要技术(帕累托集合或帕累托边界的概念对于掌握这个问题非常重要),甚至本文的第 2 节和第 4 节,它描述了有关此类技术的实际技术水平。
尽管看起来很复杂,但它们中的大多数都可以运行得非常快(比Dijkstra快数十万倍,仍然比任何基于A *的方法快得多),并且对于其中一些来说,实现起来并不太难(例如,CSA不太复杂,并且运行得非常快,它可以在国家规模的网络上在几毫秒内计算一个简单的查询)。
按成本组织数据的典型方法是使用std::priority_queue
来存储路径。 当您发现路径时,您将路径放入队列中,然后它们首先从队列中最便宜的中出来。
你必须为放入priority_queue
中的任何对象实现比较运算符,但这并不难做到。
- 在数组中输入 n 个整数的列表,并以类似于钟摆来回移动的方式排列它们. 输入-1 3 2 5 4,输出5 3 1 2 4
- C++未知长度字符串的数组,其行为类似于 Python 字符串列表
- C++ 列表等效于 C# 列表
- 类成员函数参数列表是否可以依赖于模板参数?
- 如何找出依赖于LIB文件的DLL列表?
- 条件_variable和unique_lock如何适用于线程安全列表
- G++ - 警告:扩展初始值设定项列表仅适用于 -std=C++11 或 -std=GNU++11
- 添加一个节点,并在通用树中的两个给定节点之间找到路径成本,其中c 中的儿童列表
- 修改贝尔曼-福特算法以维护基于成本的有序列表
- 对函数参数的要求是否也适用于初始值设定项列表?
- c++中内联函数的零成本列表
- 如何在 c++ 中将函数列表应用于字符串
- 如何将函数应用于可变参数列表并将它们猫到元组
- 如何获取应用于本地工作站的组策略对象列表
- 如何将函数应用于可变参数列表的每个组件并返回可变参数列表
- 在本地将 'using std::foo' 指令应用于构造函数初始值设定项列表 (C++)
- C 中的数组中的数组类似于Python中的内部列表
- C++等效于字典/列表的Python代码
- 如何使用指针C++将类的析构函数转换为另一个类?类似于单向列表容器类和节点类
- c++(类似于python列表)