Python CPLEX API:二进制变量的条件迭代
Python CPLEX API: Conditional iteration on binary variables
我正在研究一个图论问题。假设我们要找到一个图 G=(V,E),使得 V 的分区 X 最多包含 k 个等价 classes。当 S 是分区 X 的成员时,变量 p_S 取值 1,否则取值为 0。所以我们有一个约束,即对于 V 的所有子集 S,所有变量 p_S 的总和最多为 k。
所以我想做的是遍历所有值为 1 的 p_S 并根据我从 S 中提取的元素定义更多约束。这些约束将保留等价的成员 class 分享一些相互的 属性。
是否可以通过这种方式访问 p_S 变量,我该怎么做?
或者,如果我被允许在我的约束中使用二进制变量作为系数,我知道我可以不用迭代我的二进制变量。这可能吗?
提前致谢!
线性化示例:
from docplex.mp.model import Model
mdl = Model(name='binaryproduct')
x = mdl.binary_var(name='x')
y = mdl.binary_var(name='y')
z = mdl.binary_var(name='z')
# z==x*y
mdl.add_constraint(x+y<=1+z, 'ct1')
mdl.add_constraint(z<=x, 'ct2')
mdl.add_constraint(z<=y, 'ct3')
#end of z==x*y
mdl.solve()
for v in mdl.iter_binary_vars():
print(v," = ",v.solution_value)
CPLEX Python API 是基于索引的。要迭代解决方案值设置为 1 的所有二元变量,我们需要查询变量类型和解决方案值并进行相应的过滤。这是一个简单的例子:
import sys
import cplex
def main(modelfile):
# Read in a model file.
c = cplex.Cplex()
c.read(modelfile)
# Solve the model and print the solution and status.
c.solve()
print("Solution value:", c.solution.get_objective_value())
print("Solution status: {0} ({1})".format(
c.solution.get_status_string(),
c.solution.get_status()))
# Display all binary variables that have a solution value of 1.
types = c.variables.get_types()
nvars = c.variables.get_num()
binvars = [idx for idx, typ
in zip(range(nvars), c.variables.get_types())
if typ == c.variables.type.binary]
inttol = c.parameters.mip.tolerances.integrality.get()
binvars_at_one = [idx for idx, val
in zip(binvars, c.solution.get_values(binvars))
if abs(val - 1.0) <= inttol]
print("Binary variables with a solution value equal to one:")
for varname in c.variables.get_names(binvars_at_one):
print(" ", varname)
if __name__ == "__main__":
if len(sys.argv) != 2:
raise ValueError("usage: {0} <model>".format(sys.argv[0]))
main(sys.argv[1])
有关更多信息,请参阅 Cplex.variables and Cplex.solution 的文档。
我正在研究一个图论问题。假设我们要找到一个图 G=(V,E),使得 V 的分区 X 最多包含 k 个等价 classes。当 S 是分区 X 的成员时,变量 p_S 取值 1,否则取值为 0。所以我们有一个约束,即对于 V 的所有子集 S,所有变量 p_S 的总和最多为 k。
所以我想做的是遍历所有值为 1 的 p_S 并根据我从 S 中提取的元素定义更多约束。这些约束将保留等价的成员 class 分享一些相互的 属性。
是否可以通过这种方式访问 p_S 变量,我该怎么做?
或者,如果我被允许在我的约束中使用二进制变量作为系数,我知道我可以不用迭代我的二进制变量。这可能吗?
提前致谢!
线性化示例:
from docplex.mp.model import Model
mdl = Model(name='binaryproduct')
x = mdl.binary_var(name='x')
y = mdl.binary_var(name='y')
z = mdl.binary_var(name='z')
# z==x*y
mdl.add_constraint(x+y<=1+z, 'ct1')
mdl.add_constraint(z<=x, 'ct2')
mdl.add_constraint(z<=y, 'ct3')
#end of z==x*y
mdl.solve()
for v in mdl.iter_binary_vars():
print(v," = ",v.solution_value)
CPLEX Python API 是基于索引的。要迭代解决方案值设置为 1 的所有二元变量,我们需要查询变量类型和解决方案值并进行相应的过滤。这是一个简单的例子:
import sys
import cplex
def main(modelfile):
# Read in a model file.
c = cplex.Cplex()
c.read(modelfile)
# Solve the model and print the solution and status.
c.solve()
print("Solution value:", c.solution.get_objective_value())
print("Solution status: {0} ({1})".format(
c.solution.get_status_string(),
c.solution.get_status()))
# Display all binary variables that have a solution value of 1.
types = c.variables.get_types()
nvars = c.variables.get_num()
binvars = [idx for idx, typ
in zip(range(nvars), c.variables.get_types())
if typ == c.variables.type.binary]
inttol = c.parameters.mip.tolerances.integrality.get()
binvars_at_one = [idx for idx, val
in zip(binvars, c.solution.get_values(binvars))
if abs(val - 1.0) <= inttol]
print("Binary variables with a solution value equal to one:")
for varname in c.variables.get_names(binvars_at_one):
print(" ", varname)
if __name__ == "__main__":
if len(sys.argv) != 2:
raise ValueError("usage: {0} <model>".format(sys.argv[0]))
main(sys.argv[1])
有关更多信息,请参阅 Cplex.variables and Cplex.solution 的文档。