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 的文档。