最短路径图算法助力Boost

2024-01-01

我有一个矩形网格形状的 DAG,其中水平边缘始终指向右侧,垂直边缘始终指向下方。边缘具有与之相关的正成本。由于矩形格式,节点使用从零开始的行/列来引用。这是一个示例图:

现在,我想进行搜索。起始顶点将始终位于左列(索引为 0 的列)和图的上半部分。这意味着我将选择起始位置为 (0,0)、(1,0)、(2,0)、(3,0) 或 (4,0)。目标顶点始终位于右列(索引为 6 的列)并且“对应”起始顶点:

起始顶点 (0,0) 对应于目标顶点 (5,6)

起始顶点 (1,0) 对应于目标顶点 (6,6)

起始顶点 (2,0) 对应于目标顶点 (7,6)

起始顶点 (3,0) 对应于目标顶点 (8,6)

起始顶点 (4,0) 对应于目标顶点 (9,6)

我提到这一点只是为了证明目标顶点总是可以到达的。这对我的实际问题可能不是很重要。

我想知道的是我应该使用什么搜索算法来找到从起点到目标的路径?我正在使用 C++,并且可以访问 Boost Graph Library。

对于那些感兴趣的人,我正在尝试实施福克斯的建议 paper.

我看了 A*,但说实话我不明白它,也不知道启发式是如何工作的,甚至不知道我是否能想出一个!

由于矩形形状和规则的边缘方向,我认为可能有一个非常合适的算法。我考虑过迪杰斯特拉

但我提到的论文说有更快的算法(但对我来说烦人的是没有提供实现),而且那就是

单一来源,我想我想要单对。


所以,这是你的问题,

  1. DAG 无循环
  2. 权重 > 0
  3. 左侧重量

您可以使用简单的详尽搜索来定义每条可能的路线。所以你有一个 O(NxN) 算法。然后你将选择最短路径。这不是一个非常聪明的解决方案,但它很有效。

但我想你想比这更聪明,让我们考虑一下,如果可以从两个节点到达某个特定节点,你可以找到两个节点处的权重最小值加上到达当前节点的成本。您可以将其视为先前详尽搜索的延伸。

请记住,DAG 可以画成一条线。为了DAG 线性化 here http://jason-kok.appspot.com/algorithm/dynamic是一个有趣的资源。

现在您刚刚定义了一个递归算法。

MinimumPath(A,B) = MinimumPath(MinimumPath(A,C)+MinimumPath(A,D)+,MinimumPath(...)+MinimumPath(...))

当然递归的起点是

MinimumPath(Source,Source)

当然是0。 据我所知,boost 没有现成的算法可以做到这一点。但这实现起来非常简单。

一个好的实现是here http://www.geeksforgeeks.org/shortest-path-for-directed-acyclic-graphs/.

如果由于某种原因,您没有 DAG,则应使用 Dijkstra 或 Bellman-Ford。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

最短路径图算法助力Boost 的相关文章

  • 结构化绑定中缺少类型信息

    我刚刚了解了 C 中的结构化绑定 但有一件事我不喜欢 auto x y some func is that auto正在隐藏类型x and y 我得抬头看看some func的声明来了解类型x and y 或者 我可以写 T1 x T2 y
  • BASIC 中的 C 语言中的 PeekInt、PokeInt、Peek、Poke 等效项

    我想知道该命令的等效项是什么Peek and Poke 基本和其他变体 用 C 语言 类似PeekInt PokeInt 整数 涉及内存条的东西 我知道在 C 语言中有很多方法可以做到这一点 我正在尝试将基本程序移植到 C 语言 这只是使用
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

    通常它会忽略未记录的 C 文件 但我想测试 Callgraph 功能 例如 您知道在不更改 C 文件的情况下解决此问题的方法吗 设置变量EXTRACT ALL YES在你的 Doxyfile 中
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat

随机推荐

  • 如何通过 shell_exec 在 php-apache docker 容器中重新加载 apache?

    我创建了多个虚拟主机 需要重新加载 apache 以使虚拟主机可用 但是shell exec service apache2 reload 似乎在容器内不起作用 根据我的理解是 php apache link https hub docke
  • 在另一个js文件中加载外部js文件[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我有这个文件包含在我的 html 中 我想从另一个 javascript 调用它 请建议我该怎么做 我想将它包含在我的js文件中 而不是ht
  • ScrollView 与 flex 1 使其不可滚动

    我正在尝试在ScrollView 并且只要 ScrollView 有flex 1 the 内部滚动不起作用 这是博览会小提琴 您可以运行此代码并使用它 https snack expo io SySerKNp https snack exp
  • C++ map<字符,静态方法指针>? [复制]

    这个问题在这里已经有答案了 我编写了一个非常基本的表达式解析器 我希望它是可扩展的 以便它可以解析用户定义的表达式类型 例如 如果在解析时我遇到了字符 lt 我想创建一个类的实例 用于解析以此字符开头的表达式 我有两个问题 如何将字符与静态
  • 有没有办法自动生成有效的算术表达式?

    我目前正在尝试创建一个 Python 脚本 它将自动生成有效的空格分隔算术表达式 但是 我得到的示例输出如下所示 32 42 95 24 53 21 虽然空括号对我来说完全没问题 但我无法在计算中使用这个自动生成的表达式 因为 24 和 5
  • ORA-01704: 字符串文字太长 '在 Oracle XMLTYPE 列类型中插入 XML 文档时出错'

    当我尝试将 SQL 表中的数据插入 Oracle 表时 出现此错误 ORA 01704 字符串文字太长 在我的 Oracle 表中 有一列具有 XMLTYPE 列类型 当我创建表时 我指定了 XML 列 如下所示 CREATE TABLE
  • phpmyadmin、neginx error.log - 检查组 www-data 是否具有读取权限和 open_basedir

    我在 phpmyadmin 网站上有此消息 phpMyAdmin 配置存储未完全配置 一些扩展功能已被停用 要了解原因 请点击此处 在 单击此处 页面上 我有以下内容 页面打印屏幕 https www dropbox com s vhh4v
  • 在 Swift 中从 AVCaptureSession 捕获静态图像

    我有一个AVCaptureSession在 UIView 中显示实时视频 我想将视频流的一帧保存为 UIImage 我一直在剖析我在互联网上不断看到的代码 但我在第一行遇到了问题 if let stillOutput self stillI
  • 在打字稿文件上启用 Eslint

    在 webstorm eslint 设置中 有一个 额外 eslint 选项 字段 在此 我补充道 ext ts 来自埃斯林特文档 http eslint org docs user guide command line interface
  • 乘客问题:“没有要加载的文件”--/config/environment

    我一直在研究这个问题 并到处发现类似问题的参考资料 但尚未找到解决方案 我已经安装了 guest 2 2 11 和 nginx 0 7 64 当我启动并点击 Rails URL 时 我收到一个错误页面 通知我加载错误 没有要加载的文件 pa
  • 按下“Ctrl + C”按钮处理 C# 控制台应用程序

    如何处理同时按下的两个按钮 Ctrl C 不是在 WindowsForms 应用程序中 而是在控制台 C 应用程序中 我怀疑你想设置Console TreatCtrlCAsInput http msdn microsoft com en u
  • UIBarButton 没有改变

    IBOutlet weak var playStopButton UIBarButtonItem var playStopArray UIBarButtonSystemItem Pause UIBarButtonSystemItem Pla
  • pandas udf showString 简单示例错误

    我开始在使用此 身份 pandas udf 在 EMR 集群上运行的 Pyspark Jupyter 笔记本上使用 pandas udf 并且收到以下错误 pandas udf df schema PandasUDFType GROUPED
  • 批量将文件从子文件夹移动到父文件夹

    这是我的场景 这是我的文件夹结构 C DOCS Project1 docname1 image jpg docname2 image jpg docname3 image jpg C DOCS Project2 docname1 image
  • 什么样的面试问题适合 C++ 手机屏幕?

    很想了解人们的想法 我经常进行采访 在我的职业生涯中已经有足够多的时间来反思这些采访 并且我注意到了各种各样的问题 我专门做了这个 C 但值得注意的是 有人通过电话问我算法复杂性问题 我什至不是指哈希查找与二叉树的复杂性 我的意思更像是分析
  • 在 Oracle SQL / PL-SQL 中将德语特殊字符转换为英语等效字符

    我想将表的一列中的所有德语字符替换为相应的英语字符 当我尝试使用 Replace 函数时 它没有返回丰硕的结果 我想将所有德语特殊字符替换为 Ae Oe Ue oe ae ue ss 请让我知道如何执行 我需要更改任何数据库设置吗 请在下面
  • Python 3.4 解码字节

    我正在尝试用 python 编写一个文件 并且在编写文件之前找不到解码字节对象的方法 基本上 我正在尝试解码这个字节字符串 Les xc3 x83 xc2 xa9vad xc3 x83 xc2 xa9s 这是我试图恢复的原始文本 Les v
  • 使用 .net core 为 NLog 注入服务的自定义目标

    我正在使用 NLogNLog Extensions Logging用于 aps net 核心支持 我需要创建一个自定义目标并将服务注入到目标的构造函数中 以下代码永远不会被执行 public MyTarget IService servic
  • 在前台服务中运行网络代码后仍然收到“网络使用过多(后台)”警告

    通过参考处理和解决 网络使用过多 后台 的正确方法 https stackoverflow com questions 54489501 proper way to tackle and resolve excessive network
  • 最短路径图算法助力Boost

    我有一个矩形网格形状的 DAG 其中水平边缘始终指向右侧 垂直边缘始终指向下方 边缘具有与之相关的正成本 由于矩形格式 节点使用从零开始的行 列来引用 这是一个示例图 现在 我想进行搜索 起始顶点将始终位于左列 索引为 0 的列 和图的上半