Pyomo 调度
Pyomo scheduling
我正在尝试在 Pyomo 中制定流水车间调度问题。这是一个抽象模型
问题描述
有 3 个工作(箱子、门和椅子)和 3 台机器(依次切割、焊接、包装)。 Objective 是为了最小化 makespan。 python代码和数据如下。
## 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
,我希望完工时间大于最后一台机器的完成时间。
目前,它被设置为超过所有机器的完成时间。
为此,我相信,我必须获得 machines
集合的最后一个索引。
为此,我尝试了 flowshop.machines[-1]
,但它给出了一条错误消息:
Cannot index unordered set machines
如何解决这个问题?
感谢您的帮助。
PS - 我也在努力为用于定义作业优先级的二进制变量建模。如果您对此有任何想法,那也会有所帮助。
如错误所述 Cannot index unordered sets
,集合 flowshop.machines
未排序。需要在声明集合时提供 ordered=True
参数 -
flowshop.machines = Set(ordered=True)
在此之后,可以通过正常索引访问任何元素 - flowshop.machines[i]
对于二进制变量,可以将它们声明为 -
c = flowshop.jobsN*(flowshop.jobsN-1)/2
flowshop.prec = Var(RangeSet(1,c),within=Binary)
然后,这个变量可以用来决定2个作业之间的优先级和制定分配约束。可以使用作业的索引找到对应于一对作业的优先级变量(flowshop.jobs
必须是有序集 - flowshop.jobs = Set(ordered=True)
)
我正在尝试在 Pyomo 中制定流水车间调度问题。这是一个抽象模型
问题描述
有 3 个工作(箱子、门和椅子)和 3 台机器(依次切割、焊接、包装)。 Objective 是为了最小化 makespan。 python代码和数据如下。
## 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
,我希望完工时间大于最后一台机器的完成时间。
目前,它被设置为超过所有机器的完成时间。
为此,我相信,我必须获得 machines
集合的最后一个索引。
为此,我尝试了 flowshop.machines[-1]
,但它给出了一条错误消息:
Cannot index unordered set machines
如何解决这个问题?
感谢您的帮助。
PS - 我也在努力为用于定义作业优先级的二进制变量建模。如果您对此有任何想法,那也会有所帮助。
如错误所述 Cannot index unordered sets
,集合 flowshop.machines
未排序。需要在声明集合时提供 ordered=True
参数 -
flowshop.machines = Set(ordered=True)
在此之后,可以通过正常索引访问任何元素 - flowshop.machines[i]
对于二进制变量,可以将它们声明为 -
c = flowshop.jobsN*(flowshop.jobsN-1)/2
flowshop.prec = Var(RangeSet(1,c),within=Binary)
然后,这个变量可以用来决定2个作业之间的优先级和制定分配约束。可以使用作业的索引找到对应于一对作业的优先级变量(flowshop.jobs
必须是有序集 - flowshop.jobs = Set(ordered=True)
)