0

我正在处理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)?¿有没有办法让所有的集合发生冲突而不必为每个集合删除/refine_conflict()?¿有没有办法在约束中使用层次结构以避免约束之间的冲突?

(最后一个问题有点离题,但与原始问题有关)

提前致谢!

4

1 回答 1

0

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

我没用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() 性能问题的“解决方案”,但是当您需要避免它时它非常适合。

于 2017-01-16T12:13:54.000 回答