OptaPlanner创办人Geoffrey De Smet及其团队,在Red Hat 技术峰会上主题会场上,演示了一个通过OptaPlanner实现实时规划与调度的示例。Geoffrey及其团队专门为此分三篇博文描述了该程序。该程序及其相关博文是OptaPlanner在VRP领域极之经典之作。本系列也分三篇对博文进行翻译,以飨各位ORer, APSer和Planner.

目前本人正在研究该程序,未来将会进一步对该程序作更深入的分析,并形成博文,分享其中奥妙。

【以下为译文】

今年,我和我的团队在Red Hat技术峰会上作了主旨演讲。在7000人面前,我们演示了一个实时调度程序,该程序可以实现对现场观众通过手机App的输入进行实时反应。在过去两个月里,我们的团队和其它中间件的团队一起协同,在Burr Sutter的出色指导下,创建了这个实时调度程序。这个程序集成了多种技术,例如Android/iPhone的加速感应器,还有OpenShift / Kubernetes, Quarkus, KNative, TensorFlow, Kafka/Strimzi, Camel, Node.js, Godot, Infinispan, Drools等,当然少不了主角OptaPlanner.

我们写了一个模拟器,模拟一个典型的地板生产场景,场景中涉及装配线上的机械。当我第一次向我和妻子展示这个程序时,引发了一个有趣的对话:

"看,亲爱的,这是在主旨演讲上的示例程序,我们过去两周时间一直在努力(构建它)"

"看起来像小游戏,那些是Mario和Luigi在到处跑吗?"

"注意,(这些是机器维修师)它演示了OptaPlanner是如何优化他们的行走时间,使他们可以花更多的时候在维修机械上。"

"你打算就把这玩艺展示给7000多个商务客呀?"

"当然,展示将会非常精彩."

程序运行的效率如下:

现有10台机器(编号从A到J)运行过程中会出现磨损,并通过传感器检查发现磨损情况。(现场观众安装和我们的APP)在现场观众的帮忙下,我们通过获取他们手机上的加速感应器的数据,来模拟传感器。正所谓当事物变得越摇摇欲坠时,它就变更脆弱。当观众拼命摇晃,或用手机做出其它晃动的动作时,程序中对应的机器就会收到损坏信息。(由于人数众多),现场的每一部分观众通过晃动手机,就会向对应的一台机器发送损害信息为,对应机器的健康值就会减少。如果有一台机器的健康值降到0,那就表示这台机器崩溃了。

此时,那些受损的机器在它们崩溃之前安排维修,这就是OptaPlanner用武之地了。程序中有2到3名机械师来修复这些受损的机器,与机械师们在机器之间穿梭,及在修复机器的同时,所有机器都在持续地降低健康值(现场观众正在持续拼命地晃动他们的手机)。在安排机器时工作时,决定各个机器的维修次序是很困难的,因为损坏无时无刻地发生着。幸亏,OptaPlanner为帮我们调度这些机械师,它会实时地对机台健康的变化作出反映,如视频所示:

 

(下面讨论一下规划程序的具体设计)

这个规划问题的挑战

规划目标只有一个:不能让做任意一个机台的健康值掉到0%。这看起来是一个简单的约束,但事实上它存在两个冲突的约束:

  1. 优先修复健康值最低的机器,因为最低健康值的机器,其崩溃的风险最高。
  2. 通过让机械师走最短的穿梭路径,让机械师尽量快的时间修复就近的机器 。原因如下:
    1. 机器时需要进行修复机器之外,还需要在机器之间到处到动,通过减少他们的穿梭时间,提高他们的生产力。
    2. 若只考虑最短路径一个约束,这就是一个TSP问题(旅行商问题)。

上述两个约束存在竞争的,它们各自会偏向输出以下不同的解决方案:

这两种约束对完成时间的影响差别不太明显,即如何影响机械师一次修复所有有故障机器的所需时间。维修的时间越长,将会降低生产力:

因此,我们最终需要权衡这两种约束。我们通过对每台损坏的机器评定惩罚性分数,将损坏量乘以持续时间,直到该机器被修复为止。因此,OptaPlanner规划出来的方案中,将会尽可能地避免让机器的损坏程度增大,或尽可能将机器处于损坏状态的时间减少。

这只是一个车辆路线规划问题(VRP)

在运筹学的学术界,此类问题也被称为车辆路线规则问题(Vehicle Routing Problem - VRP), 在该类问题中,我们需要一些车辆(例如货车)发送到多个目的地。

通过上图可以看出,这些只是存在一些约束差别的相同问题。

目前OptaPlanner确实擅长于求解车辆路线规划问题的优化:通过对整个车辆运行时间达到15%甚至更多的时间减少,我们每年为一些客户节省了数亿美元。同时也大大地减少了车辆的能源消耗,从而减少了碳排放,因此对环保也相当有益。

了解更多关于OptaPlanner在VRP问题的优化,或看一下Jiri(OptaPlanner项目另一位成员)在VRP问题的最新Demo,演示视频

 
 

(机械师调度程序中)现实的挑战

首先,实现这种车辆路线规划的变种问题其实并不复杂,但要让程序的交互与演示运行得足够流畅,我们面临着更大的挑战。毕竟,我们不能冒着在演示期间,在观众与老板,包括我们的CEO Jim Whitehurst 面前程序崩溃的险。

  • 要了解有关我们的架构以及与所有其他技术的集成的更多信息,请阅读Musa的文章(第2部分)。
  • 要了解有关扩展挑战以及我们运行的模拟和负载测试的基准的更多信息,请阅读Radovan的文章(第3部分)。

如果想自己调度这个程序,可以从这里下载并根据readme的介绍进行调度。

End.


创作不易,欢迎转载,请标明出处。
本系列文章在公众号不定时连载,请关注公众号(让APS成为可能)及时接收,二维码:
如需了解更多关于OptaPlanner的应用,请发电邮致:kentbill@gmail.com
或到讨论组发表你的意见:https://groups.google.com/forum/#!forum/optaplanner-cn
若有需要可添加本人微信(13631823503)或QQ(12977379)实时沟通,但因本人日常工作繁忙,通过微信,QQ等工具可能无法深入沟通,较复杂的问题,建议以邮件或讨论组方式提出。(讨论组属于google邮件列表,国内网络可能较难访问,需自行解决)

机械师实时调度示例(I) - 实时规划的更多相关文章

  1. Linux进程管理 (9)实时调度类分析,以及FIFO和RR对比实验

    关键词:rt_sched_class.SCHED_FIFO.SCHED_RR.sched_setscheduler().sched_setaffinity().RR_TIMESLICE. 本文主要关注 ...

  2. Linux进程管理 (7)实时调度

    关键词:RT.preempt_count.RT patch. 除了CFS调度器之外,还包括重要的实时调度器,有两种RR和FIFO调度策略.本章只是一个简单的介绍. 更详细的介绍参考<Linux进 ...

  3. 在Android中使用实时调度(real-time)

    Linux的线程调度策略中有FIFO和RT的实时调度方法,但是在Android中做了限制,普通用户不能修改线程的调度算法为FIFO和RT,必须ROOT用户才能更改.但问题是程序是以普通用户启动和运行的 ...

  4. 【原创】(六)Linux进程调度-实时调度器

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...

  5. 云-腾讯云-实时音视频:实时音视频(TRTC)

    ylbtech-云-腾讯云-实时音视频:实时音视频(TRTC) 支持跨终端.全平台之间互通,从零开始快速搭建实时音视频通信平台 1.返回顶部 1. 腾讯实时音视频(Tencent Real-Time ...

  6. jquery的实时触发事件(textarea实时获取中文个数)

    jquery的实时触发事件(textarea实时获取中文个数) (2014-09-16 11:49:50) 转载▼ 标签: 实时触发事件 中文个数 onpropertychange oninput o ...

  7. Python之实时调度任务

    过了年就开始面临毕业了,毕业季是幸福的,但也是紧迫的.2月已过就开始着手策划毕业论文了,一直到现在,论文基本完成了,感觉过去的一个半月的时间,对自己过去2年在实验室所学又温习了一遍.书到用时方恨少,在 ...

  8. Springmvc中配置Quartz使用,实现任务实时调度。

    菜鸡的自我修炼,第一次接触quartz,做个记录.-------jstarseven 最近在项目中,第一次在springmvc中配置实用quartz,深刻的感受到quartz带来的方便,顺手做个记录. ...

  9. 全国城市空气质量实时数据(PM2.5)实时下载

    国家公布了“http://113.108.142.147:20035/emcpublish/”空气质量实时发布平台,WCF服务地址为“http://113.108.142.147:20035/EnvP ...

随机推荐

  1. 【神经网络与深度学习】【计算机视觉】SPPNet-引入空间金字塔池化改进RCNN

    转自: https://zhuanlan.zhihu.com/p/24774302?refer=xiaoleimlnote 继续总结一下RCNN系列.上篇RCNN- 将CNN引入目标检测的开山之作 介 ...

  2. MAX10 ADC的一些基知识

    MAX10 ADC 的一些知识 1.        MAX 10 内部集成的12bit SAR ADC的特点为: a.        采样速率高达1Mhz. b.        模拟通道多达18个,单 ...

  3. SpringBoot系列教程web篇之如何自定义参数解析器

    title: 190831-SpringBoot系列教程web篇之如何自定义参数解析器 banner: /spring-blog/imgs/190831/logo.jpg tags: 请求参数 cat ...

  4. Selenium自动化获取WebSocket信息

    性能日志 ChromeDriver支持性能日志记录,您可以从中获取域“时间轴”,“网络”和“页面”的事件,以及指定跟踪类别的跟踪数据. 启用性能日志 默认情况下不启用性能日志记录.因此,在创建新会话时 ...

  5. mysql网文收录

    1.分布式事务 1)  聊聊分布式事务,再说说解决方案 https://www.cnblogs.com/savorboard/p/distributed-system-transaction-cons ...

  6. Linux中添加用户与删除用户

    注意:添加用户和删除用户需要root来执行. 添加用户 用useradd命令,例如: # useradd -d/home/tom -s/bin/bash -u1000 tom  这样就添加了新用户to ...

  7. GOF 的23种JAVA常用设计模式总结 02 UML中的类图与类图之间的关系

    统一建模语言UML 统一建模语言(Unified Modeling Language,UML)是用来设计软件蓝图的可视化建模语言,1997 年被国际对象管理组织(OMG)采纳为面向对象的建模语言的国际 ...

  8. 全栈项目|小书架|服务器开发-NodeJS 使用 JWT 实现登录认证

    通过这篇 全栈项目|小书架|服务器开发-JWT 详解 文章我们对JWT有了深入的了解,那么接下来介绍JWT如何在项目中使用. 安装 $ npm install jsonwebtoken 生成 Toke ...

  9. easyui的学习总结

    大家都知道easy-ui,样式虽然不怎么骚气,但是使用,小表格,很的大家欢喜 大致总结如下 :属性分为CSS片段和JS片段.CSS类定义:1.div easyui-window 生成一个window窗 ...

  10. 【转载】C#中List集合使用RemoveAt方法移除指定索引位置的元素

    在C#的List集合操作中,移除集合中的元素可以使用Remove方法,不过Remove方法的参数为具体的List集合中的元素,其实还可以使用List集合的RemoveAt方法来移除List集合中的元素 ...