我正在尝试解决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种解决方案的任何问题都不感兴趣。