or-tools 在這種情況下如何使用 OnlyEnforceIf

hkisthebest

例子:

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在這種情況下如何再次使用結果

在這種情況下如何使用 python 遞歸?

在這種情況下,如何使用 lambda 避免空值?

這種情況下的播種機

如何在使用 Countifs() 時擺脫這種情況下的數組大小錯誤

在這種情況下,如何從 API 調用中 console.log 數據?

在這種特殊情況下如何自動生成日期?

在這種情況下如何在熊貓中創建滯後功能?

numpy 在這種情況下的實現

計算這種情況下的時間差

為什麼在這種情況下使用引用,在 F# 中

在這種情況下,什麼可以代替這個按鈕 RaiseEvent?

為什麼在這種情況下字典查找速度不快?

為什麼在這種情況下左右浮動不起作用?

C# - 在這種情況下 FirstOrDefault() 是否返回 null?

void(os << args)。在這種情況下 void 是什麼意思?

react-testing-library 在這種情況下找不到元素

為什麼 nargout 返回 -1?在這種情況下如何獲得正確數量的函數輸出?

架構/邏輯問題 - 在這種情況下如何僅重建一個消費者小部件?- Riverpod

如何在 Firestore 數據庫中對這種情況進行建模?

單擊命令窗口似乎會停止程序執行,如何防止這種情況?

在這種情況下,為什麼 shared_ptr 對像在沒有鎖定的情況下運行良好?

如何在不需要使用 fmod 的情況下糾正這個算術運算?

在這種情況下,為什麼 Laravel 集合上的“reject()”方法返回關聯數組?

使用 livewire defer,如果輸入值有文本,則單擊分頁鏈接時會發送該值 - 如何阻止這種情況?

如何在沒有 if else 語句的情況下驗證這些變量?

這兩種訂閱事件的方式之間的區別,我是否需要在第二種情況下取消訂閱

我的第二個容器佔用了所有空間。如何避免這種情況

為什麼會出現這種情況?使用 Windows WSL (ubuntu 20.04) 時的 c lib 問題