【问题标题】:How would you implement a heuristic search in Haskell?你将如何在 Haskell 中实现启发式搜索?
【发布时间】:2017-05-12 12:52:39
【问题描述】:

在 Haskell 或其他一些函数式编程语言中,您将如何实现启发式搜索?

以搜索空间九拼图为例,它是一个 3x3 的网格,有 8 个瓷砖和 1 个孔,您将瓷砖移动到孔中,直到您正确组装了一张图片。启发式是“曼哈顿启发式”,它评估棋盘位置,将每个瓷砖与其目标位置的距离相加,将水平方格数加上每个瓷砖需要移动到的垂直方格数作为距离正确的位置。

我一直在阅读 John Hughes 关于漂亮打印的论文,因为我知道漂亮的打印机会回溯以找到更好的解决方案。我正在尝试了解如何按照这些思路概括启发式搜索。

===

请注意,我在这里的最终目标不是为 9-puzzle 编写求解器,而是学习一些用 FP 语言编写高效启发式搜索的通用技术。我也有兴趣了解是否有代码可以在更广泛的此类问题中泛化和重用,而不是解决任何特定问题。

例如,搜索空间可以通过将状态映射到状态列表的函数以及描述一种状态如何转换到另一种状态的一些“操作”来表征。还可以有一个目标函数,将 State 映射到 Bool,指示何时达到目标 State。当然,启发式函数将状态映射到反映估计得分的数字。搜索的其他描述是可能的。

【问题讨论】:

    标签: haskell search functional-programming heuristics


    【解决方案1】:

    我认为它不一定是 FP 或 Haskell 特有的(除非您将列表用作“多种可能性”单子,如 Learn You A Haskell For Great Good)。

    一种方法是编写一个采用以下内容的递归函数:

    • 当前状态(即板配置)
    • 可能是一些路径元数据,例如,从初始配置开始的步数(这只是递归深度),或者已经考虑的所有状态的记忆图
    • 可能是某些决策、元数据,例如伪随机数生成器

    在每个递归调用中,函数都会获取状态,并检查它是否是所需的结果。如果没有,它会

    • 如果它使用记忆图,检查是否已经考虑过选择

    • 如果它使用递归步数,检查是否进一步追求选择

    • 如果它决定递归调用从该状态发出的可能选择(例如,如果有不同的瓷砖可以推入洞中),它可以根据启发式(或者可能基于启发式的顺序伪随机)

    该函数将返回是否成功,如果使用它们,则返回记忆图和/或伪随机数生成器的更新版本。

    【讨论】:

    • 您链接中的单子列表和骑士任务部分对我很有用,谢谢。
    猜你喜欢
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多