树搜索组合优化问题的库

时间:2011-03-29 20:43:12

标签: optimization graph-theory generic-programming a-star tree-search

我注意到some of我遇到的“硬”组合问题可以根据某些类型的树搜索(如alpha-beta修剪,光束搜索或类似算法)进行投射。然而,编程它们似乎重复编码相同的事情,并且很容易犯错误。在我看来应该有一个实现这些算法的库,我应该被要求写的是

  1. 解决方案的编码,即如何从不完整的解决方案中获得更具体的解决方案。这将给出树/图结构。
  2. 给出部分解决方案,如何获得最高/最低成本,以及可能估算成本。
  3. 初始解决方案/部分解决方案。
  4. 也许是某种验证解决方案。
  5. 对不起,我没有提供任何具体的代码,但我想我已经解释了这个问题。如果我可以编写上述功能的代码,我不应该轻易地运行一些树/图搜索算法吗?是否有任何用户友好的库/框架可以轻松支持这一点?我喜欢它在Python或C / C ++中,但有兴趣听到任何建议。

    编辑:更确切地说,我在谈论知情树搜索算法。

5 个答案:

答案 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)。它甚至可能比这更普遍。

http://fuego.sourceforge.net/

编辑:我刚刚了解到它还具有alpha-beta搜索器。这是最近的一篇论文:http://webdocs.cs.ualberta.ca/~mmueller/ps/fuego-TCIAIG.pdf

答案 4 :(得分:0)

我在线找到了Peter Norvig的informed and uninformed search Python代码。它支持A-star搜索,可用于根据我所看到的一般问题进行编程。我想知道它是否足够快或者可以扩展到波束搜索,分支和绑定等。