例子:
boolVar =
[[2,0,0,2],
[0,0,0,0],
[0,1,0,0],
[0,0,1,0]]
對於每個子數組,總和可能大於 3 或 0
我試過使用OnlyEnforceIf
,但 OnlyEnforceIf 將 boolvar 作為參數,我該怎麼做?
for i in range(n):
model.Add(sum(result[i]) > 3).OnlyEnforceIf(sum(result[i]) > validMinSum)
model.Add(sum(result[i]) == 0).OnlyEnforceIf(sum(result[i]) == 0)
我得到的錯誤是 AttributeError: 'BoundedLinearExpression' object has no attribute 'Index'
詳細說明@Stradivari 的評論和他發布的鏈接:您需要構造一個布爾變量,該變量強制等於您想要的表達式。例如:
// Implement b == (x >= 5).
model.Add(x >= 5).OnlyEnforceIf(b);
model.Add(x < 5).OnlyEnforceIf(b.Not());
或者就您的問題而言(未經測試,我沒有安裝 Python):
# ... assuming result is already defined as IntVar[][] jagged array
sum_greater_than_min = model.NewBoolVar("Sum > validMinSum");
model.Add(LinearExpression.Sum(result[i]) > 3).OnlyEnforceIf(sum_greater_than_min);
model.Add(LinearExpression.Sum(result[i]) <= 3).OnlyEnforceIf(sum_greater_than_min.Not);
sum_equal_zero = model.NewBoolVar("Sum==0");
model.Add(LinearExpression.Sum(result[i]) == 0).OnlyEnforceIf(sum_equal_zero);
model.Add(LinearExpression.Sum(result[i]) != 0).OnlyEnforceIf(sum_equal_zero.Not);
# Now enforce that one of the booleans must be true
a = model.NewBoolVar("");
model.AddMinEquality(a, [sum_greater_than_min, sum_equal_zero]));
model.Add(a == 1);
根據@Stradivari 的評論進行編輯以僅使用一個 BoolVar 來簡化(並更正了上面的錯字):
# ... assuming result is already defined as IntVar[][] jagged array
sum_greater_than_min = model.NewBoolVar("Sum > validMinSum");
model.Add(LinearExpression.Sum(result[i]) > 3).OnlyEnforceIf(sum_greater_than_min);
model.Add(LinearExpression.Sum(result[i]) == 0).OnlyEnforceIf(sum_greater_than_min.Not);
如果 sum_greater_than_min 為假,則強制執行約束 sum == 0。如果為真,則執行 sum > 3。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句