Optimization 组合优化问题的树搜索库

Optimization 组合优化问题的树搜索库,optimization,graph-theory,generic-programming,a-star,tree-search,Optimization,Graph Theory,Generic Programming,A Star,Tree Search,我注意到,我遇到的“硬”组合问题可以用某种类型的树搜索(如alpha-beta剪枝、beam搜索或类似算法)来解决。然而,对它们进行编程似乎是重复地编写相同的代码,而且很容易出错。在我看来,应该有一个实现这些算法的库,而我所要写的就是 解决方案的编码,即如何从不完整的解决方案中获得更具体的解决方案。这将给出树/图结构 给出部分解决方案,如何获得最大/最小成本,以及可能的成本估算 初始解/部分解 也许是某种验证方案 很抱歉,我没有给出任何具体的代码,但我想我已经解释了这个问题。如果我能为上面描述的

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

  • 解决方案的编码,即如何从不完整的解决方案中获得更具体的解决方案。这将给出树/图结构
  • 给出部分解决方案,如何获得最大/最小成本,以及可能的成本估算
  • 初始解/部分解
  • 也许是某种验证方案
  • 很抱歉,我没有给出任何具体的代码,但我想我已经解释了这个问题。如果我能为上面描述的函数编写代码,我是否应该能够轻松地运行许多树/图搜索算法?是否有任何用户友好的库/框架可以轻松支持这一点?我希望它是用Python或C/C++编写的,但我有兴趣听取任何建议


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

    Boost有最新的功能。《Boost Graph Library用户指南》使用隐式图对骑士之旅问题进行了详细说明。

    在不指定具体步骤的情况下表达问题是一种错误

    你说的是“部分解决方案”。这是否意味着您正在考虑的问题类型有重叠的子问题?如果是这样的话,那么听起来你是在寻求一种方法来做一般性的事情。真正的意思是通过连续步骤构建函数,解决问题的更简单版本,然后迭代。这里有一些很好的例子


    你考虑过吗?它不是一个框架,但是搜索算法,如果你愿意的话,是内置在语言中的。可以使用Prolog之类的东西作为基础来编写非常通用的解决方案。在Python中,有一个非常好的,我以前使用过它。

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

    QuickGraph

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

    [编辑]尽管QuickGraph的“搜索”算法部分包括11种其他方法,为实现您最喜欢的遍历算法提供了充分的指导,但QuickGraph提供的一组算法目前不包括alpha-beta修剪或beam搜索,我想它最终会支持alpha-beta和beam

    广告1 但它确实满足您的第一个标准,因为可以插入一个委托函数,该函数基于不完整的解决方案(即当前节点)返回多个更具体的解决方案(即相邻节点)。这是由(和变体)处理的,并被认为是内存有效的,因为它防止在内存中同时拥有整个搜索空间。 ad.2此外,算法可能采用自定义委托,如最大/最小/预期成本统计(请参阅)。这符合您的第二个标准


    总之,QuickGraph可以帮助您组织问题,为各种类型的问题提供插入式算法,并允许您通过提供新算法对其进行改进。

    火地岛是一个开源的蒙特卡罗树搜索(与alpha beta树搜索相反)平台,可以针对两人全信息游戏(最初是为目标Go而创建的)。它甚至可能更为通用


    编辑:我刚刚了解到它还有一个alpha-beta搜索程序。这是最近的一篇文章:

    BGL似乎有遍历已知图的算法,而不是搜索游戏树或优化决策。我刚刚发现BGL还支持隐式图和a-star。声明式编程和动态编程实际上不支持med tree搜索,除非我遗漏了什么。@highBandWidth-你能定义一下“知情树搜索”是什么意思吗?当然,Peter Norvigs的书中有关于知情搜索的好章节。基本上,如果你知道树中的每个顶点代表一个解,而相关解是它的子解,你能使用当前解来搜索吗更好的解决方案。A*和分支定界算法浮现在脑海中。+1提供有用的信息。声明式编程是否指定了搜索算法?像BGL一样,我看不到使用它来搜索解决方案空间的任何选项,这更像是图遍历或已知的图。尽管我知道可以在此基础上构建,就像可以在BGL或n上构建一样etworkx。