Python元素的求和和和连续时间约束
我有这样的数据Python元素的求和和和连续时间约束,python,artificial-intelligence,constraint-programming,Python,Artificial Intelligence,Constraint Programming,我有这样的数据 a = [10, 11, 12, 13, 14] b = [15, 16, 17, 18, 19] c = [20, 21, 22, 23, 24] 我想检查列表中每个元素的第I个元素的总和,即元素的总和是否大于50,其中I=[0,1,2,3,4] 我还想检查总和是否连续三次大于50 在python中,有没有一种方法可以作为约束满足问题来实现这一点 我尝试了以下方法(使用此CSP模块:),但这会打印每个列表中所有可能值的组合,但我想进行元素求和
a = [10, 11, 12, 13, 14]
b = [15, 16, 17, 18, 19]
c = [20, 21, 22, 23, 24]
from constraint import *
problem = Problem()
problem.addVariable("a", [10, 11, 12, 13, 14])
problem.addVariable("b", [15, 16, 17, 18, 19])
problem.addVariable('c', [20, 21, 22, 23, 24])
problem.addConstraint(lambda a,b,c: a+b+c>50, ("a","b","c"))
for x in problem.getSolutions():
print x
结果(共72个答案)
所需答复:
{'a': 12, 'c': 22, 'b': 17}
{'a': 13, 'c': 23, 'b': 18}
{'a': 14, 'c': 24, 'b': 19}
另外,如何添加约束来检查总和大于50的连续次数
我知道我可以使用lambda函数来实现这一点,但如果可能的话,我想使用CSP库,因为以后可能会有更多的约束,而且列表的数量和每个列表中的元素数量可能会增加到1000
a = [10, 11, 12, 13, 14]
b = [15, 16, 17, 18, 19]
c = [20, 21, 22, 23, 24]
z = zip(a, b, c)
print map(lambda (x,y,z): x+y+z>50, z)
我建议你调查一下。例如,下面的一些代码将查找并计算总和大于50的连续列的运行次数
from itertools import groupby
a = [10, 11, 12, 13, 14]
b = [15, 16, 17, 18, 19]
c = [20, 21, 22, 23, 24]
data = [a, b, c]
def keyfunc(t):
return sum(t) > 50
for k, g in groupby(zip(*data), keyfunc):
if k:
g = list(g)
print(g, len(g))
输出
[(12, 17, 22), (13, 18, 23), (14, 19, 24)] 3
虽然我理解你在这里所说的“连续”是什么意思,但这似乎不容易转化为约束。使用附加变量
I
:三个数组中的索引。关于连续:约束编程的要点通常是不考虑生成解的顺序。好的解算器的目标是最小化生成第一个解的时间,因此通常以无顺序方式生成解。将其与数据库进行比较:如果未指定orderby
,则大多数数据库不会对检索顺序提供任何硬保证。
[(12, 17, 22), (13, 18, 23), (14, 19, 24)] 3