Python CPLEX API:二进制变量的条件迭代
我正在研究一个图论问题。假设我们想要找到一个图G=(V,E),这样就存在一个V的分区X,其中最多包含k个等价类。当S是分区X的成员时,变量p_S取值1,否则取0。所以我们有一个约束,对于V的所有子集S,所有变量p_S的和至多是k 所以我想做的是迭代所有的p_值为1,并根据我从S中提取的元素定义更多的约束。这些约束将保持等价类的成员共享一些共同的属性 是否有可能以这种方式访问p_S变量?我该如何操作 或者,我知道如果允许在约束中使用二进制变量作为系数,我可以不迭代二进制变量。可能吗 提前谢谢 线性化示例: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变量?我该如何操作 或者,我知道如果允许在约束中使用二进制变量作为系数,我可以不迭代二进制变量。可能吗 提前谢谢 线性
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将保留前一个解算的解算信息,并将其用作后续解算的起始信息。我假设您正在考虑这样做。这很有趣!我不知道这一点。我想这实际上是我制定的问题的正确答案,因此我接受这一点。