【问题标题】:Random solution to a set of integer constraints一组整数约束的随机解
【发布时间】:2014-01-12 04:15:18
【问题描述】:

我有一组想要解决的整数约束。约束可以由大于、小于或等于某个常数的变量的添加组成。

例子:

A >= 20
A <= 30
B <= 10
A + B <= 25
...

会有数百个这样的简单约束,而在实践中,常量的值要大得多(数十万)。

但是,我不只是想要 解决这些限制:我想要来自解决方案空间的随机 解决方案。这并不意味着每个解决方案都必须具有相等的概率(我认为不枚举它们是不可能的?)但我想要的是,例如对于变量 A,解决方案通常不是 20 或 30,而是介于两者之间的值同样可能(甚至更有可能)被选中。

什么样的技术适合这类问题?我不知道该去哪里找,因为大多数算法都专注于寻找最佳或快速或最小的解决方案,而不是随机的解决方案。

【问题讨论】:

  • 一种(可能效率极低)的方法是trial and error:在空间中生成一个随机点并测试它是否满足所有约束。重复直到一个点过去。
  • 约束也是线性的吗?是否有任何项是两个或多个变量的乘积?
  • 问题域是什么?它可能会为如何解决问题提供一些见解。
  • @TedHopp:那会非常昂贵。某种引导式随机搜索可能是一种选择。
  • 只有当可行区域的体积与生成随机试验的体积相比非常小时,试验和错误才会“非常昂贵”。这完全取决于约束的性质以及您如何限制试用生成空间。这带来了另一个反复试验的问题:可行区域是否有界?

标签: algorithm random linear-programming constraint-programming


【解决方案1】:

许多约束编程系统都有一个搜索启发式(称为“indomain_random”或类似的东西),它以随机顺序给出解决方案(给定一些种子)。这是一个简单问题的 MiniZinc 模型:

 var 20..30: A;
 var 0..10: B;     
 solve :: int_search([A,B], first_fail, indomain_random, complete) satisfy;
 constraint A + B <= 25;
 output [ show([A,B])];

以下是一些使用 Gecode 的 FlatZinc 求解器的种子的一些解决方案:

Seed   Solution
---------------
0      [22,0]
2      [25,0]
3      [22,2]

【讨论】:

  • 感谢您的提示。我的项目是用 Java 编写的,我之前曾涉足过 JaCoP,它似乎支持这种启发式方法。我去看看。
  • 它似乎很有魅力。使用 JaCoP 实现起来真的很容易,而且我得到了看似随机的结果。感谢您的提示!
  • 有趣的是,虽然在启发式中使用随机化会产生随机结果,但它并不能保证在可能的解决方案上的任何分布。有更先进的技术可用于有效地启发式地对整个解决方案空间进行采样,但这可能比这里需要的要多。两个例子是books.nips.cc/papers/files/nips19/NIPS2006_0084.pdfauai.org/uai2012/papers/160.pdf
【解决方案2】:

我将首先在与其他节点的变量交互的所有节点之间建立关系。

遍历您的图表,将不依赖其他节点的所有节点标记为已访问。然后迭代依赖于这些节点的每个节点,缩小它们的范围(增加最小值和减少最大值),以使其公式一致。因此,如果您有 A.min=10, A.max=20, B.min = 10, A+B=25,您可以将 A.max 更改为 15(因为 B 必须为 10,并且 25-10=15)。您刚刚将 A 的范围缩小了 50%。

如果你建立一个主节点,这会变得更容易:如果A+B=25,A依赖B还是B依赖A?使您的图成为有向图更容易处理,因为有向图中的算法更简单。

完成所有这些操作后,您会注意到出现了孤岛:这是一件好事,因为孤岛代表提供隔离墙的各个图形 - 如果您尝试试错法,您只需要重试孤岛未能进入一致状态。

【讨论】:

    【解决方案3】:

    不是一个完整的答案,但可能有用,而且评论太长了:

    知道解空间是凸的可能对您有所帮助。这意味着,如果您有两个解决方案 A1, B1, C1A2, C2, B2,那么它们之间的任何三元组也是一个解决方案。

    (这里,“中间”表示在[0,1]范围内有一些实数t,所以:

    • Anew = t * A1 + (1 - t) * A2
    • Bnew = t * B1 + (1 - t) * B2
    • Cnew = t * C1 + (1 - t) * C2

    要了解原因,您可以尝试将Anew, Bnew, Cnew 的这些表达式插入您的不等式中,并且不等式将扩展为真,因为它们对A1, B1, C1A2, B2, C2 这样做。)

    您可以使用此信息来限制您需要搜索的n 空间的区域。例如,如果您找到一个解决方案,并且您想知道您的解决方案空间在某个方向上延伸了多远,您可以对已知解决方案运行类似二进制搜索的操作。等等……

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-25
      • 2022-01-23
      • 2023-03-29
      • 2013-08-29
      • 2016-05-06
      • 1970-01-01
      • 1970-01-01
      • 2013-10-17
      相关资源
      最近更新 更多