python - 如何检查列表中元素之间的约束/这是约束编程吗?

标签 python constraints constraint-programming

我有许多可变大小的列表,其中包含具有属性 foo 的同一类的实例,并且对于每个列表,我必须应用如下规则:

  • 如果有元素 foo=A 则 [B,C,D] 中不能有带 foo 的元素
  • 如果有元素 foo=X 则必须至少有一个在 [Y,Z] 中带有 foo
  • MIN 和 MAX 元素之间可以有 foo=BAR

组合以上三个规则可能足以表达我需要的任何类似约束。这有点像软件包中的依赖性检查,但我有数量但缺少版本:)

一个天真的方法是:

R_CONFLICT={ A: [B,C,D] }
R_DEPENDS ={ X: [ [Y,Z], W, .. } # means: A depends on either Y or Z, and W
R_MIN     ={BAR: n, BAZ: m}
R_MAX     ={BAR: o, BAZ: p}
# now just loop over lists to check them..

这是Constraint programming的问题吗? ?我实际上不需要解决某事来获得结果,我需要根据某些约束验证我的列表并检查它们是否满足。您如何对这个问题进行分类以及如何解决它?

就其值(value)而言,我正在用 Python 编码,但我欢迎通用编程答案 :) 如果事实证明我必须深入研究约束编程,我可能会先尝试 python-constraint .

最佳答案

简短的回答 - 是的,这可以使用约束规划来检查,实际上您正在提供一个解决方案并根据约束检查它,而不是让求解器在潜在的域中搜索匹配的解决方案。哪一种会使约束编程变得过大,尤其是当您使用 Python 时,它可以很容易地检查这些类型的条件。

我在这台机器上没有 Python,所以这段代码中可能有拼写错误/错误,但它显示了你所追求的,而不需要参与约束编程。

conflict = set([B, C , D])
foos = set([x.foo for x in list])
if A in foos:
    if len(foos & conflict): #Set intersection
         return false

len([x for x in list where x.foo == BAR]) #Gives you number of occurances of BAR

基本上我会说,除非约束变得更加复杂,或者您想要找到解决方案而不只是测试,否则我会坚持使用代码而不是约束编程。

关于python - 如何检查列表中元素之间的约束/这是约束编程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3666246/

相关文章:

python - 如何在python中对目录进行tar文件备份

python - Scrapy 抑制处理的错误

python - 从 Django 中的一种形式创建对象的多个实例

mysql - jbpm 5, mysql constraint violation error 在其他任务遇到permissionDenied异常后出现

sql - Oracle SQL 约束 where 子句

constraints - 如何说变量是线性规划中的三个值之一

php - PHP 中的约束编程

python - 如何读取excel中嵌入的excel并将嵌入文件中的信息存储在主excel文件中?

prolog - 逻辑引擎中的不确定性(根据本地地理产生合理的相对位置)

c# - 取决于 MSF 中决策的参数