Algorithm 一组整数约束的随机解

Algorithm 一组整数约束的随机解,algorithm,random,linear-programming,constraint-programming,Algorithm,Random,Linear Programming,Constraint Programming,我想解决一组整数约束。约束可以由大于、小于或等于某个常量的变量的添加组成 例如: A >= 20 A <= 30 B <= 10 A + B <= 25 ... A>=20 AI将首先建立与其他节点变量交互的所有节点之间的关系 通过图形标记所有不依赖其他节点的节点。然后迭代依赖于这些节点的每个节点,缩小它们的范围(增加最小值和减少最大值),使它们的公式保持一致。因此,如果你有A.min=10,A.max=20,B.min=10,A+B=25,你可以将A.max改为15(

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

例如:

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

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

通过图形标记所有不依赖其他节点的节点。然后迭代依赖于这些节点的每个节点,缩小它们的范围(增加最小值和减少最大值),使它们的公式保持一致。因此,如果你有
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?使图形成为有向图更容易处理,因为有向图中的算法更简单


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

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

它可以帮助你知道解空间是凸的。也就是说,如果您有两个解决方案
A1、B1、C1
A2、C2、B2
,那么它们之间的任何三元组也是一个解决方案

(此处,“中间”表示在
[0,1]
范围内有一些实数
t
,因此:

  • Anew=t*A1+(1-t)*A2
  • Bnew=t*B1+(1-t)*B2
  • Cnew=t*C1+(1-t)*C2
要了解原因,您可以尝试将
的这些表达式重新插入到不等式中,Bnew,Cnew
,不等式将扩展为true,因为它们用于
A1,B1,C1
A2,B2,C2


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

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

 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])];

一种(可能效率极低)方法是:在空间中生成一个随机点,并测试它是否满足所有约束。重复,直到一个点通过。约束也是线性的吗?这些术语是两个或多个变量的乘积吗?多米安的问题是什么?这可能会让我们对如何解决这个问题有一些见解。@TedHopp:那将是非常昂贵的。某种引导随机搜索可能是一种选择。只有当可行区域的体积与生成随机试验的体积相比非常小时,试错才是“昂贵的”。这完全取决于约束的性质以及如何约束试用生成空间。这就带来了另一个关于试错的问题:可行区域有界吗?谢谢你的提示。我的项目是用Java编写的,我以前也接触过JaCoP,它似乎支持这种启发式。我去看看。它好像很管用。使用JaCoP很容易实现,我得到的结果似乎是随机的。谢谢你的提示!也许有意思的是,虽然在启发式中使用随机化会给出随机结果,但它不能保证在可能的解上有任何类型的分布。有更先进的技术可以用于对整个解决方案空间进行有效的启发式采样,但这可能比这里需要的更多。两个例子是和。
Seed   Solution
---------------
0      [22,0]
2      [25,0]
3      [22,2]