OR-TOOLS - 如果某些 IntVar 的总和大于 0,如何设置 BoolVar 的值,否则为 0?
OR-TOOLS - How to set the value of a BoolVar if the sum of some IntVars is greater than 0, else 0?
我已经查看了大部分文档,但无法理解这一点。我正在使用 or-tools python 进行约束编程。我正在尝试找到一种方法,如果某些 IntVar 的总和大于 0,我可以将 BoolVar 的值设置为 1,否则 BoolVar 应该为 0。
我已经尝试了 AddImplication() 和 OnlyEnforceIf(),它们看起来很有希望,但 none 奏效了。尝试了一些其他的想法,但大多是出于绝望。
这段代码看起来像这样:
for warehouse in WAREHOUSES:
model.Add(y[warehouse] == 1).OnlyEnforceIf(sum(x[(warehouse, customer)] for customer in CUSTOMERS) > 0)
当前 returns:
AttributeError: 'BoundedLinearExpression' object has no attribute 'Index'
我猜错误是因为我需要将布尔值而不是表达式传递给 OnlyEnforceIf。我试过在一个单独的函数中进行计算,并且只传递 return 值 (True/False)。该程序运行但将所有 BoolVars 设置为 True,这不是很有帮助。
我已经用线性规划解决了这个已知的练习,所以我知道一些 BoolVars 应该是假的。
# x is the IntVar: dict with keys that are tuples and the IntVar as value
# y is the BoolVar
反过来做:
for warehouse in WAREHOUSES:
model.Add(sum(x[(warehouse, customer)] for customer in CUSTOMERS) > 0).OnlyEnforceIf(y[warehouse])
model.Add(sum(x[(warehouse, customer)] for customer in CUSTOMERS) == 0).OnlyEnforceIf(y[warehouse].Not())
我已经查看了大部分文档,但无法理解这一点。我正在使用 or-tools python 进行约束编程。我正在尝试找到一种方法,如果某些 IntVar 的总和大于 0,我可以将 BoolVar 的值设置为 1,否则 BoolVar 应该为 0。
我已经尝试了 AddImplication() 和 OnlyEnforceIf(),它们看起来很有希望,但 none 奏效了。尝试了一些其他的想法,但大多是出于绝望。
这段代码看起来像这样:
for warehouse in WAREHOUSES:
model.Add(y[warehouse] == 1).OnlyEnforceIf(sum(x[(warehouse, customer)] for customer in CUSTOMERS) > 0)
当前 returns:
AttributeError: 'BoundedLinearExpression' object has no attribute 'Index'
我猜错误是因为我需要将布尔值而不是表达式传递给 OnlyEnforceIf。我试过在一个单独的函数中进行计算,并且只传递 return 值 (True/False)。该程序运行但将所有 BoolVars 设置为 True,这不是很有帮助。
我已经用线性规划解决了这个已知的练习,所以我知道一些 BoolVars 应该是假的。
# x is the IntVar: dict with keys that are tuples and the IntVar as value
# y is the BoolVar
反过来做:
for warehouse in WAREHOUSES:
model.Add(sum(x[(warehouse, customer)] for customer in CUSTOMERS) > 0).OnlyEnforceIf(y[warehouse])
model.Add(sum(x[(warehouse, customer)] for customer in CUSTOMERS) == 0).OnlyEnforceIf(y[warehouse].Not())