如何从多路径 Dijkstra 重建路径?

2023-12-10

我目前正在编写一个用于图形的 PHP 库。我已经成功实现了单路径 Dijkstra 算法,但现在在路径重建阶段很难实现多路径版本。

取下图:

Graph

为了简单起见,该图只有从顶点 A 到 J 的路径,经过多个其他顶点,这些顶点的成本都是相等的,即每条路径的边权重加起来为 10。修改后的 Dijkstra 正确地生成以下输出(这是数组$this->prev):

Array
(
    [A] => 
    [B] => Array
        (
            [0] => A
        )

    [C] => Array
        (
            [0] => A
        )

    [D] => Array
        (
            [0] => C
        )

    [E] => Array
        (
            [0] => C
        )

    [F] => Array
        (
            [0] => E
            [1] => D
        )

    [G] => Array
        (
            [0] => A
        )

    [H] => Array
        (
            [0] => G
        )

    [I] => Array
        (
            [0] => H
        )

    [J] => Array
        (
            [0] => B
            [1] => F
            [2] => I
        )

)

当前的单路径 Dijkstra 路径重建算法的实现如下:

public function get($dest)
{
    $destReal = $dest;
    $path = array();
    while (isset($this->prev[$dest])) {
        array_unshift($path, $dest);
        $dest = $this->prev[$dest];
    }
    if ($dest === $this->start) {
        array_unshift($path, $dest);
    }

    return array(
        'path' => $path,
        'dist' => $this->dist[$destReal]
    );
}

有没有办法修改上面的内容,以便它返回我的所有路径paths大批?我已经考虑过使用堆栈或 DFS,但无法想出解决方案。我也给了foreach循环和递归都尝试过,没有效果。

我本质上想要发生的是要处理的结果如下:

  • J 连接到 B,B 连接到 A,因此$paths[0] = ['J', 'B', 'A']
  • J 连接到 F,F 连接到 E 和 D,因此继续通过 E,记住返回到 F,然后创建另一条通过 D 的路径,结果是paths[1] = ['J', 'F', 'E', 'C', 'A'] and $paths[2] = ['J', 'F', 'D', 'C', 'A']
  • J 连接到 I,I 连接到 H,H 连接到 G,G 连接到 A,结果$paths[3] = ['J', 'I', 'H', 'G', 'A']

任何帮助,将不胜感激!


实际上,我命名为“enumerate”的修改后的 DFS 函数解决了这个问题。为了后代的利益,这里是我用来将多路径 Dijkstra 的输出转换为路径数组的代码:

/**
 * Returns all shortest paths to $dest from the origin vertex $this->start in the graph.
 *
 * @param string $dest ID of the destination vertex
 *
 * @return array An array containing the shortest path and distance
 */
public function get($dest)
{
    $this->paths = [];
    $this->enumerate($dest, $this->start);

    return array(
        'paths' => $this->paths,
        'dist' => $this->dist[$dest],
    );
}

/**
 * Enumerates the result of the multi-path Dijkstra as paths.
 *
 * @param string $source ID of the source vertex
 * @param string $dest   ID of the destination vertex
 */
private function enumerate($source, $dest)
{
    array_unshift($this->path, $source);
    $discovered[] = $source;

    if ($source === $dest) {
        $this->paths[] = $this->path;
    } else {
        if (!$this->prev[$source]) {
            return;
        }
        foreach ($this->prev[$source] as $child) {
            if (!in_array($child, $discovered)) {
                $this->enumerate($child, $dest);
            }
        }
    }

    array_shift($this->path);
    if (($key = array_search($source, $discovered)) !== false) {
        unset($discovered[$key]);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从多路径 Dijkstra 重建路径? 的相关文章

随机推荐

  • 计算字符串中子字符串出现的次数

    如何计算 Python 字符串中给定子字符串出现的次数 例如 gt gt gt foo bar foo numberOfOccurrences foo 2 To get indices of the substrings see How t
  • 如何在 R 中求 5 分钟间隔的总和

    我有一个数据集 其中包含 6 个不同站点每分钟的降水量记录 我想对每个电台每 5 分钟进行一次汇总 这些是我的数据集的前 5 行 总共 17280 行 P alex P hvh P merlijn P pascal P thurlede P
  • Python加载带有UTF-8 BOM头的json文件

    我需要解析其他工具生成的文件 该工具无条件输出带有 UTF 8 BOM 标头 EFBBBF 的 json 文件 我很快发现这就是问题所在 因为 Python 2 7 模块似乎无法解析它 gt gt gt import json gt gt
  • 绘制 Windrose:制作浓度设置为颜色的污染玫瑰

    尝试绘制风玫瑰图 其中绘制了速度和方向 浓度决定了颜色 不幸的是 matplotlib 仅支持两个变量 可以制作一个很好的散点图来显示我想要的内容 但不确定如何将其分类 以便它像所附图像一样 Halliday et al 2016 应转换为
  • 拦截窗口窃取 Windows 全局焦点的尝试

    我是一名开发人员和长期 Windows 用户 痴迷于让我的系统尽可能方便使用 昨天 我想到了 Windows 中一直让我烦恼并且我认为理所当然的事情 我意识到我对它如何工作有更好的想法 我现在想知道是否有可能调整 Windows 以使其工作
  • 让用户在 IOS swift 中的应用程序外部保存 pdf

    我制作了一个 PDF 并将其保存在我的应用程序中 但我想让用户将 PDF 文档保存在我的应用程序外部的目录中 抱歉英语不好 我来自瑞士 格式化程序中的标记文本 这很重要吗 我必须使用它来做什么 我认为 UIGraphicsBeginPDFC
  • 如何使用asio库获取IP地址的主机名?

    我正在尝试从 UDP 端点获取主机名 不过我不知道boost asio是否支持IP gt 主机名转换 有人可以回答我的问题吗 获取姓名信息就是你想要的 getnameinfo sockaddr addr sizeof addr hostna
  • 使用Django向前端传递JSON数据

    如果一般使用 Django 框架或 Python 有没有办法将 JSON 对象传递到 Web 模板的前端 例如 如果我想发送一个具有两个数组作为属性的对象 假设xvalues and yvalues 我如何能够使用 JavaScript 或
  • 用于生产的 Browserify/Babelify React(NODE_ENV 生产)

    我运行这个命令 browserify src js t babelify presets react gt build js 我得到了一个可以自己使用的文件 工作正常 但它的 NODE ENV 设置为开发 我得到一个关于下载 React D
  • 如何配置 Git 以信任来自 Windows 证书存储区的证书?

    目前我的目录中有以下条目 gitconfig在我的用户目录中 http sslCAInfo C Users julian lettner ssh git test pem 这设置了与 git 服务器交互时要使用的证书 我公司的 git 服务
  • Fluent NHibernate Child 集合持久化问题

    我有以下映射类 仅复制相关部分 public class CardTemplateMapping ClassMap
  • 在 Angular 中派生类型化 FormGroup 的值的类型

    使用 Angular 中新的类型化表单控件 我们可以做到这一点 interface MyFormGroup id FormControl
  • 添加 unicode 时出现编译时错误 \u0022

    我试图使用 unicode 在字符串中添加双引号 但是当我这样做时 我收到编译时间错误 String unicCode u0022 This line gives a compile time error 我得到的编译错误是 字符串文字未正
  • jface tableviewer 中的多行功能或换行文本功能

    我有一个 jface tableviewer 表 其中列中的数据仅出现在一行中 即使它是长文本 如果文本超过一定限制 我想要表格的换行文本功能或多行功能 有人可以帮我解决这个问题吗 请参阅此 SWT 片段在表项中绘制多行文本还有这个JFac
  • 如何从变量模板字符串中提取动态对象并再次将其合并?

    我有一根绳子 该字符串是在运行时从文件中提取的 可以是任何格式 其格式如下例所示 唯一的规则是括号内的单词必须转换为属性dynamic对象及其向用户询问的值 可能通过使用 winformsPropertyGrid or an ObjectL
  • C++单元测试框架[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我对 C 代码使用 Boost Test 框架 但它有两个问题 这可能是所有 C 测试框架所共有的 无法创建自动测试存根 例如 通过从选定的类中提取公共函数 您不能运行单个测试 您必
  • 如何在 SwiftUI 中创建 struct LazyList?

    我使用 ScrollView LazyVStack ForEach 而不是标准列表 如何围绕这个制作包装 struct ContentView View State private var items 1 2 3 var body some
  • 根据重叠日期计算活跃天/月

    我有数据列出大量客户的不同产品的开始和结束日期 不同产品的购买间隔可以重叠或有时间间隔 library lubridate library Hmisc library dplyr user id lt c rep 12 8 rep 33 5
  • 在 Python 3 中编写二进制文件,为什么我没有得到 9,10 和 13 的十六进制表示?

    我正在以二进制模式将字节 9 10 和 13 写入文件 但它们显示为 t n r 我不明白为什么 opening file in binary write mode with open C Users lenovo Desktop samp
  • 如何从多路径 Dijkstra 重建路径?

    我目前正在编写一个用于图形的 PHP 库 我已经成功实现了单路径 Dijkstra 算法 但现在在路径重建阶段很难实现多路径版本 取下图 为了简单起见 该图只有从顶点 A 到 J 的路径 经过多个其他顶点 这些顶点的成本都是相等的 即每条路