浅尝一个排程引擎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>明确提出要推进制造过程智能化,智能工厂是实现智能制造的重要载体.作为智能工厂,在生产过程应实现自动化.透明化.可视化.精益化的同时,产品检测.质 ...
随机推荐
- AOP---jdk动态代理的思考
引出问题:动态代理中是谁调用了invoke方法 为了更好的说明情况,我先写一个动态代理类 a.Person类 public interface Person { public void eating( ...
- 什么是CDN加速?(转载)
随着互联网的发展,用户在使用网络时对网站的浏览速度和效果愈加重视,但由于网民数量激增,网络访问路径过长,从 而使用户的访问质量受到严重影响.特别是当用户与网站之间的链路被突发的大流量数据拥塞时,对于异 ...
- java 多线程 Callable -- 分段处理一个大的list 然后再合并结果
本文代码参考 http://bbs.csdn.net/topics/391070227?page=1 下面是贴出的代码: public void dealListWithMutiThread(){ L ...
- 读书笔记《PHP与MySQL程序设计》一
第1章 PHP概述 1.1 历史(PHP4.PHP5.PHP5.3.PHP6[未发布]) 1.2 一般语言特性(实用性.强大功能.可选择性.成本[开源]) 第2章 环境配置 2.1 安装的前提条件( ...
- 开发 | 小程序wx.setScreenBrightness/wx.getScreenBrightness接口测试
前言 最近接触了微信小程序 API - wx.setScreenBrightness .wx.getScreenBrightness 接口,调用该接口可以调节并显示手机屏幕亮度数据.对于喜欢腾讯新闻. ...
- Codeforces 777C Alyona and Spreadsheet
C. Alyona and Spreadsheet time limit per test:1 second memory limit per test:256 megabytes input:sta ...
- isupper()函数
isupper()函数可以用来判断字符c是否为大写英文字母! 原型:extern int isupper(int c); 头文件:ctype.h 功能:判断字符c是否为大写英文字母 说明:当参数c为大 ...
- SPOJ GSS1_Can you answer these queries I(线段树区间合并)
SPOJ GSS1_Can you answer these queries I(线段树区间合并) 标签(空格分隔): 线段树区间合并 题目链接 GSS1 - Can you answer these ...
- Linux驱动手动绑定和解绑定
Linux内核从2.6.13-rc3开始,提供了在用户空间,可动态的绑定和解绑定设备和设备驱动之间关系的功能.在这之前,只能通过insmod(modprobe)和rmmod来绑定和解绑,而且这种绑定和 ...
- [国嵌攻略][106][Linux内存管理子系统]
内存管理子系统 1.虚拟地址与物理地址的映射 2.物理内存的分配 Linux虚拟地址空间分布 设备最后访问的一定是物理地址,但Linux系统中使用的都是虚拟地址.虚拟地址简单的来说就是程序中使用的地址 ...