首页
学习
活动
专区
圈层
工具
发布

Pyomo调度
EN

Stack Overflow用户
提问于 2018-03-27 05:57:53
回答 1查看 972关注 0票数 0

我正试图在Pyomo中提出一个流水车间调度问题。这是一个抽象模型

问题描述

有3项工作(箱子,门和椅子)和3台机器(切割,焊接,包装按这个顺序)。目的是尽量减少制作锅。python代码和数据如下所示。

代码语言:javascript
复制
## flowshop.py ##
from pyomo.environ import *
flowshop = AbstractModel()
flowshop.jobs = Set()
flowshop.machines = Set()
flowshop.machinesN = Param()
flowshop.jobsN = Param()
flowshop.proc_T = Param(flowshop.jobs, 
                        flowshop.machines, 
                        within=NonNegativeReals)
flowshop.start_T = Var(flowshop.jobs, 
                       flowshop.machines, 
                       within=NonNegativeReals)
flowshop.makespan = Var(within=NonNegativeReals)      

def makespan_rule(flowshop,i,j):
    return flowshop.makespan >= flowshop.start_T[i,j]+flowshop.proc_T[i,j]
flowshop.makespan_cons = Constraint(flowshop.jobs,
                                    flowshop.machines,
                                    rule=makespan_rule)

def objective_rule(flowshop):
    return flowshop.makespan
flowshop.objc = Objective(rule=objective_rule,sense=minimize)  

## data.dat ##
set jobs := chest door chair ;
set machines := cutting welding packing ;
param: machinesN := 3 ;
param: jobsN := 3 ;
param proc_T:   
             cutting      welding     packing  :=
    chest    10           40          45
    door     30           20          25  
    chair    05           30          15  
;

我还没有添加所有的约束,我计划在这个问题解决后再添加它们。在上面的代码(flowhop.py)中,对于makespan_rule,我希望makespan比最后一台机器的完成时间更长。目前,它被设置为超过所有机器的完成时间。

为此,我相信,我必须得到machines集的最后一个索引。

为此,我尝试了flowshop.machines[-1],但是它给出了一个错误:

Cannot index unordered set machines

我该如何解决这个问题?

谢谢你的帮助。

PS -我也在为用来定义作业优先级的二进制变量建模。如果你对此有任何想法,那也是有帮助的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-03 06:54:17

正如错误中所说的Cannot index unordered sets,集合flowshop.machines没有被排序。在声明集合时,需要提供ordered=True参数-

flowshop.machines = Set(ordered=True)

在此之后,您可以通过普通索引- flowshop.machines[i]访问任何元素。

对于二进制变量,可以将它们声明为-

代码语言:javascript
复制
c = flowshop.jobsN*(flowshop.jobsN-1)/2
flowshop.prec = Var(RangeSet(1,c),within=Binary)

然后,该变量可用于确定两个作业之间的优先级,并制定赋值约束。可以使用作业的索引找到对应于一对作业的优先级变量( flowshop.jobs必须是一个有序集- flowshop.jobs = Set(ordered=True))。

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

https://stackoverflow.com/questions/49505314

复制
相关文章

相似问题

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