Java 约束满足有效解的特例

Java 约束满足有效解的特例,java,algorithm,optimization,constraints,Java,Algorithm,Optimization,Constraints,我试图解决java中一般约束满足问题的一个特例 基本上,我有多个变量,每个变量都取离散值,每个变量都由它所具有的所有可能值的集合来定义(把它想象成Java中的枚举,这会有所帮助) 我也有多组条件(将一个条件视为变量上多个方程的系统,它们都是一元约束:换句话说,形式变量=可能值),目标是找出是否有一组变量值满足每组中至少一个条件(它可能满足同一组中的多个)。我将把这个特定集合称为解决方案。我要寻找的是所有可能的解决方案 到目前为止,我唯一的想法基本上是暴力 这是一个具体的例子,因此事情更清楚:

我试图解决java中一般约束满足问题的一个特例

基本上,我有多个变量,每个变量都取离散值,每个变量都由它所具有的所有可能值的集合来定义(把它想象成Java中的枚举,这会有所帮助)

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

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

这是一个具体的例子,因此事情更清楚:

  • s={a,b,c},v={1,2,3},n={p,k,m}
  • 第一条件组:
    c1={s=a和v=2},c2={s=b}。
  • 第二个条件组:
    c1={n=p和v=2}
  • 第三条件组:
    c1={s=a和n=p},c2={s=c}
在这种情况下,如果我们采用
(s=a,v=2,n=p)
:它满足所有三组的第一个条件,因此是问题的解决方案

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

请注意,组内的条件不一定相互排斥

任何能比暴力更有效的方法的洞察,无论是数据结构还是算法,都将是伟大的,因为我必须解决数百万个变量数量相当多的系统(30个变量,每个变量大约有15个值,100个这样的条件)


Edit1:数据约束
如果
N
是每个问题将具有的变量数量,那么
就有点宽泛了。虽然我认为我理解这个例子,但没有完全正式的描述允许非常具体的建议。这取决于具体情况,如果这是NP难还是非NP难;如果计数/枚举是指数还是非指数。你为什么需要所有的解决方案离子?你需要这些还是只需要它们的数量?可能有成倍的多,这是一个问题。基本模型很自然地被称为SAT模型,并且可以非常有效地解决(一些解算器是增量的,可以枚举所有解算器;同时重用他们已经获得的知识).这是我正在研究的一个更大问题的一小部分,但我肯定需要所有的解决方案,因为事实上,每一组解决方案都会把我带到一个新的问题,就像我在构建一棵树并沿着树往下走一样。但正如我所说的,问题不是无限的,我知道变量的数量总是小于30,v的数量每个变量可以采用的值将始终小于15,并且我永远不会达到每个问题100个条件。我将尝试阅读SAT问题,也许这是我可以采用的路径。很难遵循。如果有~10^8个解决方案(注意潜在的组合爆炸),您甚至无法检查深度为2的树。因此,您可能需要某种特定的解决方案(这不再是决策问题,而是优化问题)我知道,请看编辑的部分,我对解决一般的问题一点也不感兴趣,我知道这可能是NP难的,我只是在寻找一种方法,在我所拥有的约束条件下,根据我所知道的关于我输入的数据来工作。我确实以抽象的形式来表述这个问题,但这只是为了解释它,我n更清晰的方式。考虑到编辑/假设(尽管我仍然对解决方案的数量持怀疑态度),没有什么能打败SAT解算器。因此,我建议尝试这种方法。