- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我刚刚克服了弄清楚如何使用 List monad 进行不确定性计算的困难。不过,我相信我的算法将受益于广度优先搜索,而不是从 List monad 中获得的深度优先搜索。
这是显示我的算法有趣部分的摘录。它是逻辑谜题 Akari 的求解器。
solve :: Game -> [Game]
solve game = do
let ruleBasedSolverResult = applyRuleBasedSolversUntilSteady game
guard $ consistant ruleBasedSolverResult
if solved ruleBasedSolverResult
then return ruleBasedSolverResult
else speculate ruleBasedSolverResult
speculate :: Game -> [Game]
speculate game = do
coord <- coords game
guard $ lightableUnlit game coord
let solutions = solve $ light game coord
if null solutions
then solve $ exclude game coord
else solutions
基本上,它应用了一些基本的确定性规则来看看是否可以解决问题。如果没有,它会尝试在不同的地方放置灯光。如果一盏灯在递归解决后使谜题变得不一致,它会在该灯所在的位置放置一个排除标记并继续进行。如果它在放置灯光时找到解决方案,则会将其添加到解决方案列表中。
这工作正常,但速度很慢,因为通常有一个明显的选择来推测哪个坐标,这将很快导致不一致的谜题,并让你只用一个(或两个)级别的搜索来放置一个 x,但是如果直到搜索进行到一半时它才会选择该坐标,然后它最终会首先咀嚼一堆无趣的东西。因此广度优先搜索思想。
我在谷歌上搜索了诸如“广度优先非决定论单子(monad)”之类的内容,得到了一些对我来说很难理解的结果,例如:
Control.Monad.Omega对于我所需要的东西来说,这似乎有点矫枉过正,因为它似乎可以防止无限发散的决定论,而我的情况并非如此,而且我并不完全理解它。
Control.Monad.WeightedSearch Control.Monad.Omega 的文档建议在将其用作 Monad 时使用它,但我认为权重对于我的需求来说也有点过分了。我可能只有 2 个权重,一个用于有解决方案的事物,另一个用于没有解决方案的事物。
Control.Monad.Level我不相信这能达到我想要的效果,因为只有树的叶子才有值(value)。
Data.Tree我认为这可能是我想要使用的,但我不确定如何转换我的 List 单子(monad)代码来使用它,尽管我觉得有一种漂亮的方法。
我的下一个问题将是关于如何并行化它:)
最佳答案
免责声明:我不是这项工作的专家!
基本上,你必须使用不同的 monad。由于 ListT
monad 转换器执行深度优先,因此他们提出了一个新的 monad 转换器 LogicT
,它执行广度优先。 (如果您对 monad 转换器不感兴趣,您只需将转换器应用于 Id
即可获取常规 monad)。
首先,他们认识到其他方法的缺陷:
the straightforward depth-first search performed by most implementations of MonadPlus is not fair: a non-deterministic choice between two alternatives tries every solution from the first alternative before any solution from the second alternative. When the first alternative offers an infinite number of solutions, the second alternative is never tried, making the search incomplete. Indeed, as our examples in Section 3 show, fair backtracking helps more logic programs terminate.
[...]
The second deficiency in many existing backtracking monads is the adoption of Prolog’s cut, which confounds negation with pruning. Theoretically speaking, each of negation and pruning independently makes logic programming languages more expressive
[...]
The third practical deficiency is the often-forgotten top-level interface: how to run and interact with a computation that may return an infinite number of answers? The most common solution is to provide a stream that can be consumed or processed at the top- level as desired. But in the case of monad transformers, this solution only works if the base monad is non-strict (such as Haskell’s lazy list monad and LazyST). In the case where the base monad is strict, the evaluation may diverge by forcing the evaluation of the entire stream, even if we only desire one answer.
然后,他们提出了一个基于 LogicT
monad 转换器和 msplit
函数的解决方案。尽管代码链接已损坏,但我在 Hoogle 中搜索了 LogicT
并找到了 this .
我希望阅读本文能够为您提供该主题的良好背景知识,并帮助您了解如何使用您已经找到的项目。
如果您发现本文有用,请不要忘记查看其引用文献以及引用它的其他论文!
关于haskell - 如何将列表一元函数转换为广度优先搜索?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22333634/
我在我的应用程序中使用 Hibernate Search。其中一个子集合被映射为 IndexedEmbedded。子对象有两个字段,一个是 id,另一个是日期(使用日期分辨率到毫秒)。当我搜索 id=
The App Engine Search API有一个 GeoPoint 字段。可以用它来进行半径搜索吗?例如,给定一个 GeoPoint,查找位于特定半径内的所有文档。 截至目前,它看起来像 Ge
客户对我正在做的员工管理项目提出了这个新要求,以允许他们的用户进行自定义 bool 搜索。 基本上允许他们使用:AND、OR、NOT、括号和引号。 实现它的最佳方法是什么?我检查了 mysql,它们使
很想知道哪个更快 - 如果我有一个包含 25000 个键值对的数组和一个包含相同信息的 MySQL 数据库,搜索哪个会更快? 非常感谢大家! 最佳答案 回答这个问题的最好方法是执行基准测试。 关于ph
我喜欢 smartcase,也喜欢 * 和 # 搜索命令。但我更希望 * 和 # 搜索命令区分大小写,而/和 ?搜索命令遵循 smartcase 启发式。 是否有隐藏在某个地方我还没有找到的设置?我宁
我有以下 Marklogic 查询,当在查询控制台中运行时,它允许我检索具有管理员权限的系统用户: xquery version "1.0-ml"; import schema namespace b
我希望当您搜索例如“A”时,所有以“A”开头的全名都会出现。因此,如果名为“Andreas blabla”的用户将显示 我现在有这个: $query = "SELECT full_name, id,
我想在我的网站上添加对人名的搜索。好友列表已经显示在页面上。 我喜欢 Facebook 这样做的方式,您开始输入姓名,Facebook 只会显示与查询匹配的好友。 http://cl.ly/2t2V0
您好,我在我的网站上进行搜索时遇到此错误。 Fatal error: Uncaught Error: Call to undefined function mysql_connect() in /ho
声明( 叠甲 ):鄙人水平有限,本文为作者的学习总结,仅供参考。 1. 搜索介绍 搜索算法包括深度优先搜索(DFS)和广度优先搜索(BFS)这两种,从起点开始,逐渐扩大
我正在为用户列表使用 FuturBuilder。我通过 futur: fetchpost() 通过 API 获取用户。在专栏的开头,我实现了一个搜索栏。那么我该如何实现我的搜索栏正在搜索呢? Cont
我正在使用 MVC5,我想搜索结果并停留在同一页面,这是我在 Controller (LiaisonsProjetsPPController) 中执行搜索操作的方法: public ActionRes
Azure 搜索中的两种方法 Upload 与 MergeOrUpload 之间有什么区别。 他们都做完全相同的事情。即,如果文档不存在,它们都会上传文档;如果文档已经存在,则替换该文档。 由于这两种
实际上,声音匹配/搜索的当前状态是什么?我目前正在远程参与规划一个 Web 应用程序,该应用程序将包含和公开记录的短音频剪辑(最多 3-5 秒,人名)的数据库。已经提出了一个问题,是否可以实现基于用户
在商业应用程序中,具有数百个面并不罕见。当然,并非所有产品都带有所有这些标记。 但是在搜索时,我需要添加一个方面查询字符串参数,其中列出了我想要返回的所有方面。由于我事先不知道相关列表,因此我必须在查
当我使用nvcc 5.0编译.cu文件时,编译器会为我提供以下信息。 /usr/bin/ld: skipping incompatible /usr/local/cuda-5.0/lib/libcud
我正在使用基于丰富的 Lucene 查询解析器语法的 Azure 搜索。我将“~1”定义为距离符号的附加参数)。但我面临的问题是,即使存在完全匹配,实体也没有排序。 (例如,“blue~1”将返回“b
我目前有 3 个类,一个包含 GUI 的主类,我在其中调用此方法,一个包含数据的客户类,以及一个从客户类收集数据并将其放入数组列表的 customerList 类,以及还包含搜索数组列表方法。 我正在
假设我有多个 6 字符的字母数字字符串。 abc123、abc231、abc456、cba123、bac231 和 bac123 。 基本上我想要一个可以搜索和列出所有 abc 实例的选择语句。 我只
我有这个表 "Table"内容: +--------+ | Serial | +--------+ | d100m | <- expected result | D100M | <- expect
我是一名优秀的程序员,十分优秀!