我注意到some of我遇到的“硬”组合问题可以根据某些类型的树搜索(如alpha-beta修剪,光束搜索或类似算法)进行投射。然而,编程它们似乎重复编码相同的事情,并且很容易犯错误。在我看来应该有一个实现这些算法的库,我应该被要求写的是
对不起,我没有提供任何具体的代码,但我想我已经解释了这个问题。如果我可以编写上述功能的代码,我不应该轻易地运行一些树/图搜索算法吗?是否有任何用户友好的库/框架可以轻松支持这一点?我喜欢它在Python或C / C ++中,但有兴趣听到任何建议。
编辑:更确切地说,我在谈论知情树搜索算法。
答案 0 :(得分:1)
Boost拥有Boost Graph Libary (BGL)。 Boost图库用户指南使用隐式图表对Knight的游览问题进行了example。
答案 1 :(得分:1)
在没有指定具体步骤的情况下表达问题是一种declarative programming。
你谈论'部分解决方案'。这是否意味着您正在考虑的问题有重叠的子问题?如果是这样,那么听起来你正在寻找一种方法来做一般dynamic programming。所有这一切真正意味着通过连续的步骤构建一个函数,解决问题的简单版本,然后迭代。这个Mathematica journal article中有一些不错的例子。
您考虑过Prolog了吗?它不是一个框架,但如果您愿意,搜索算法将内置于该语言中。使用Prolog之类的东西编写非常通用的constraint programming解决方案是可能的。在Python中有python-constraint library,这非常好 - 我过去曾经使用它。
答案 2 :(得分:1)
<强> QuickGraph 强>
对于任何愿意去.Net的人,请查看the open source QuickGraph library所有基于图形/树的处理。它巧妙地分离了与图形表示,算法,变形和表示相关的所有概念。它有很多扩展点,因此它应该能够支持大多数图形转换问题。
[编辑]此时QuickGraph提供的算法集不包括alpha-beta修剪或波束搜索,尽管其“搜索”算法部分包含11种其他方法,可为实施您最喜欢的遍历算法提供充分的指导,以及在时间我会想象它将支持alpha-beta和beam。
广告。 1 强>
它确实满足您的第一个标准,因为可以插入一个委托函数,该委托函数基于不完整的解决方案(即当前节点)返回几个更具体的解决方案(即相邻节点)。这由DelegateImplicitGraph
(和变体)处理,并且应该是内存有效的,因为它可以防止在内存中同时拥有整个搜索空间。
广告。 2 此外,算法可以采用自定义代理,例如最大/最小/预期成本算法(参见AStarShortestPathAlgorithm
)。这符合您的第二个标准。
总之,QuickGraph帮助您构建问题,为各种类型的问题提供插入算法,并允许您通过提供新算法来改进它。
答案 3 :(得分:1)
Fuego是一个开源的蒙特卡罗树搜索(与alpha-beta树搜索相对)平台,可以针对2人全信息游戏(最初创建目标Go)。它甚至可能比这更普遍。
编辑:我刚刚了解到它还具有alpha-beta搜索器。这是最近的一篇论文:http://webdocs.cs.ualberta.ca/~mmueller/ps/fuego-TCIAIG.pdf
答案 4 :(得分:0)
我在线找到了Peter Norvig的informed and uninformed search Python代码。它支持A-star搜索,可用于根据我所看到的一般问题进行编程。我想知道它是否足够快或者可以扩展到波束搜索,分支和绑定等。