约束满足(Hierarchical)Solver

时间:2013-02-27 16:38:57

标签: constraints solver linear-programming hierarchical constraint-programming

我需要在Java或.NET中建模约束满足(CSP)问题。该问题需要表示变量的层次结构。所以树的每个节点都是一个变量。

例如,如果变量C1是另一个变量C2的子节点,并且C1为真,那么C2应该为真,因为它是他的父节点。同时,如果分支中的变量节点为真,则表示其他分支中的所有变量都为假,因为在层次结构中只能选择一个分支。

我如何将其表示为CSP问题以及我可以在Java或.NET中使用哪个工具?

我必须对其进行编辑以提供更多详细信息,因为还有以下内容:

在我的问题中有两部分:在第一部分,有一个最大化函数q1 * x1 + q2 * x2 + q3 * x3 ..其中qi是系数(实数),xi是变量(可以是0或1)我必须选择一些最大化此功能的xi。换句话说,节点只能是0或1,我必须通过从层次结构中选择一个节点来最大化此功能。

同样,这些xi变量是树的节点,所以当我选择一些xi时,它们必须来自树的同一分支,并且一次只能选择一个分支。因此,我需要表示这些分层约束(第2部分)。可能最好将所有内容表示为lp问题,但我不知道如何用线性编程约束来表示树。

我不知道我是否可以同时使用最大化问题(第1部分)并强加CSP约束(而不是使用LP约束)。

3 个答案:

答案 0 :(得分:1)

Choco是一个用Java实现的约束求解器,它提供了一个Java API。听起来您想在模型中使用具体约束,即形式的约束

reify(otherConstraint(...), variable)

其中variable变为真或假,具体取决于是否满足otherConstraint。您可以通过引入辅助变量和添加reification约束来对树层次结构建模。然后,您可以将辅助变量与一组附加约束链接起来,以实现您所描述的效果。

或者,您可以使用简单的连接和约束的分离来为树建模 - 这是否可行将取决于确定变量赋值的其他约束。

答案 1 :(得分:1)

Java中存在许多用于约束满足问题(CSP)的求解器。这是一个不完整的清单:

那就是说,我认为使用CSP解算器在你的情况下是一种矫枉过正,除非你有一些你没有提到的其他约束。您所需要的只是将您的问题视为一个图形(树?),其中的节点对应于变量。然后采用叶节点并一直向上移动到顶部设置变量,并将所有剩余变量设置为false将为您提供解决方案。您只需要一个图表库,例如JGraphT

答案 2 :(得分:0)

Drools Planner(开源,java)scales beyond传统的CSP实现,在分数设计方面也更灵活(非线性约束,多分weightslevels ,...)但在找到它时无法识别最佳解决方案。