最短路径图算法助力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 的相关文章

  • 创建 DirectoryEntry 实例以供测试使用

    我正在尝试创建 DirectoryEntry 的实例 以便可以使用它来测试将传递 DirectoryEntry 的一些代码 然而 尽管进行了很多尝试 我还是找不到实例化 DE 并初始化它的 PropertyCollection 的方法 我有
  • fgets() 和 Ctrl+D,三次才能结束?

    I don t understand why I need press Ctrl D for three times to send the EOF In addition if I press Enter then it only too
  • Cygwin 下使用 CMake 编译库

    我一直在尝试使用 CMake 来编译 TinyXML 作为一种迷你项目 尝试学习 CMake 作为补充 我试图将其编译成动态库并自行安装 以便它可以工作 到目前为止 我已经设法编译和安装它 但它编译成 dll 和 dll a 让它工作的唯一
  • 为什么禁止在 constexpr 函数中使用 goto?

    C 14 对你能做什么和不能做什么有规则constexpr功能 其中一些 没有asm 没有静态变量 看起来相当合理 但标准也不允许goto in constexpr功能 即使它允许其他控制流机制 这种区别背后的原因是什么 我以为我们已经过去
  • 跨多个控件共享事件处理程序

    在我用 C 编写的 Windows 窗体应用程序中 我有一堆按钮 当用户的鼠标悬停在按钮上时 我希望按钮的边框发生变化 目前我有以下多个实例 每个按钮一个副本 private void btnStopServer MouseEnter ob
  • C# 中可空类型是什么?

    当我们必须使用nullable输入 C net 任何人都可以举例说明 可空类型 何时使用可空类型 https web archive org web http broadcast oreilly com 2010 11 understand
  • c 中的错误:声明隐藏了全局范围内的变量

    当我尝试编译以下代码时 我收到此错误消息 错误 声明隐藏了全局范围内的变量 无效迭代器 节点 根 我不明白我到底在哪里隐藏或隐藏了之前声明的全局变量 我怎样才能解决这个问题 typedef node typedef struct node
  • c# Asp.NET MVC 使用FileStreamResult下载excel文件

    我需要构建一个方法 它将接收模型 从中构建excel 构建和接收部分完成没有问题 然后使用内存流导出 让用户下载它 不将其保存在服务器上 我是 ASP NET 和 MVC 的新手 所以我找到了指南并将其构建为教程项目 public File
  • 基于范围的 for 循环中的未命名循环变量?

    有没有什么方法可以不在基于范围的 for 循环中 使用 循环变量 同时也避免编译器发出有关未使用它的警告 对于上下文 我正在尝试执行以下操作 我启用了 将警告视为错误 并且我不想进行像通过在某处毫无意义地提及变量来强制 使用 变量这样的黑客
  • 如何在 Team Foundation 上强制发表有意义的签入评论?

    我有一个开发团队有一个坏习惯 他们写道poor签入评论 当我们必须在团队基础上查看文件的历史记录时 这使得它成为一场噩梦 我已经启用了变更集评论政策 这样他们甚至可以在签到时留下评论 否则他们不会 我们就团队的工作质量进行了一些讨论 他们很
  • 初始化变量的不同方式

    在 C 中初始化变量有多种方法 int z 3 与 int 相同z 3 Is int z z 3 same as int z z 3 您可以使用 int z z 3 Or just int z 3 Or int z 3 Or int z i
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • 在 URL 中发送之前对特殊字符进行百分比编码

    我需要传递特殊字符 如 等 Facebook Twitter 和此类社交网站的 URL 为此 我将这些字符替换为 URL 转义码 return valToEncode Replace 21 Replace 23 Replace 24 Rep
  • ListDictionary 类是否有通用替代方案?

    我正在查看一些示例代码 其中他们使用了ListDictionary对象来存储少量数据 大约 5 10 个对象左右 但这个数字可能会随着时间的推移而改变 我使用此类的唯一问题是 与我所做的其他所有事情不同 它不是通用的 这意味着 如果我在这里
  • GDK3/GTK3窗口更新的精确定时

    我有一个使用 GTK 用 C 语言编写的应用程序 尽管该语言对于这个问题可能并不重要 这个应用程序有全屏gtk window与单个gtk drawing area 对于绘图区域 我已经通过注册了一个刻度回调gtk widget add ti
  • 将变量分配给另一个变量,并将一个变量的更改反映到另一个变量中

    是否可以将一个变量分配给另一个变量 并且当您更改第二个变量时 更改会瀑布式下降到第一个变量 像这样 int a 0 int b a b 1 现在 b 和 a 都 1 我问这个问题的原因是因为我有 4 个要跟踪的对象 并且我使用名为 curr
  • 更改显示的 DPI 缩放大小使 Qt 应用程序的字体大小渲染得更大

    我使用 Qt 创建了一些 GUI 应用程序 我的 GUI 应用程序包含按钮和单选按钮等控件 当我运行应用程序时 按钮内的按钮和字体看起来正常 当我将显示器的 DPI 缩放大小从 100 更改为 150 或 200 时 无论分辨率如何 控件的
  • C++ 成员函数中的“if (!this)”有多糟糕?

    如果我遇到旧代码if this return 在应用程序中 这种风险有多严重 它是一个危险的定时炸弹 需要立即在应用程序范围内进行搜索和销毁工作 还是更像是一种可以悄悄留在原处的代码气味 我不打算writing当然 执行此操作的代码 相反
  • 为什么 strtok 会导致分段错误?

    为什么下面的代码给出了Seg 最后一行有问题吗 char m ReadName printf nRead String s n m Writes OK char token token strtok m 如前所述 读取字符串打印没有问题 但
  • 不同类型的指针可以互相分配吗?

    考虑到 T1 p1 T2 p2 我们可以将 p1 分配给 p2 或反之亦然吗 如果是这样 是否可以不使用强制转换来完成 或者我们必须使用强制转换 首先 让我们考虑不进行强制转换的分配 C 2018 6 5 16 1 1 列出了简单赋值的约束

随机推荐

  • 如何通过 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 的列 和图的上半