2
我有這樣的數據。Python元素總和和連續次數約束
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模塊:https://labix.org/python-constraint),但是這打印了每個列表中所有可能的值的組合,但我想要做一個元素明智的總和。
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': 14, 'c': 24, 'b': 19}
{'a': 14, 'c': 23, 'b': 19}
{'a': 14, 'c': 22, 'b': 19}
.
.
.
{'a': 10, 'c': 24, 'b': 18}
{'a': 10, 'c': 24, 'b': 17}
所需答案:
{'a': 12, 'c': 22, 'b': 17}
{'a': 13, 'c': 23, 'b': 18}
{'a': 14, 'c': 24, 'b': 19}
而且,我怎麼添加約束檢查和進入更大的連續次數比50?
我知道我可以使用lambda函數來做到這一點,但如果可能的話,我想使用CSP庫,因爲稍後可能會有更多的約束條件,並且列表數量和每個列表中的元素數量可能會增加到1000s。
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)
雖然我理解你的「連續」的意思在這裏,這似乎並不容易翻譯成一個約束。 –
在三個數組中使用附加變量'i':* index *。 –
關於連續:約束點編程通常是不考慮解決方案產生的順序。良好的求解器旨在最大限度地減少生成第一個解決方案的時間,因此解決方案通常以未經過處理的方式生成。將它與數據庫進行比較:如果沒有指定ORDER BY,大多數數據庫不會對檢索順序提供任何硬性保證。 –