草庐IT

关于多工序、多资源排程场景下的新成果

kentzhang 2023-04-16 原文

  在之前关于资源与工序的场景中写了一篇不同资源与工序组合下,APS设计难度的文章. 并针对多工序、多工序场景下排程的初步设计。关于生产计划排程的种类及其特性.

后来,针对多工序、多资源场景下的排程,专门用一篇文章进行了各种思路上的探索 使用OptaPlanner解决多工序、多机台(资源)排程的新思路

  但这种场景下的排程,需要同时处理同一资源(通常是设备或机台)上多个任务之间的前后置关系,以及同一产品的工序路线中各工序的前后置关系构成的双链结构。此外,在离散制造场景下,工序链不仅仅是一个链状结构,而是一个无环有向图;从而导致了更为复杂的情况。

  之前的项目中,一直尝试使用OptaPlanner中的时间链模型来构建该排程场景下的模型。理论上通过时间链来表达同一资源下的多个任务之间的关系; 在此基础上基于产品工序路线的前后工序关系,来表达同一产品下的的工序路线。我们可以从各种各样的计划中可以归纳出来,大多数情况下计划,其本质是实现任务(或称为排程对象)的时空编排,也就是确定各个任务的时间 (任务时间开始,做多久,什么时间完成),与空间(例如哪些资源,在哪些限制条件下进行)两个维度。

  对于之前一直研究的双链模式,其主要难点在于时间维度的规划。当时的具体做法是对每一个节点进行时间推导时,同时对资源上的任务链,及产品的工序链进行时间推导。但如果直接使用OptaPlanner的时候链模式,在规划变量侦听事件中计算各个节点的时间,很容易出现评分损坏(会抛出Score Corruption异常)或侦听损坏(会抛出Listener Corruption异常)。因此,该模式应用于于无前后接续关系的场景(即单工序)是足够的。但对于多工序多资源场景,特别是离散制造场景,可行性还是比较差的。

  经过数个项目的验证,和国内外各位网友的讨论,事实上针对多工序多资源的场景,更应该使用Prorject Job Scheduling模式。事实上这个模型及其衍生模型,在运筹规划领域也有比较多的论文有所研究了,通常我们遇到上述的多工序多资源场景的问题称为 Multi-Mode Resource Constrained Project Scheduling Problem (简称MRCPSP)。当然这些都是一些理论上的分析与思路,而要在OptaPlanner里实现它,虽然官方也提供了相应的示例,但这个示例只展示了最简单的PJS模型,我们只能以此作为基础,沿着MRCPSP模型的思路来实现我真正的规划模型。

  关于该模型,在我们的平台上得到了验证,确实能较完整地解决“工序关系”与“资源分配”两个限制造成的双链问题。以下是我们这个平台用PJS模型解决MRCPSP问题,关于资源约束的示意图。

因为版权问题,目前在这里只分享资源相关的示意图,更详细的细节问题,因为已经在我们的易排规划平台上得到了应用,因此暂不公开。

  当然这个只是一个理论上的模型,实际上在我们这个平台实施不同的项目场景时,还是需要在结构、算法上配合OptaPlanner的功能作出一些调整的。

  关于供应链领域的各种规划技术研究成果,这里义务安利一下以下这个网站,它里面有不少与车间排产,车辆路径规划,库存优化等供应链相关的研究成果论文,可以从中找到一些思路:http://www.ijsom.com/

  同时也邀请大家使用我们的【易排(EasyPlan)通用智能规划平台】,它基于OptaPlanner对APS的一些常用规划逻辑进行封装,大家只需要管理、维护好自己系统(使用MES、MOM、ERP中的计划模块)中的工单数据,即可快速地实现一个APS模块。后续我们还会添加【VRP - 车辆路径规划】和【在线调度】模块,敬请期待。可以通过以下链接查看更多该平台的使用方法。

 

易排(EasyPlan)通用智能规划平台 Q&A

 与平台相关疑问,可以添加本人微信(13631823503)探讨,或关注我们的公众号【让APS成为可能】及时接收相关消息。

有关关于多工序、多资源排程场景下的新成果的更多相关文章

  1. ruby - 安装 Ruby 时遇到问题(无法下载资源 "readline--patch") - 2

    当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub

  2. ruby-on-rails - Rails 3,嵌套资源,没有路由匹配 [PUT] - 2

    我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle

  3. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

    本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

  4. ruby - 在 Ruby 中创建按公共(public)键值分组的新哈希 - 2

    假设我有一个在Ruby中看起来像这样的哈希:{:ie0=>"Hi",:ex0=>"Hey",:eg0=>"Howdy",:ie1=>"Hello",:ex1=>"Greetings",:eg1=>"Goodday"}有什么好的方法可以将它变成如下内容:{"0"=>{"ie"=>"Hi","ex"=>"Hey","eg"=>"Howdy"},"1"=>{"ie"=>"Hello","ex"=>"Greetings","eg"=>"Goodday"}} 最佳答案 您要求一个好的方法来做到这一点,所以答案是:一种您或同事可以在六个月后理解

  5. ruby - Chef LW 资源属性默认值如何引用另一个属性? - 2

    我正在尝试将一个资源属性的默认值设置为另一个属性的值。我正在为我正在构建的tomcat说明书定义一个资源,其中包含以下定义。我想要可以独立设置的“名称”和“服务名称”属性。当未设置服务名称时,我希望它默认为为“名称”提供的任何内容。以下不符合我的预期:attribute:name,:kind_of=>String,:required=>true,:name_attribute=>trueattribute:service_name,:kind_of=>String,:default=>:name注意第二行末尾的“:default=>:name”。当我在Recipe的新block中引用我

  6. ruby-on-rails - 关于 Ruby 的一般问题 - 2

    我在我的rails应用程序中安装了来自github.com的acts_as_versioned插件,但有一段代码我不完全理解,我希望有人能帮我解决这个问题class_eval我知道block内的方法(或任何它是什么)被定义为类内的实例方法,但我在插件的任何地方都找不到定义为常量的CLASS_METHODS,而且我也不确定是什么here,并且有问题的代码从lib/acts_as_versioned.rb的第199行开始。如果有人愿意告诉我这里的内幕,我将不胜感激。谢谢-C 最佳答案 这是一个异端。http://en.wikipedia

  7. ruby-on-rails - 在 Ruby 或 Rails 中,hash.merge({ :order => 'asc' }) can return a new hash with a new key. 什么可以返回带有已删除键的新散列? - 2

    在Ruby(或Rails)中,我们可以做到new_params=params.merge({:order=>'asc'})现在new_params是一个带有添加键:order的散列。但是是否有一行可以返回带有已删除key的散列?线路new_params=params.delete(:order)不会工作,因为delete方法返回值,仅此而已。我们必须分3步完成吗?tmp_params=paramstmp_params.delete(:order)returntmp_params有没有更好的方法?因为我想做一个new_params=(params[:order].blank?||para

  8. ruby - 我怎样才能更好地了解/了解更多关于 Ruby 的知识? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我最近开始学习Ruby,这是我的第一门编程语言。我对语法感到满意,并且我已经完成了许多只教授相同基础知识的教程。我已经写了一些小程序(包括我自己的数组排序方法,在有人告诉我谷歌“冒泡排序”之前我认为它非常聪明),但我觉得我需要尝试更大更难的东西来理解更多关于Ruby.关于如何执行此操作的任何想法?

  9. ruby - 关于 Ruby 中 Dir[] 和 File.join() 的混淆 - 2

    我在Ruby中遇到了一个关于Dir[]和File.join()的简单程序,blobs_dir='/path/to/dir'Dir[File.join(blobs_dir,"**","*")].eachdo|file|FileUtils.rm_rf(file)ifFile.symlink?(file)我有两个困惑:首先,File.join(@blobs_dir,"**","*")中的第二个和第三个参数是什么意思?其次,Dir[]在Ruby中有什么用?我只知道它等价于Dir.glob(),但是,我对Dir.glob()确实不是很清楚。 最佳答案

  10. elasticsearch源码关于TransportSearchAction【阶段三】 - 2

    1.回顾.TransportServicepublicclassTransportServiceextendsAbstractLifecycleComponentTransportService:方法:1publicfinalTextendsTransportResponse>voidsendRequest(finalTransport.Connectionconnection,finalStringaction,finalTransportRequestrequest,finalTransportRequestOptionsoptions,TransportResponseHandlerT>

随机推荐