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()
性能问题,但它非常适合您需要避免它的情况。
我正在与 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()
性能问题,但它非常适合您需要避免它的情况。