约束满足有效解的特例

时间:2018-08-25 18:12:46

标签: java algorithm optimization constraints

我正在尝试解决Java中一般约束满足问题的特例。

基本上,我有多个变量,每个变量取离散值,并且每个变量都由它具有的所有可能值的集合定义(认为它像Java中的枚举一样,会有所帮助)。

我也有多个条件组合(将条件看作是变量上的多个方程式的系统,并且它们都是一元约束:换句话说,变量=可能值的形式),目标是确定是否有一组变量值至少满足每个组中的一个条件(它可能满足同一组中的多个条件)。我将这个特定的集合称为解决方案。我正在寻找所有可能的解决方案。

到目前为止,我唯一的想法基本上是蛮力。

这是一个具体的示例,因此情况更加清楚:

  • s = {a,b,c}, v = {1,2,3}, n = {p,k,m}
  • 第一个条件组: c1 = {s=a and v=2}, c2 = {s=b}.
  • 第二个条件组: c1={n=p and v=2}
  • 第三条件组: c1={s=a and n=p}, c2 = {s=c}

在这种情况下,如果我们采用(s=a,v=2,n=p):它满足所有三个组的第一个条件,因此是解决问题的方法。

(s=b,v=2,n=p)并不是解决方案,因为它无法验证第三组的任何条件。实际上,这里可能的解决方案数是1。

请注意,组内的条件不一定是互斥的。

对于任何可能比蛮力高效运行的方式的见识,无论是数据结构还是算法,都将是很棒的,因为我将不得不解决数百万个这样的变量数量很大的系统(三十个变量的顶部每个都有15个值,并且有一百个这样的条件。)


编辑1:数据约束 如果N是每个问题将具有的变量数,则N<=30

如果|V|是变量V可以拥有的最大元素数,那么我知道问题中每个变量Max(|Vi|)<=15的{​​{1}}。

我还知道,如果Vi是每个问题的约束数,那么C

最后,我知道从统计学上来说,该问题的解决方案数量很少,这意味着大多数问题将只有一个解决方案,并且拥有8个以上解决方案的可能性少于99%。为了优化起见,我们甚至可以假设我对有超过10种解决方案的任何问题都不感兴趣。

0 个答案:

没有答案