model.remove_constraint() 表现

model.remove_constraint() performance

我正在与 CPLEX/docplex 一起解决一个 LP 问题,该问题有很多不可行的约束,可行性中的大部分问题来自模型的自动制定,及其修道院很难察觉约束之间的冲突。

使用 docplex 函数 ConflictRefiner().refine_conflict(model) 我至少能够找到一组冲突的约束。

问题是,为了找到所有冲突的约束集,我必须使用函数 model.remove_constraint(constraint.name) 删除一些冲突的约束,并且该函数需要很长时间才能执行。

编辑 135.000 约束的时间是:

model.remove_constraint(constraint.name)
time= 124 sec
model.remove_constraint(constraint.element)
time= 126 sec

有没有一种方法可以比 model.remove_constraint(str_name_constraint) 更快地删除约束?有没有办法在约束中使用层次结构以避免约束之间的冲突?

(最后一题有点题外话,但和原题有关)

提前致谢!

最后我使用了一个解决方法,

我没有使用 mdl.remove_constraint()。对于所有约束,我都添加了一个优先级,然后我使用了 [docplex][1] 提供的 relaxer 库。我无法在文档(或其他任何地方)中找到使用松弛剂的任何示例,所以我自己做了一个(非常容易理解)。 relaxer 库是一个非常强大的工具,它的使用方式比手动进行所有松弛要容易得多,尤其是当您必须处理约束中的层次结构时。

示例:

from docplex.mp.model import Model
import docplex

# we create a simple model
mdl = Model("relax_model")

x1=mdl.continuous_var(name='X1', lb=0)
x2=mdl.continuous_var(name='X2', lb=0)

# add conflict constraints
c1=mdl.add_constraint(x1<=10,'c1_low')
c2=mdl.add_constraint(x1<=5,'c2_medium')
c3=mdl.add_constraint(x1>=400,'c3_high')
c4=mdl.add_constraint(x2>=1,'c4_low')

mdl.minimize(x1+x2)

mdl.solve()
print mdl.report()
print mdl.get_solve_status() #infeasible model
print
print 'relaxation begin'

from docplex.mp.relaxer import Relaxer
rx = Relaxer(prioritizer='match')
rx.relax(mdl,relax_mode= docplex.mp.relaxer.RelaxationMode.OptInf)

print 'number_of_relaxations= ' + str(rx.number_of_relaxations)
print rx.relaxations()

print mdl.report()
print mdl.get_solve_status()
print mdl.solution

我知道这不是 "the solution" 的 model.remove_constraint() 性能问题,但它非常适合您需要避免它的情况。