使用 docplex python API 添加新变量的有效方法是什么?

What is the efficient way to add new variables using docplex python API?

我有一个关于 docplex 库的基本问题。 有谁知道从现有模型中获取 add/delete 变量的最佳方法是什么? 我正在使用以下代码创建决策变量

self.model.continuous_var_dict(self.N, lb=0)

我可以通过增加 self.N 的大小来再次 运行 这条线吗?

我也想知道是否有更新现有约束的有效方法,现在,我正在删除所有约束并使用以下代码添加新约束

self.model.remove_constraints(self.constrains)
self.constrains = self.model.add_constraints(
        self.model.sum(self.cons_coef[(i, k, p)] * self.x_mp[(k, p)] for k, p in self.N) == 1 for i in range(N))

如果我只想在列生成中添加新列怎么办?

您可以进行增量更改:

 from docplex.mp.model import Model

# original model

mdl = Model(name='buses')
nbbus40 = mdl.integer_var(name='nbBus40')
nbbus30 = mdl.integer_var(name='nbBus30')
mdl.add_constraint(nbbus40*40 + nbbus30*30 >= 300, 'kids')
mdl.minimize(nbbus40*500 + nbbus30*400)

mdl.solve()

mdl.export("c:\buses.lp")

for v in mdl.iter_integer_vars():
    print(v," = ",v.solution_value)

#now 350 kids instead of 300

print()
print("now 350 kids instead of 300")    

mdl.get_constraint_by_name("kids").rhs=350;
mdl.solve()

for v in mdl.iter_integer_vars():
    print(v," = ",v.solution_value)

# no more than 4 buses 40 seats

print()
print("no more than 4 buses 40 seats")


mdl.get_var_by_name("nbBus40").ub=4
mdl.solve()

for v in mdl.iter_integer_vars():
    print(v," = ",v.solution_value)

#change the objective so that cost for 40 seats is 450
#and remove the limit on the number of buses 40 seats

print()
print("change the objective so that cost for 40 seats is 450")
print("and remove the limit on the number of buses 40 seats  ")  

mdl.get_var_by_name("nbBus40").ub=1000
mdl.set_objective("min",nbbus40*450 + nbbus30*400);
mdl.solve()

for v in mdl.iter_integer_vars():
    print(v," = ",v.solution_value) 

这给出了

nbBus40  =  6.0
nbBus30  =  2.0

now 350 kids instead of 300
nbBus40  =  8.0
nbBus30  =  1.0

no more than 4 buses 40 seats
nbBus40  =  2.0
nbBus30  =  9.0

change the objective so that cost for 40 seats is 450
and remove the limit on the number of buses 40 seats  
nbBus40  =  8.0
nbBus30  =  1.0

您添加变量的方式(通过 continuous_var_dict)很好。是的,你可以重复调用continuous_var_dict来添加几批变量。在性能方面,docplex 应该以最快的方式将这些添加到 CPLEX。如果您对缓慢的性能感到惊讶,请分享具体细节。

要删除变量,请将它们从模型的 objective 和约束中删除。例如,使用 LinearExpr.remove_term.

要修改约束,您可以执行如下操作(参见 LinearConstraint.lhs):

for c in contraints:
   c.lhs += model.sum_vars(newvars)

docplex "incremental modeling" 示例演示了这一点(参见 here)。