【问题标题】:Constraint Satisfaction (Hierarchical) Solver约束满足(分层)求解器
【发布时间】:2013-02-27 16:38:56
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

  • 您的“最大化问题”是软约束,而您的“强制 CSP 约束”是硬约束。可行的解决方案不会破坏硬约束。最优解是使软约束最大化的可行解。大多数(如果不是全部)CSP 实现将支持硬约束和软约束(有些支持甚至不止这两个分数级别)。

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


【解决方案1】:

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

reify(otherConstraint(...), variable)

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

或者,您可以使用简单的约束结合和析取来为树建模——这是否可能取决于确定变量分配的其他约束。

【讨论】:

    【解决方案2】:

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

    也就是说,我认为在你的情况下使用 CSP 求解器是一种过度杀伤,除非你有一些你没有提到的其他限制。您所需要的只是将您的问题视为具有对应于变量的节点的图(树?)。然后取一个叶节点并一直到顶部设置变量,一路设置为 true 并将所有剩余变量设置为 false 将为您提供解决方案。为此,您只需要一个图形库,例如 JGraphT

    【讨论】:

      【解决方案3】:

      Drools Planner (open source, java) scales beyond 传统的 CSP 实现,并且在分数设计上也更加灵活(非线性约束,多个分数 weightslevels,...)但没有t 在找到最优解时识别它。

      【讨论】:

        猜你喜欢
        • 2019-06-03
        • 1970-01-01
        • 2022-11-10
        • 2017-04-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-06
        • 2012-12-28
        相关资源
        最近更新 更多