首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于CPLEX约束编程的矩形调度器

基于CPLEX约束编程的矩形调度器
EN

Stack Overflow用户
提问于 2019-12-05 18:16:03
回答 1查看 71关注 0票数 0

我需要使用约束编程在一个大矩形(名为bin)中调度一组矩形。

当我使用CPLEX时,我发现了正方形调度的例子(实际上我是CPLEX和PPC的新手)。当我将示例改编为矩形情况时,它没有找到任何可行的解决方案,我不明白为什么会发生这种情况?

下面是我用样例值替换变量的代码:

代码语言:javascript
复制
import docplex

#Size of the englobing rectangle 
size_bin = 100

mdl = docplex.cp.model.CpoModel()
vx = [mdl.interval_var(size=[1, 4], name="X" + str(i), end=(0,
    size_bin)) for i in range(7)]
vy = [mdl.interval_var(size=[1, 4], name="X" + str(i), end=(0, SIZE_bin))
    for i in range(7)]

#Create dependencies between variables 
for i in range(7):
    for j in range(i):
        mdl.add((mdl.end_of(vx[i]) <= mdl.start_of(vx[j])) | (mdl.end_of(vx[j]) >= mdl.start_of(vx[i])) | (mdl.end_of(vy[i]) <=
            mdl.start_of(vy[j])) | (mdl.end_of(vy[j]) <= mdl.start_of(vy[i])))

#To speed-up the search, create cumulative expressions on each dimension 
rx = mdl.sum([mdl.pulse(vx[i], vx[i].size) for i in range(len(vx))])
print(vx[0],rx) 

mdl.add(mdl.always_in(rx, (0,size_bin), size_bin, size_bin))
ry = mdl.sum([mdl.pulse(vy[i], vy[i].size) for i in range(len(vy))])
mdl.add(mdl.always_in(ry, (0, size_bin), size_bin, size_bin))

#Define search phases, also to speed-up the search 
mdl.set_search_phases([mdl.search_phase(vx), mdl.search_phase(vy)])  

#Solve model 
msol = mdl.solve(TimeLimit=50)
msol.print_solution()
EN

回答 1

Stack Overflow用户

发布于 2019-12-09 16:31:24

你的模型是不可行的。这可能意味着你的矩形不适合或者你的代码中有一个bug。为了进一步分析,您可以使用mdl.export_model('model.cpo')将模型导出到文件,然后使用交互式cpoptimizer工具分析冲突。这将产生冲突中的约束。

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

https://stackoverflow.com/questions/59192850

复制
相关文章

相似问题

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