【问题标题】:Library for tree search for combinatorial optimization problems用于组合优化问题的树搜索库
【发布时间】:2011-03-29 20:43:11
【问题描述】:

我注意到someof 我遇到的“困难”组合问题可以用某种类型的树搜索(如 alpha-beta 剪枝、束搜索或类似算法)进行转换。然而,对它们进行编程似乎是重复编码相同的东西,而且很容易出错。在我看来应该有一个实现这些算法的库,而我应该被要求写的是

  1. 解决方案的编码,即如何从不完整的解决方案中获得更具体的解决方案。这将给出树/图结构。
  2. 给出部分解决方案,如何获得最大/最小成本,以及可能的成本估算。
  3. 初始解决方案/部分解决方案。
  4. 也许是某种验证解决方案。

很抱歉我没有给出任何具体的代码,但我想我已经解释了这个问题。如果我可以为上述功能编写代码,我是否应该能够轻松地运行许多树/图搜索算法?是否有任何用户友好的库/框架可以轻松支持这一点?我希望它使用 Python 或 C/C++,但很想听听任何建议。

编辑:更准确地说,我说的是知情树搜索算法。

【问题讨论】:

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


    【解决方案1】:

    快速图表

    对于任何愿意使用 .Net 的人,请查看 the open source QuickGraph library 了解所有基于图形/树的处理。它巧妙地将与图形表示、算法、变异和表示相关的所有概念分开。它有很多扩展点,因此它应该能够支持大多数图形可转换问题。

    [编辑] QuickGraph 提供的算法集目前不包括 alpha-beta 修剪或束搜索,尽管它的“搜索”算法部分包括 11 种其他方法,为实现您最喜欢的遍历算法提供充足的指导,以及随着时间的推移,我想它会支持 alpha-beta 和光束。

    广告。 1 不过,它确实满足您的第一个标准,因为可以插入一个委托函数,该函数基于不完整的解决方案(即当前节点)返回几个更具体的解决方案(即相邻节点)。这是由DelegateImplicitGraph(和变体)处理的,并且应该是内存高效的,因为它可以防止一次将整个搜索空间放在内存中。 广告。 2 此外,算法可能会采用自定义委托,例如最大/最小/预期成本hueristics(请参阅AStarShortestPathAlgorithm)。这满足您的第二个标准。

    总之,QuickGraph 可以帮助您构建问题,为各种类型的问题提供插入式算法,并允许您通过提供新算法来改进它。

    【讨论】:

    • 像 BGL 一样,我没有看到任何使用它来搜索解决方案空间的选项,这更像是图遍历或已知图。虽然我知道可以在此基础上进行构建,就像可以在 BGL 或 networkx 上构建一样。
    【解决方案2】:

    Fuego 是一个开源的蒙特卡罗树搜索(相对于 alpha-beta 树搜索)平台,可以针对 2 人全信息游戏(最初是针对围棋创建的)。它甚至可能比这更笼统。

    http://fuego.sourceforge.net/

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

    【讨论】:

      【解决方案3】:

      表达一个问题而不指定具体步骤是一种declarative programming

      您谈论的是“部分解决方案”。这是否意味着您正在考虑的问题具有重叠的子问题?如果是这样,那么听起来您正在寻求一种通用dynamic programming 的方法。真正的意思是通过连续的步骤构建一个函数,解决问题的更简单版本,然后迭代。 Mathematica journal article 中有一些很好的例子。

      你考虑过Prolog吗?它不是一个框架,但如果您愿意,搜索算法是内置在语言中的。可以使用像 Prolog 这样的东西作为基础来编写非常通用的constraint programming 解决方案。在 Python 中,有 python-constraint library,非常好——我过去用过。

      【讨论】:

      • 声明式编程和动态编程并没有真正进行知情树搜索,除非我遗漏了什么。
      • @highBandWidth - 你能定义一下“知情树搜索”是什么意思吗?
      • 当然,cs.umd.edu/~nau/cmsc421/chapter04a.pdf 和 Peter Norvigs 的书在知情搜索方面有很好的部分。基本上,如果您知道树中的每个顶点都代表一个解决方案,并且相关的解决方案是它的孩子,您是否可以使用当前的解决方案来寻找更好的解决方案。想到 A* 和分支定界算法。
      • +1 获取有用信息。声明式编程是否指定搜索算法?
      【解决方案4】:

      Boost 有Boost Graph Libary (BGL)。 Boost Graph Library User's Guide 有一个example,介绍了使用隐式图的 Knight's tour 问题。

      【讨论】:

      • BGL 似乎有遍历已知图的算法,而不是搜索博弈树或优化决策。
      • 我刚刚发现BGL也有一些隐式图和a-star的支持。
      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 2012-09-12
        • 2012-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-25
        • 2015-12-05
        相关资源
        最近更新 更多