首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >model.remove_constraint()性能

model.remove_constraint()性能
EN

Stack Overflow用户
提问于 2016-12-13 13:30:43
回答 1查看 942关注 0票数 0

我和CPLEX/docplex一起解决了一个有很多不可行约束的LP问题,大部分可行性问题都来自于模型的自动制定,而且很难检测出约束之间的冲突。

使用docplex函数ConflictRefiner().refine_conflict(model) im至少可以在冲突中找到一组约束。

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

编辑 135.000约束的时间是:

代码语言:javascript
复制
model.remove_constraint(constraint.name)
time= 124 sec
model.remove_constraint(constraint.element)
time= 126 sec

是否有一种方法可以比使用model.remove_constraint(str_name_constraint)更快地删除约束?是否有一种方法可以获得所有冲突的集合,而不必对每个集合删除/细化冲突()?是否有方法在约束中使用层次结构以避免约束之间的冲突?

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

提前谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-16 12:13:54

最后我找到了解决办法,

我没有使用mdl.remove_constraint()。对于所有约束,我添加了一个优先级,然后使用了[docplex][1]提供的松弛器库。我在文档(或其他地方)中找不到任何使用松弛器的例子,所以我自己做了一个(非常简单的理解)。松弛器库是一个非常强大的工具,它的方式更容易使用,而不是手工进行所有放松,特别是当您必须处理约束中的层次结构时。

示例:

代码语言:javascript
复制
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()性能问题的“解决方案”,但当您需要避免它时,它非常适合。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41122377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档