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

Posted

技术标签:

【中文标题】如何检查列表中元素之间的约束/这是约束编程吗?【英文标题】:How to check constraints between elements in a list / is this Constraint Programming? 【发布时间】:2011-04-09 15:17:42 【问题描述】:

我有许多可变大小的列表,其中包含具有属性 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的问题吗?我实际上不需要解决 某事来获得结果,我需要根据一些约束验证我的列表并检查它们是否满足。你会如何分类这个问题以及如何解决它?

对于它的价值,我正在使用 Python 进行编码,但我欢迎一个通用的编程答案 :) 如果事实证明我必须深入研究约束编程,我可能会从尝试 python-constraint 开始。

【问题讨论】:

【参考方案1】:

简短的回答 - 是的,这可以使用约束编程来检查,实际上您是在提供一个解决方案并根据约束检查它,而不是让求解器搜索匹配解决方案的潜力域。哪一种会导致约束编程过大,特别是如果您使用 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

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

【讨论】:

以上是关于如何检查列表中元素之间的约束/这是约束编程吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何获得 UITableView 约束?

如何检查视图中是不是已经存在约束?

如何约束视图中的元素?

打字稿:`| 的含义[T]`-用于数组中元素成员资格的编译时检查的约束

删除元素时使用 JoinTable 和 OrderColumn 的 Hibernate 单向 OneToMany 映射中的约束冲突

如何在 UIStackView 中动态设置元素之间的间距?