我和CPLEX/docplex一起解决了一个有很多不可行约束的LP问题,大部分可行性问题都来自于模型的自动制定,而且很难检测出约束之间的冲突。
使用docplex函数ConflictRefiner().refine_conflict(model) im至少可以在冲突中找到一组约束。
问题是,为了找到冲突中的所有约束集,我必须使用函数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)更快地删除约束?是否有一种方法可以获得所有冲突的集合,而不必对每个集合删除/细化冲突()?是否有方法在约束中使用层次结构以避免约束之间的冲突?
(最后一个问题有点离题,但与原来的问题有关)
提前谢谢!
发布于 2017-01-16 12:13:54
最后我找到了解决办法,
我没有使用mdl.remove_constraint()。对于所有约束,我添加了一个优先级,然后使用了[docplex][1]提供的松弛器库。我在文档(或其他地方)中找不到任何使用松弛器的例子,所以我自己做了一个(非常简单的理解)。松弛器库是一个非常强大的工具,它的方式更容易使用,而不是手工进行所有放松,特别是当您必须处理约束中的层次结构时。
示例:
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我知道这不是model.remove_constraint()性能问题的“解决方案”,但当您需要避免它时,它非常适合。
https://stackoverflow.com/questions/41122377
复制相似问题