Python CPLEX API:二进制变量的条件迭代

Python CPLEX API:二进制变量的条件迭代,python,iteration,graph-theory,mathematical-optimization,cplex,Python,Iteration,Graph Theory,Mathematical Optimization,Cplex,我正在研究一个图论问题。假设我们想要找到一个图G=(V,E),这样就存在一个V的分区X,其中最多包含k个等价类。当S是分区X的成员时,变量p_S取值1,否则取0。所以我们有一个约束,对于V的所有子集S,所有变量p_S的和至多是k 所以我想做的是迭代所有的p_值为1,并根据我从S中提取的元素定义更多的约束。这些约束将保持等价类的成员共享一些共同的属性 是否有可能以这种方式访问p_S变量?我该如何操作 或者,我知道如果允许在约束中使用二进制变量作为系数,我可以不迭代二进制变量。可能吗 提前谢谢 线性

我正在研究一个图论问题。假设我们想要找到一个图G=(V,E),这样就存在一个V的分区X,其中最多包含k个等价类。当S是分区X的成员时,变量p_S取值1,否则取0。所以我们有一个约束,对于V的所有子集S,所有变量p_S的和至多是k

所以我想做的是迭代所有的p_值为1,并根据我从S中提取的元素定义更多的约束。这些约束将保持等价类的成员共享一些共同的属性

是否有可能以这种方式访问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)
来自docplex.mp.model导入模型
mdl=Model(name='binaryproduct')
x=mdl.binary\u var(name='x')
y=mdl.binary\u var(name='y')
z=mdl.binary_var(name='z')
#z==x*y
mdl.add_constraint(x+y是基于索引的。要在解决方案值设置为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 def主(模型文件): #读入模型文件。 c=cplex.cplex() c、 读取(模型文件) #求解模型并打印解决方案和状态。 c、 解决() 打印(“解决方案值:”,c.Solution.get_objective_value()) 打印(“解决方案状态:{0}({1})”。格式( c、 解决方案。获取\u状态\u字符串(), c、 解决方案。获取_status()) #显示解决方案值为1的所有二进制变量。 types=c.variables.get_types() nvars=c.variables.get_num() binvars=[idx代表idx,典型 在zip中(范围(nvars),c.variables.get_types() 如果typ==c.variables.type.binary] inttol=c.parameters.mip.tolerance.integraity.get() binvars_at_one=[idx代表idx,val 在zip中(binvars,c.solution.get_值(binvars))
如果abs(val-1.0)在一般情况下,你需要对它进行线性化。是的,
如果允许我在约束中使用二进制变量作为系数
是这背后的基本概念,但你不能将两个变量相乘,也就是说,你需要对这些乘积进行线性化(binary*binary,binary*int,binary*cont)(通过附加变量和约束)。对于每种线性化,都需要不同的方法和假设(例如,先验边界)!因为这是非常依赖于模型的(我们不知道),没有更多要说的了。谢谢你的回复。我不理解线性化的概念,你能提供一个二进制*二进制的例子吗?它不一定与我的模型有关。,@sascha这些都是很好的例子,谢谢!如果你对你的回答做出正式的回答,我会接受的。所以,线性化二进制变量的乘积ables涉及制定包含右侧决策变量的约束。我刚刚意识到,在Python CPLEX API中,右侧必须是一个实数。那么我该如何实现这一点呢?感谢您的努力。您的回答让我意识到,我对问题的措辞一开始毫无意义,因为它会ld要求在解决优化问题之前有解值,并根据它们有条件地定义更多的约束。因此,我将坚持sascha指出的线性化。没问题。但是,解决原始模型,添加更多约束,然后在循环中再次解算,直到达到某个期望状态,这种情况并不少见d、 默认情况下,CPLEX将保留前一个解算的解算信息,并将其用作后续解算的起始信息。我假设您正在考虑这样做。这很有趣!我不知道这一点。我想这实际上是我制定的问题的正确答案,因此我接受这一点。