【问题标题】:Pyomo schedulingPyomo调度
【发布时间】:2018-03-27 05:57:53
【问题描述】:

我正在尝试在 Pyomo 中制定流水线调度问题。这是一个抽象模型

问题描述
有 3 个工作(胸部、门和椅子)和 3 台机器(按顺序切割、焊接、包装)。目标是最小化制造时间。 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 - 我也在努力为用于定义工作优先级的二进制变量建模。如果您对此有任何想法,那也会有所帮助。

【问题讨论】:

    标签: optimization job-scheduling pyomo


    【解决方案1】:

    正如错误所说的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)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-20
      • 1970-01-01
      • 2021-06-07
      • 2018-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-04
      相关资源
      最近更新 更多