最快的跨平台 A* 实施?

2024-01-07

有这么多可用的实现,使用小网格的 C++ 执行速度最快(CPU 占用最少、二进制文件最小)、跨平台(Linux、Mac、Windows、iPhone)A* 实现是什么?

实施

谷歌返回:

  • http://www.heyes-jones.com/astar.html http://www.heyes-jones.com/astar.html(该网站上的大多数链接都已失效。)
  • http://www.grinninglizard.com/MicroPather http://www.grinninglizard.com/MicroPather(据说比 Heyes-Jones 慢。)
  • http://www.ceng.metu.edu.tr/~cuneyt/codes.html http://www.ceng.metu.edu.tr/~cuneyt/codes.html(通用 C++ 代码。)
  • http://swampthingtom.blogspot.com/2007/07/pathfinding-sample-using.html http://swampthingtom.blogspot.com/2007/07/pathfinding-sample-using.html
  • http://opensteer.sourceforge.net/ http://opensteer.sourceforge.net/(对游戏感兴趣,而不是 A*。)
  • Dijkstra 算法的堆栈溢出 https://stackoverflow.com/questions/938338/what-is-the-fastest-dijkstra-implementation-you-know-in-c

还有其他人吗?

车轮

正如所提出的,这个问题涉及重用(插入游戏),而不是重新发明(至少在性能被证明是一个问题之前)。事实可能证明 Dijkstra 实现(或通用寻路算法)更适合,或者最快的实现还不够快。我很欣赏替代算法的建议,但问题不是“我应该自己推出 A* 吗?”

  • 乔尔谈软件——非此处发明综合症 http://www.joelonsoftware.com/articles/fog0000000007.html
  • 编码恐怖:不要重新发明轮子 http://www.codinghorror.com/blog/archives/001145.html
  • 克服“非此发明综合症” http://www.developer.com/open/article.php/3338791/Overcoming-Not-Invented-Here-Syndrome.htm

查看其他寻路算法(例如宽度优先、深度优先、Minimax、Negamax 等)并权衡您的场景的优点和缺点。

升压也拥有 A 星级实施 http://www.boost.org/doc/libs/1_41_0/libs/graph/example/astar-cities.cpp。尝试以下这些说明 http://www.mani.de/backstage/?p=159在 iPhone 上构建 boost,但它可能不适合你:它不是 boost 的“完整端口”,并且可能会出错。

以下内容来自简而言之,算法 http://oreilly.com/catalog/9780596516246(Java,不是 C++,但也许你想移植它):

public Solution search( INode initial, INode goal ) {
  // Start from the initial state
  INodeSet open = StateStorageFactory.create( StateStorageFactory.TREE );
  INode copy = initial.copy();
  scoringFunction.score( copy );
  open.insert( copy );

  // Use Hashtable to store states we have already visited.
  INodeSet closed = StateStorageFactory.create( StateStorageFactory. HASH );
  while( !open.isEmpty() ) {
    // Remove node with smallest evaluation function and mark closed.
    INode n = open.remove();

    closed.insert( n );

    // Return if goal state reached.
    if( n.equals( goal ) ) { return new Solution( initial, n ); }

    // Compute successor moves and update OPEN/CLOSED lists.
    DepthTransition trans = (DepthTransition)n.storedData();
    int depth = 1;

    if( trans ! = null ) { depth = trans.depth + 1; }

    DoubleLinkedList<IMove> moves = n.validMoves();

    for( Iterator<IMove> it = moves.iterator(); it.hasNext(); ) {
      IMove move = it.next();

      // Make move and score the new board state.
      INode successor = n.copy();
      move.execute( successor );

      // Record previous move for solution trace and compute
      // evaluation function to see if we have improved upon
      // a state already closed
      successor.storedData( new DepthTransition( move, n, depth ) );
      scoringFunction.score( successor );

      // If already visited, see if we are revisiting with lower
      // cost. If not, just continue; otherwise, pull out of closed
      // and process
      INode past = closed.contains( successor );

      if( past ! = null ) {
        if( successor.score() >= past.score() ) {
          continue;
        }

        // we revisit with our lower cost.
        closed.remove( past );
      }

      // place into open.
      open.insert( successor );
    }
  }

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

最快的跨平台 A* 实施? 的相关文章

  • UIWebView 中的 PDF

    我正在创建一个杂志应用程序 我在 UIWebView 中显示杂志的每一页 不过 Web 视图不会用 PDF 填满屏幕 它周围有一个边界 我怎样才能全屏显示它 我还没有使用 UIWebView 尝试过此操作 但您也许可以执行类似的操作来以编程
  • 代码 GetAsyncKeyState(VK_SHIFT) & 0x8000 中的这些数字是什么?它们是必不可少的吗?

    我试图在按下按键的简单动作中找到这些数字及其含义的任何逻辑解释 GetAsyncKeyState VK SHIFT 0x8000 可以使用哪些其他值来代替0x8000它们与按键有什么关系 GetAsyncKeyState 根据文档返回 如果
  • iPhone 崩溃日志?

    我已经配置了一部 iPhone 并让用户安装了该应用程序 它失败 是否有崩溃日志可以让我看到 iPhone 上失败的原因 Ian 如果您可以使用 xcode 将 iPhone 连接到计算机 则在管理器窗口中它会显示每个应用程序崩溃的崩溃日志
  • 如何使用 Castle Windsor 将对象注入到 WCF IErrorHandler 实现中?

    我正在使用 WCF 开发一组服务 该应用程序正在使用 Castle Windsor 进行依赖注入 我添加了一个IErrorHandler通过属性添加到服务的实现 到目前为止一切正常 这IErrorHandler对象 一个名为FaultHan
  • C# 数据表更新多行

    我如何使用数据表进行多次更新 我找到了这个更新 1 行 http support microsoft com kb 307587 my code public void ExportCSV string SQLSyntax string L
  • 如何减少典型 iPhone 应用程序的启动时间?

    需要明确的是 这是一个普通的 iPhone 应用程序 而不是游戏 我在网上读过几次 一些开发人员提到他们正在努力改进 减少应用程序的启动时间 但从来没有提供任何关于如何做到这一点的良好背景信息 那么问题很简单 如何减少 iPhone 应用程
  • 在Linux中,找不到框架“.NETFramework,Version=v4.5”的参考程序集

    我已经设置了 Visual studio 来在我的 Ubuntu 机器上编译 C 代码 我将工作区 我的代码加载到 VS 我可以看到以下错误 The reference assemblies for framework NETFramewo
  • 将 Long 转换为 DateTime 从 C# 日期到 Java 日期

    我一直尝试用Java读取二进制文件 而二进制文件是用C 编写的 其中一些数据包含日期时间数据 当 DateTime 数据写入文件 以二进制形式 时 它使用DateTime ToBinary on C 为了读取 DateTime 数据 它将首
  • 如何在 Qt 应用程序中通过终端命令运行分离的应用程序?

    我想使用命令 cd opencv opencv 3 0 0 alpha samples cpp cpp example facedetect lena jpg 在 Qt 应用程序中按钮的 clicked 方法上运行 OpenCV 示例代码
  • 在 NaN 情况下 to_string() 可以返回什么

    我使用 VS 2012 遇到了非常令人恼火的行为 有时我的浮点数是 NaN auto dbgHelp std to string myFloat dbgHelp最终包含5008角色 你不能发明这个东西 其中大部分为0 最终结果是 0 INF
  • 如何在 C 中安全地声明 16 位字符串文字?

    我知道已经有一个标准方法 前缀为L wchar t test literal L Test 问题是wchar t不保证是16位 但是对于我的项目 我需要16位wchar t 我还想避免通过的要求 fshort wchar 那么 C 不是 C
  • C++ int 前面加 0 会改变整个值

    我有一个非常奇怪的问题 如果我像这样声明一个 int int time 0110 然后将其显示到控制台返回的值为72 但是当我删除前面的 0 时int time 110 然后控制台显示110正如预期的那样 我想知道两件事 首先 为什么它在
  • 用 UIView 像翻书一样翻页?

    我正在尝试在之间切换UIViews让它看起来就像你正在翻书的一页 The UIViewAnimationTransitionCurlUp如果我能让它向左或向右卷曲 那就非常接近了 这可能吗 我尝试过使用CATRansition但没有一种动画
  • OpenGL:仅获取模板缓冲区而没有深度缓冲区?

    我想获取一个模板缓冲区 但如果可能的话 不要承受附加深度缓冲区的开销 因为我不会使用它 我发现的大多数资源表明 虽然模板缓冲区是可选的 例如 排除它以利于获得更高的深度缓冲区精度 但我还没有看到任何请求并成功获取仅 8 位模板缓冲区的代码
  • 这个可变参数模板示例有什么问题?

    基类是 include
  • 使用 C 在 OS X 中获取其他进程的 argv

    我想获得其他进程的argv 例如ps 我使用的是在 Intel 或 PowerPC 上运行的 Mac OS X 10 4 11 首先 我阅读了 ps 和 man kvm 的代码 然后编写了一些 C 代码 include
  • Objective-C / C 给出枚举默认值

    我在某处读到过关于给枚举默认值的内容 如下所示 typedef enum MarketNavigationTypeNone 0 MarketNavigationTypeHeirachy 1 MarketNavigationTypeMarke
  • 是否可以在不连接数据库的情况下检索 MetadataWorkspace?

    我正在编写一个需要遍历实体框架的测试库MetadataWorkspace对于给定的DbContext类型 但是 由于这是一个测试库 我宁愿不连接到数据库 它引入了测试环境中可能无法使用的依赖项 当我尝试获取参考时MetadataWorksp
  • 不区分大小写的字符串比较 C++ [重复]

    这个问题在这里已经有答案了 我知道有一些方法可以进行忽略大小写的比较 其中涉及遍历字符串或一个good one https stackoverflow com questions 11635 case insensitive string
  • OpenCV SIFT 描述符关键点半径

    我正在深入研究OpenCV的SIFT描述符提取的实现 https github com Itseez opencv blob master modules nonfree src sift cpp 我发现了一些令人费解的代码来获取兴趣点邻域

随机推荐

  • 元素类型“META”必须以匹配的结束标记“”终止

    当我尝试使用 Java 在 GAE 服务器内 解析 XML 文件时 有时会出现以下错误 Parse org xml sax SAXParseException lineNumber 10 columnNumber 3 The element
  • Elixir exrm 版本在 edis start_link 上崩溃

    我对 Elixir 相当陌生 这是我尝试使用它发布的第一个应用程序exrm https github com bitwalker exrm 我的应用程序与 Redis 数据库交互 以消耗队列中的作业 使用exq https github c
  • HttpHandler 和会话状态的问题

    我正在尝试设计一个解决方案 该解决方案将模拟 App Offline htm 进行远程访问 但仍允许本地用户测试该网站 我发现了一些我正在尝试的选项 但最好的选项似乎不适用于我们的 ASP NET 2 0 站点 该站点依赖于在所有页面上启用
  • 如果 URL 与 slug 不匹配,则规范链接和 301 重定向

    我正在尝试在 django python 中实现类似于堆栈溢出的 URL 方案 例如 pk 与标题的 slug 一起存储在 URL 中 因此对于这个问题 id 4787731 URL 是 https stackoverflow com qu
  • jQuery fadeIn fadeOut 图像在 Firefox 中相差 1px

    我最近一直在使用 jQuery 实现图像滑块 所以我在 Firefox 中遇到一个问题 即淡入 淡出过渡会将图像的宽度或高度缩短 1 像素 但仅限于效果正在进行时 进度完成后 图像再次具有完整尺寸 找到了 将此样式添加到您的图像中 它将在
  • .NET 装箱/拆箱与转换性能

    我试图从性能角度了解两种解决方案中哪一种更受青睐 例如我有两段代码 1 装箱 拆箱 int val 5 Session key val int val2 int Session key 2 强制转换 IntObj具有int Value属性来
  • 仅在 Web 上启用 Outlook Web 加载项

    我开发了一个基于 Outlook Web 的加载项 为了安装它 我从 OWA 中的 管理加载项 页面添加了清单文件 https msdn microsoft com en us library office fp142256 aspx ht
  • 多重继承的不明确解决方法?

    我有一个名为 动物 的基类 以及继承自 动物 的一只狗和一只猫 还有一个名为dogcat的多重继承类 它继承自dog和cat 在动物中我有一种称为睡眠的方法 当我想使用dogcat的该方法时 我收到错误 DogCat sleep 不明确 我
  • 在 Ubuntu 14.04 上安装 Apache 2.4.7

    我有以下问题 在 Ubuntu 上安装 Apache 2 4 7 我在目录 etc apache2 sites available 中创建了文件
  • 如何将文本与 QTableWidget 中的单元格中心对齐

    我正在使用基于 Qt4 的 PyQt 我的编辑器是 PyCharm 2017 3 我的 python 版本是 3 4 我正在从网站上抓取一些文本 我试图将该文本与 QTableWidget 中单元格的中心对齐 item QTableWidg
  • 结合正则表达式来验证英国和美国的电话号码

    我有两个正则表达式 一个用于验证英国号码 来自我的上一个问题 https stackoverflow com questions 23195191 validate uk phone number including its area co
  • 连续对数算术:游程编码项上的取整运算符

    我正在尝试在 Bill Gosper 上实现基本算术连续对数 https perl plover com yak cftalk INFO gosper txt 它们是连分数的 变异 允许术语协同例程发出和消耗非常小的消息 即使是非常大或非常
  • WPF 列表框分隔符显示为不同的厚度

    我创建了一个自定义列表框 其中每个项目均由分隔符分隔 但我看到了奇怪的问题 列表项之间的分隔符的厚度不是恒定的 如果我改变列表框的位置 它会改变 如下所示列表框图像 https i stack imgur com uKt8n png 下面是
  • 如何禁用 VS datagridview 中的第一个自动选择?

    我在 Visual Studio C 中创建了一个使用 datagridview 的应用程序 现在 当我分配该 datagridview 的数据源时 它会自动选择第一行 并执行我的代码进行选择 由于我经常重新分配该数据源 因此这是不可取的
  • 当 kubectl apply-ing 时替换所有文件中的环境变量

    假设一个文件夹中有许多 Kubernetes 配置文件kubernetes我们希望将它们全部应用 kubectl apply f kubernetes n MyNamespace 其中一些文件包含需要首先替换的环境变量 没有模板化 http
  • 显示和更新 FormArray 内的 FormGroup

    我正在显示带有 ngFor 的 FormArray 我想做的是 当我单击 ngFor 中的某个项目时 用该项目的 任务 属性填充该项目 此外 当我键入 更新输入内容时 原始表单也会被更新 修补 HTML
  • Bash 脚本编写、检查错误、记录日志

    这是为 bash fu 巫师准备的一份 不 实际上 我只是开玩笑 除了我之外 你们可能都知道这一点 我正在尝试创建一个备份 shell 脚本 这个想法相当简单 在某个文件夹中查找超过 7 天的文件 将它们 tar gzip 到另一个目录 然
  • 如何在 Azure ARM 模板中设置环境变量

    我想在 ARM 模板中设置部署环境 以保证机器之间的环境相同 有没有办法为使用 ARM 模板创建的虚拟机设置环境变量 Windows 您可以使用自定义脚本扩展 https learn microsoft com en us azure vi
  • 是否可以在 Android 中将动画 gif 文件设置为我的应用程序的背景?

    我正在为珠宝店做应用程序 我想将 gif 图像设置为我的应用程序的背景 可以设置吗 是的 您可以设置 gif 图像 但这不会为您的 gif 图像设置动画 您需要将 gif 图像显式提取到所有帧中 然后使用动画图像作为 gif 这里是示例
  • 最快的跨平台 A* 实施?

    有这么多可用的实现 使用小网格的 C 执行速度最快 CPU 占用最少 二进制文件最小 跨平台 Linux Mac Windows iPhone A 实现是什么 实施 谷歌返回 http www heyes jones com astar h