浅尝一个排程引擎Optaplanner,前序。
当码农有10多年了,由建筑行业软件,各种MIS,通用物流定制平台,CCTV客户端(是闭路电视,不是央视喔)啥都做过。最后小试一下创业,不过那都是闹着玩的,不到一年就回到码农的队列,重拾搬砖的行当。近些年一直在制造业,做过ERP,当过小组负责人。有人问为什么不转纯管理?是能力不足,气质不佳还是人品低下?我觉得都有些且不全吧。反正无论是当管理还是做技术,我还是觉得手里拿点实在的东西心里才踏实。并不是说管理不是一个好技能,而是本人遇机问题,机会不多,所以大多数时间都是在做搬砖,砖搬多了,当然想试一下,看能不能搞个自动化机械出来,总不能搬到退休那天吧,码农到底多少岁退休呀?看来如果再不练就点拿得出手来的东西,到时候我就只能退,无法休了。那些奋斗于500强,30岁而立之年已赚足退休资本的农场主们不在此列。
好了,唠叨了半于,回来说说粘点边的。上面说了,老农啥都搞,那也就是说没啥精的了。跟同行们说我是在制造业里做IT的,可人家习惯性地府视俺:工厂里的IT?说是ERP,不就是进销存嘛,能有啥技术含量?。嗯,觉得也是,不过要知道,当你深入到一个行业里去,无论是做什么,你都会觉得,你进的是天坑,你遇到的都是世界难题。毕竟那些说这个简单那个没技术的人,通常都只是在隔山观火走马观花(这两成语是这么用吗?体育老师还要兼顾数学,所以本农的语文水平有限呀。)在企业里我做过营业模块,也做过生产模块,其实当你深入其中,去跟各种业务逻辑细节搏斗时,你就会感觉到:妈的,今年的诺贝尔软件奖舍我其谁?其实世界上没有好做的软件,觉得好做,只是你的系统简单而已,而不是哪个行业简单。好了,既然ERP这么简单,老农我也觉得这不是我的菜呀(其实是能力不足,没办法深入到ERP的业务里罢了).好在现在整个中国都在闹智能制造,我觉得也可以在制造业做点大家觉得有小许牛B的事了(原谅我做了点小梦)。先不说这一轮的人工智能热潮会不会如2000年的互联网热一样,火一下就没了。但有些进步是大家都能看得到的,起码谷哥他家的狗在围棋上把人类给秒了。
关于智能制造,在其中一个环节,就是让计算机把一些以前还是需要有经验,IQ还可以的人才能做的东西,帮忙给做了;而不仅仅是通过网络控制机器手来代替人手。能被机器手代替的,更多的是重复劳动,另外就是机器手的高精度操作远超人类。但是,例如做生产计划这类需要很高“智能”才能做的事情,在人工智能的背景下,应该也会慢慢有成果出现了。说到生产计划,可能大家遇到最多的都是MPS(主生产计划),它只是一个很高层次的计划,只能计划到车间(顶多是产线),时间上最多只能精确到天;更多的算是企业层面的计划,不太具有实操性。要满足智能制造中,实现对机台进行分钟级(甚至秒级)的生产指令下达。光靠MPS肯定不可行的,事实上MPS下达到车间后,会有相应的调度部门来对MPS进分解,形成调试指令。把工单再分配给操作班/组,而这个生产指令在很多情况下,还不是精确的完全可执行的信息,很多还只是“主体信息”,到了机台的操作班/组,还需要班/组长根据机台的实际情况进行一些额外的处理,才能形成真正的操作指令。所以,一些很复杂的细节逻辑,其实是下压给了调度部门和机台班组。但要实现智能制造,要提高生产自动化程度,这一系列的复杂转换,就不可能由人逐层地下发。因为:1.在速度上来说,人对复杂问题的处理速度远跟不上计算机,特别是涉及大量计算、判断的信息处理时;2. 能做出一套好的MPS就已经是不错的生产计划员了,已经需要对业务非常熟悉,对各种情况的预判准确率要达到一定的程度;这是需要丰富的经验和试错经历的。3. 当完成了MPS要分解成调试指令甚至是操作指令时,这个过程就不可能只靠人类来实现,因为里面涉及的计算和逻辑判断太多,太复杂,远超过人类可以处理的范围。4.就算花大量的人力物办做出一套可行的调试指令,但要在可行的基础上实现相对最优,那就不是人可以做到的了,这就涉及一个数学上的NPC问题,我在下一篇文章里会说明。
因此,要实现上面说的那些复杂、不可能靠人力实现的工作,就需要依赖计算机了。但计算机也只是按人的指令要求进行计算和判断而已呀,所以归根到底还是需要人的智慧。而在这个场景下,实际上是需要依赖人类对数学的运用来实现这么一些复杂的系统。Google那只会下围棋的狗(现在人家已经站在这个星球的围棋顶端开卷孤独求败了),其实不就是人类给它实现了一大堆的数学逻辑嘛。可我并没有这个水平,我们怎么办呢?怎么样能完成上面看起来很牛的工作呢?其实现在业界已经在研究并且有些比较成功的应用了,那就是APS,APS的核心就是在有限的资源条件下,实现相对最优的资源配置。为什么我老是讲相对最优,而不说最优呢?还是得下篇来说。APS这个核心是怎么实现的呢?那就需要一个很牛的引擎。也许会有同学问,业务规则我都知道呀,条件限制我都得到了,那我自己按业务规则写出来,然后就用这个来跑,把结果跑出来,形成一系列的调试指令不就行了吧?扯什么引擎,什么相对最优呢?没错,如果是这样的话,估计这部分同学也是觉得别人的系统很简单,没啥技术含量了。事实上业务规则分两种,很多个层次。层次先不说,我们先说种类。一种是硬规则(相对应的制约,后面的篇章里会叫做硬约束),和种是软件规则(相对应的制约,后面的篇章里会叫做软约束)。硬规则就是一些不能违反的规则,例如一个产品所使用的原料必然是指定范围内的,需要使用指定的机台进行生产,否则就不可能生产出来,或出来的必然是报废品。而有一些是软规则,就是一些规则老板们希望都不要违反,违反了会让他掉钱的,但客观事实出现了一些情况,没办法完全保证所有规则都 遵循,部分规则也只能放弃坚守了,也就是相害相遇取其轻。例如:同样的产品,可以用两种机台生产,有一个机台的成本非常高,是用来生产专用产品的,普通产品在正常情况下是不会用那个机台生产的,如果普通产品放上去,必然亏本。但如果现在正是旺季,而一个很重要的客户给订单过来,要一个生产普通产品,如果不用这个天价机台生产,那铁定是无法按期交货了,会影响后以后的合作,这时候老板也只能亏一次,起用这个天价机台了。但是生产得越多亏得越多,老板就要求调度员们绞尽脑汁,力求尽量少用这个天价机台。每天都有天量的生产要求要处理,你当计划员、调度员们是神呀?所以篇到一个认为差不多可以了的生产方案就往上报呗,老板也如愿以偿地保住了客户亏了不少钱。可是过两天老板会发现,其实有更好的方案可以更少地使用天价机台,甚至还有一个无需使用天价机台的方案,他会去把计划员、调度员们捉来杀掉拜旗吗?(只有码农才有这个待遇吗?).问题是:1、在短时间内,人类能找到这个方案吗?不一定,其实是很难,非常难。2. 计划员、调度员们找到的方案有人去挑战吗?不一定(基本上没人有这个能力),因为你也不知道他们出的方案是不是最优?甚至他们自己也不知道。除非他们把所有可能的情况都列举一次,在现实情况下,不要说他就这一个方案做到退休能不能穷举,就算全公司的人一起来列举计算,算到地球毁灭那一天,也不一定能找到。这个时候排程引擎就派上用场了。而其中的核心就是一些数学算法。就如上面所说的,这么多的情况,计算机也只是一个一个去试,一个一个去计算呀,那如果可能的情况足够多,你把全世界都用来挖矿(比特B)的电脑都拿来跑也不一定能跑完呀。这就对了,引擎的作用就是当可能情况无限大的时候,并不会无序地一个一个试,而是集成一些算法,有策略地找,虽然也不一定能找到,但在相同的时间内找到相对最优方案的机会,相对人来说,还是超N个数量级的。其中就集成了一些例如Tabu search算法,遗传算法,退火算法和爬山算法等。我们的主角Optaplanner就是这么一个集成了这么多数据工具的一套开源软件。一下篇我们就开始对Optaplanner进行学习。惊不惊喜?意不意外?:)
首次发文,文笔不通,有砖尽管砸,老农受得了!
浅尝一个排程引擎Optaplanner,前序。的更多相关文章
- crontab 例行性排程
那么我们就来聊一聊 crontab 的语法吧![root@www ~]# crontab [-u username] [-l|-e|-r]选项不参数:-u :只有 root 才能迚行这个仸务,亦即帮其 ...
- 例行性工作排程 (crontab)
1. 什么是例行性工作排程 1.1 Linux 工作排程的种类: at, crontab 1.2 Linux 上常见的例行性工作2. 仅运行一次的工作排程 2.1 atd 的启动与 at 运行的方式: ...
- 第十六章、例行性工作排程 (crontab)
1. 什么是例行性工作排程 1.1 Linux 工作排程的种类: at, crontab 1.2 Linux 上常见的例行性工作 2. 仅运行一次的工作排程 2.1 atd 的启动与 at 运行的方式 ...
- linux备忘录-例行性工作排程 (crontab)
例行性工作排程 例行性工作排程分为两类 at at是只执行一次就结束的指令安排.要想使用at,必须要有atd服务的支持. crontab crontab是每隔一段时间自动执行的指令安排.crontab ...
- Linux学习-循环执行的例行性工作排程
循环执行的例行性工作排程则是由 cron (crond) 这个系统服务来控制的.Linux 系统上面原本就有非常多的例行性工作,因此这个系统服务是默认启动的. 另外, 由于使用者自己也可以进行例行性工 ...
- 浅尝Spring注解开发_Servlet3.0与SpringMVC
浅尝Spring注解开发_Servlet 3.0 与 SpringMVC 浅尝Spring注解开发,基于Spring 4.3.12 Servlet3.0新增了注解支持.异步处理,可以省去web.xml ...
- 浅尝ECMAScript6
浅尝ECMAScript6 简介 ECMAScript6 是最新的ECMAScript标准,于2015年6月正式推出(所以也称为ECMAScript 2015),相比于2009年推出的es5, es6 ...
- 浅尝key-value数据库(一)——一览NoSQL
浅尝key-value数据库(一)——一览NoSQL 最近由于一个项目的关系,研究了一下key-value数据库这个最近很火的概念.本系列从项目需求的角度分析并测试了几个key-value数据库的性能 ...
- 易普优APS 5.0高级计划排程系统助力工业4.0智能工厂建设
(一)智能工厂建设核心 <中国制造2025>明确提出要推进制造过程智能化,智能工厂是实现智能制造的重要载体.作为智能工厂,在生产过程应实现自动化.透明化.可视化.精益化的同时,产品检测.质 ...
随机推荐
- Java下使用Apache POI生成具有三级联动下拉列表的Excel文档
使用Apache POI生成具有三级联动下拉列表的Excel文档: 具体效果图与代码如下文. 先上效果图: 开始贴代码,代码中部分测试数据不影响功能. 第一部分(核心业务处理): 此部分包含几个方面: ...
- 循序渐进之Spring AOP(4) - Introduction
前面描述的几种增强(Advice)都是在目标方法范围内织入,而引介(Introduction)不同,直接在类级别上添加目标未实现的接口方法. 在spring中可以通过扩展DelegatingIntro ...
- HihoCoder 1325 平衡树·Treap
HihoCoder 1325 平衡树·Treap 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似. 小Hi:你说 ...
- AtCoder Regular Contest 071
C - 怪文書 / Dubious Document 题意:定义一种无序的子序列:在原串中随意地取字符并随意打乱顺序.求多个字符串的最长公共无序子序列. #include<cstdio> ...
- [bzoj4240] 有趣的家庭菜园
还是膜网上题解QAQ 从低到高考虑,这样就不会影响后挪的草了. 每次把草贪心地挪到代价较小的一边.位置为i的草,花费为min( 1..i-1中更高的草的数目,i+1..n中更高的草的数目 ) 因为更小 ...
- Linux shell编程命令-Linux基础环境命令学习笔记
1.正则表达式 1)^开始 *前一个字符重复0次以上 + 1次以上 ? 0次或者1次 . 一个任意字符(.*连用) {m,n} m到n次 [0-9][a-z] 任意数字或字母 $结束字符 2)sed和 ...
- jvm内存模型-回收算法-和内存分配以及jdk、jre、jvm是什么关系(阿里,美团,京东面试题)
1.什么是jvm?(1)jvm是一种用于计算设备的规范,它是一个虚构出来的机器,是通过在实际的计算机上仿真模拟各种功能实现的.(2)jvm包含一套字节码指令集,一组寄存器,一个栈,一个垃圾回收堆和一个 ...
- No input file specified的解决方法apache伪静态
http://jingyan.baidu.com/article/dca1fa6f8d623ff1a44052e8.html (一)IIS Noinput file specified 方法一:改PH ...
- maven 阿里云仓库配置
<!-- 设定主仓库,按设定顺序进行查找. --> <repositories> <repository> <id>nexus-aliyun</i ...
- servlet多线程问题
Servlet本身是单实例的,这样当多个用户同时访问某个Servlet时,会访问该唯一的Servlet实例中的成员变量,如果对成员变量进行写入工作,那就会导致Servlet的多线程问题,即数据不一致. ...