docplex:找到值为 1 的二元决策变量
docplex: Find the binary decision variables with value 1
我有一个 MIP 模型,其中包含一些二进制变量集,例如 y_{rnt}。我不想在每个索引上循环(如下所示),而是只想打印(存储)变量,使 y_{rnt}=1。 docplex 在 python 中提供任何功能吗?
多循环识别示例(低效):
# R, N, and T are inputs. We also have the solution as the output of the MIP model
x = 0
for r in range(1, R+1):
for n in range(1, N+1):
for t in range(1, T+1):
if solution.get_value(y[r, n, t]) == 1:
x = x + 1
假设您的 y
变量定义为变量 dict,Docplex 在解决方案对象上提供 get_value_dict
方法。此方法将变量字典转换为具有相同键的值字典。
此外,如果您传递 keep_zeros=False
则零值将被丢弃。
请注意,零值使用精度(默认为 1e-6)进行测试,因为 Cplex 中的所有值都是浮点数,包括二进制变量值。这意味着您的上述代码可能会“遗漏”二进制变量,其值将由 Cplex 输出为 0.99999。
总结一下:
xd = sol.get_value_dict(vd, keep_zeros=False)
其中 vd
是可变字典,returns 是具有相同键的新字典,其中值是来自 sol
的非零值。
如果您只对变量感兴趣,请使用此字典的键。
我有一个 MIP 模型,其中包含一些二进制变量集,例如 y_{rnt}。我不想在每个索引上循环(如下所示),而是只想打印(存储)变量,使 y_{rnt}=1。 docplex 在 python 中提供任何功能吗?
多循环识别示例(低效):
# R, N, and T are inputs. We also have the solution as the output of the MIP model
x = 0
for r in range(1, R+1):
for n in range(1, N+1):
for t in range(1, T+1):
if solution.get_value(y[r, n, t]) == 1:
x = x + 1
假设您的 y
变量定义为变量 dict,Docplex 在解决方案对象上提供 get_value_dict
方法。此方法将变量字典转换为具有相同键的值字典。
此外,如果您传递 keep_zeros=False
则零值将被丢弃。
请注意,零值使用精度(默认为 1e-6)进行测试,因为 Cplex 中的所有值都是浮点数,包括二进制变量值。这意味着您的上述代码可能会“遗漏”二进制变量,其值将由 Cplex 输出为 0.99999。
总结一下:
xd = sol.get_value_dict(vd, keep_zeros=False)
其中 vd
是可变字典,returns 是具有相同键的新字典,其中值是来自 sol
的非零值。
如果您只对变量感兴趣,请使用此字典的键。