- 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/
我正在使用“laravel/lumen-framework”:“5.7.*” 我有两个中间件,第一个 AuthTokenAuthenticate 应该应用于所有路由,因此它在 bootstrap/ap
当同时播放两个音频时...声音会相互抵消。如何解决这个奇怪的现象? 我有一些代码,其中单击按钮时有音频,并且每隔十秒就有音频(在后台服务中)。我有以下代码来在十秒间隔播放时停止按钮音频,并且工作正常:
我有一个功能可以在我的网站上搜索用户, 我的网站上还有一个面向 friend 的功能。 我有一个查询要在我的网站上搜索正确的用户,并且 我有一个查询可以确定用户的 friend ,他们都按应有的方式工
是否可以对记录使用 GROUP BY? 例如,我有一大堆联系人数据,可能包含也可能不包含所有信息 - 在 CSV 意义上,如果可能看起来像这样: Test User, Address1, Addres
如何在客户端 JavaScript 中创建一个环境,其中与用户界面和 View 相关的任何代码优先于其他代码? 我知道你可以使用 setTimeout([function],0); 将事情推到下一个刻
Jasmine 有没有办法定义测试失败的概率? 例如,现在 500'ing 的服务比不显示在页面上的简单内容更糟糕。 谢谢! 最佳答案 这不是单元或集成测试的工作方式。以太测试是否失败。并且您的套件中
我正在为我参与的一个项目开发一个 API。该 API 将由 Android 应用、iOS 应用和桌面网站使用。几乎所有 API 都只有注册用户才能访问。该 API 允许通过 WSSE 进行身份验证,这
我正在开发一些库并创建了这个有缺陷的代码: //------------------- Gmaps = {}; Gmaps.map = new Gmaps4RailsGoogle(); //there
我有一个使用[NSLocale ISOCountryCodes]获得的国家/地区的NSArray。如何排序此NSArray,以便可以将某些常用国家(地区)放在列表的顶部,同时将其余国家/地区按字母顺序
我正在为注册表编写代码,因为我正在从另一个文件中为电话号码列导入代码,但是当我将该代码放入其中时,您可以看到@include('layouts.phone');它显示为 当我放置@include('l
我刚刚遇到了 javascript 代码 file_upload_started = progress < 100; 我不知道如何阅读它,谷歌也没有真正出现太多。我什至不知道该怎么调用它,所以很难进行
目前,我正在 cppinstitute.org 学习 C 语言认证类(class)。在其中一个测验中,有一个如下的问题来识别输出。 int i = 1,j= 1; int w1,w2; w1 = (i
我想将无符号短值从 MSB 优先转换为 LSB 优先。做了下面的代码,但它不工作。有人可以指出我所做的错误吗 #include using namespace std; int main() {
考虑以下场景:我的应用程序有一些依赖于我自己的 POM 优先 Artifact (使用纯 Maven 构建)和一些依赖于我自己的 list 优先 Artifact (使用 Tycho 构建)。对于 P
拥有它应该是很自然的事情,我想知道是否有来自 TPL DataFlow 库的优先级缓冲区块的现成实现? 最佳答案 似乎实现这一目标的最佳方法是使用专门的 任务调度器 ,而不是实现您自己的 Buffer
我有一个 date 字段,它显示为从今天开始的天数。因此 2055-01-01 和 1950-01-01 将分别显示为正数和负数。现在我希望对这些进行排序,以便非负数按升序排在第一位,然后负数按降序排
我遇到一个问题,我看到我的事件类和悬停类正在 Firebug 中应用,但它没有优先于现有样式。 因此,如果我的元素设置了背景颜色,则事件和悬停背景颜色不会更改元素。 我该如何解决这个问题? 最佳答案
我正在考虑为 Salesforce Outbound Messaging 实现监听器应用程序。 walk through 使用已弃用的 ASMX Web 服务实现它。代码是使用带有/serverInt
对于每个表,EF 都会生成一个部分类,其中所有字段都可以公开访问,例如 public int ID { get; set; } 是否可以将 set 设为私有(private)?然后,我将只允许调用我的
我正在为水电站编写一个数据评估应用程序。我需要从服务器下载数据,该数据就在那里 - 作为 MySQL 表,格式化为 JSON 数组。现在,经过无数个小时的工作,我已经完成了连接到服务器、下载数据并将其
我是一名优秀的程序员,十分优秀!