Optaplanner规划引擎的工做原理及简单示例(1)

  在以前的文章中,老猿已介绍过APS及规划的相关内容,也对Optaplanner相关的概念和一些使用示例进行过介绍,接下来的文章中,我会本身作一个规划小程序 - 一个关于把任务分配到不一样的机台上进行做来的小程序,并在这个小程序的基础上对Optaplanner中更多的概念,功能,及使用方法进行讲解。但在此以前,我须要先讲解一下Optaplanner在运行规则运算的原理。因此,本文是讲述一些关于寻找最优解的过程当中的原理性的内容,做为后续经过示例深刻讲解的基础。但这些原理知识不会涉及过度深奥的数学算法,毕竟咱们的目标不是写一个新的规划引擎出来,只是理解一些概念,用于理解Optaplanner是依据什么找出一个相对优解的。好让在接下来的一系列文章中,能够快速无障碍地理解我所讲解的更细化的Optaplanner功能。算法

  好了,言归正传,本文主要是讲述Optaplanner是如何在用户定义的规则限制条件中,基于约束的限制,对被规划对象进行排列组合,再对比各个组合(称做解,或方案),并找出相对最优的解出来。在这个寻优过程当中,Optaplanner会使用到一些相关算法,例如启发式算法(例如First Fit)和延迟接受法(例如禁忌搜索),从而提升寻找相对最优解的效率和防止嵌入局部最优解,从而能够在固定的时间内,找到尽量优的方案。小程序

  在理解Optapalnner是如何实现以前,咱们先复习并展开一下上一篇提到的概念 - 约束。微信

约束(Constraint):

  也就是对事物的一种限制,规定事物的发展应该遵循什么规则,具体到Optaplanner里,就是用于表达出什么是对的,什么是错的,什么状况是最优,什么状况次优,什么状况较差。从而让引擎获得各个解的对比依据。网络

  在Optapalnner中的约束能够分为硬约束软约束两种,其实还有更多的约束类型 ,例如中间约束,甚至是无限层级的约束,但总结起来,其做用也就是把约束划分为不一样层级,从而区分出不一样的优等级而已,若是有软件开发经验的同窗,能够理解不一样层级的约束,分别是SQL语句里Order By子句后面的字段次序。在进行记录排序时,前面的字段排列的优先级,是从性质上优先于后面的字段的,你们理解了Order By子句,也就理解了不一样层级约束的问题了。拉下来咱们以最简单的软硬约束,来分析一下约束的做用。工具

硬约束:

  硬约束是用来规定什么状况是对的,什么状况是错的;什么组合是好的,什么组合是很差的......也就是它一般是用来对所得的解进行一些定性的状态定义。例如一个计划是否可行,例如会不会同一个机台同一个时间分配了两个不一样的任务(假设每一个机台同时只能作同一个任务)。一个员工所排班次是否正确(例如一个员工是否被安排了三个连续的班次)。若出现上种状况,即表示违反了硬约束,这种方案称做不可行方案。之后的文章里,会提到Optaplanner里有一个明确的概念 - Feasable Solution(可行方案,或称可行解),就是表示这个方案是彻底符合硬约束的。优化

软约束:

  软约束规定什么状况最优,什么状况次优,什么状况是差的;它是用来定义方案优劣的定量状态。例如:一个计划的成本是否足够低;一个排班表到底有多大程度上的合理性,例如一我的正常状况下是须要5天工做制的,但若是遇到特殊状况,也能够连续工做6天,但这种状况是特殊的,须要额外付加班费(成本上升)最好不要出现这种状况。那么在编制这个排班表的时候,若是有一个方案是须要有人员连续工做6天,但若是找到另外一个方案,能够令全部人均不须要连续工做6天,那么,后面这个方案就比那些有人须要连续工做6天的方案更好了。体如今软约束上,就是后面的排产表,其软约束上会比前一个排班表更好,违反的软约束更少。google

  上述讲述的是两种常见约束,那么这些约束在Optaplanner里是如何生效的呢?那说须要有一种评分机制了,也是咱们在使用Optaplanner里,比较难准确把握的一个内容之一。人工智能

评分机制:评分是用分数来评价事物特性的一种方法。但若是咱们细心观察总结一下,会发现评份是能够经过两种方向来评价的;分别是正评分(奖励性评分)和负评分(惩罚性评分)。spa

正评分:经过得到分数的多少,来体现事物的优劣。例如咱们在学校考试过程当中,成绩是经过一种正分数来体现的,即作对一题奖励相应的分数,分数越高成绩越好;完美状态是得到满分。调试

负评分:经过扣除分数的多少,来体现事物的优劣。例如咱们的驾驶证记分制,每违章一次就扣除相应的分数,很明显这种评份体系中,分数越低越好,也就是扣得越少越好;完美状态是扣0分。

  在对实际问题进行约束规划时,是一种封闭性约束,也就是约定事物往指定的一个方向发现,使用负评分的方式,很显然更合理。也就是一个方案有哪些很差的,咱们经过对它评定一些惩罚分数标准,告诉引擎这种组合出现了一些不太好的状况。如此类推,每找到一个更佳、扣分更少的方案,就离完美就更近一步。不管是使用正方向评份仍是反方向评分(或称负方向评分),在Optaplanner里都是能够实现的,只不过按咱们平常的逻辑,在定义方案时,一般咱们只会根据业务定义出一些规则,方案是须要守这些规则,当一个方案出现有违反规则时,就做出相应的惩罚性扣分;这种方法比当出现好的状况就加分更合理。由于咱们的现实世界里,"好"是可能无限好的,当问题足够复杂,数据量足够大,即问题规模够大时,描述一个方案如何个好法,其实很难是一个定数。比描述一个方案如何个差法更难,由于前者能够是无限的,然后都就只须要咱们定义好什么是差的标准,一但问题范围肯定,它的最差状况(也就是最差的扣分状况)就有一个字数了。因此,在Optaplanner的世界里,常见的作法是,定义一些约束,并设定相应的惩罚分数标准(即将约束量化),用来描述这个方案的制约因素,当这个约束实打破时,就做出惩罚性记分,那么到最后,扣分越少的方案就越好。这就是Optaplanner实现寻优的最基本原理,但其实现是很是复杂的,会将问题划分为不少种类,将寻优的过程划分为多个阶段,每一个阶段利用不一样种类的算法来提升找到更优方案的效率,每一个阶段有不少个步骤,每一个步骤又有多个移动(没错,Optaplanner里就有Step与Move的概念,之后会详解);在之后的深刻文章中,我会详细把这个过程分析出来。

  上面描述了硬约束、软约束和评份机制。那么如何将这两种约束与这种评分机制关联起来,令评分机制能够实现软、硬约束呢?你们可能已想到,在Optaplanner给出了软分数,硬分数的概念。在评分机制中,当出现一个方案违反了某个硬约束时,就给这个方案扣除这个约束相应的分数;一样地,当该方案违反了一种软约束时,就对该方案扣除该软约束相应的分数。这两个分数是分开处理的。由于经过它们对应的约束类别就知道,它们分别表明的性质不同,硬分数对应的硬约束,表明的是一种定性评价;即描述方案好很差,行不行,可不可取等,一旦被记扣硬分数,那就表示这个方案的性质就变了,由可行方案变成不可行方案。理想的方案是一个硬分都不能扣的,一旦扣了就是不可行方案了。有人问,那么定义硬分数的分值有什么用?直接给一个标识出来,将方案的可用性定义为True or False,分别表明是事有硬约束被违反不就好了吗,多简单呀,由于一旦为False就是不可用了,再去讨论它扣了多少分,又有何意义呢?硬约束、硬分数不就是为了给方案定性而设立的吗?何须还要记录它的扣份量,画蛇添足呢?

  若是这样想,就是一种不全面的想法了。由于你们须要明白,现实世界每每是很大程度是不完美的,但而对不完美,咱们是放弃这个世界,仍是在不完美中进行坚持,对这个不完美的世界,朝完美的方向进行改造呢?上面的说法就比较抽象比较虚了,举个你们容易理解的例子。例如:刑法是用来惩罚犯罪的,在正常的法治社会中,犯罪对于一我的说,就至关于违反了硬约束(刑事处罚记录是终身跟随的)。也就是对于一我的来讲,一辈子中是否触犯过刑法,是一个定性的问题。那么既然是定性问题,咱们在设立刑法的时候,其对应的惩罚是否是只有一种就足够了呢?例如凡是触犯刑法,所有判死刑,那不就简单得多啦?事实上人类社会是不可能这样的,由于就算是触犯了刑法(这个已是定性问题),但罪行也有轻重之分的、对应了刑法的不一样条款,有些罪名通过对罪犯的惩戒,是能够再给他一次机会的,也说就是说触犯的刑法,是有轻重之分的,但性质不会变,他在国家司法机关的档案里,永远留有普被刑事处理的记录。因此,这能够称该种状况为定性范围内的定量问题。就是一我的作错了就是错了,其性质已经定了,但犯的错误有多大,还得是一个定量问题。所以,硬约束对应的扣除硬的分数有多有少就不难理解了。就是咱们的方案若是出现了违反硬约束、被扣除了硬分数的,它在Optaplanner上就是一个不可行方案了。可是在众多的不可行方案里,其实还要区分哪一个是更不可行,哪些其实只是违反了一点点,仍是“稍为可行的”。回到咱们的实际排程问题中,有可能客观条件限制,咱们全部排出来的方案(例如生产计划、排班表、车辆调试线路图)都是不可行的,例如:咱们排生产计划的时候,将交货期延误做为一种硬约束,可是现实的生产活动中,确确实实有可能不管你怎么排,由于产能、资源限制等因素,你是不可能找到一个完彻底全符合交期的生产计划的,那么这个时间咱们就须要找出一个违反得最小的计划出来,做为可行计划,视状况进行相应的修改并执行了。也就是说两害相遇取其轻。

  对于硬约束,除了上述讲到,当出现有可能确实须要使用不可行方案做为执行计划的状况外,在Optaplanner进行规则的过程当中,其实也起到很是大做用的。先不说optaplanner引来来排程;若是让你来排,对于各类硬约束,全都不给出一个分数,而是给一个定性的标识,就是一旦出现违反了,就报一个违反硬约束的消息出来,你会怎么样?你确定会抱怨提示的信息太简陋了,只有一个标识,最多只是知道哪里违反了,再也没有更详细的信息供你参考了。那你接下来的排产活动,其实就是一个组合一个组合逐一地去碰彩了。由于各个方案之间是否有关联,你是没法得知的,因此你根本找不到什么好的办法去将各类状况下的方案进行归类、比较进行往指定的一个方向收敛。但若是在一个硬约束被违反时,会出现一些明确的信息,是哪一个硬约束被违反了。违反和程度是多少,扣了多少分,是由于哪一个被规则的对象,放在哪里,或与哪一个对象相邻从而致使的硬约束被违反。这样就造成了一个很明确指导方向,对于人而言,经过概括统计就知道某些状况确定会出现,或极大可能会出现违反硬约束的状况,那咱们就能够在排列新方案时,尽力去避免这种状况了;也就是有了参考方向 。对于Optaplanner引擎来讲也是同理,尽管它不像人这么聪明(但最从近的消息来看,Optapalnner团队已经着手思考人工智能引入到引擎中,从而实现如上述人类同样对这类问题进行概括思考),但也可以做为其寻找更佳方案的过程当中的一些很重要的参考,从而为寻优算法所用,进而提升寻优效率。例如遗传算法。

  软分数对应的软约束,表明的是一种定量评价;即描述方案有多好、有多差,成本有多高、有多低。它是一种优化约束,即在定义它的时候,就已经知道它必然是被违反的(也有可能彻底不违反,那固然是好的,但若是是这样的话,就脱离了软约束的初充了)。因此,软件约束、软件分数的扣分值用途相对来讲就容易理解得多了。

   综上所述,Optaplanner就是经过一种体现为分数的约束机制,进行寻找最优组合。当一个排产问题中,设定的软硬两种约束时,它会优先知足硬约束的要求,再知足软约束的要求,也就是说,软约束被扣为1万分,也不及硬约束被扣了1分重要,联系上面的SQL语句中的Order By子句的例子。

  Optaplanner其利用途径有如下两点:

1. 用分数来肯定,一个方案是否可行,是优是劣;

2. 在决定每一步的时候,参考上一点的扣分状况,来肯定下一次生成方法时,应该考虑哪此因素(想一想遗传算法).

  这一篇咱们先讲解一下原理,打一下基础,下一篇将用一个任务与机台的例子来讲明一下这些原理在Optaplanner中是如何体现的。

 


本系列文章在公众号不定时连载,请关注公众号(让APS成为可能)及时接收,二维码:


如需了解更多关于Optaplanner的应用,请发电邮致:kentbill@gmail.com
或到讨论组发表你的意见:https://groups.google.com/forum/#!forum/optaplanner-cn
如有须要可添加本人微信(13631823503)或QQ(12977379)实时沟通,但因本人平常工做繁忙,经过微信,QQ等工具可能没法深刻沟通,较复杂的问题,建议以邮件或讨论组方式提出。(讨论组属于google邮件列表,国内网络可能较难访问,需自行解决)

相关文章
相关标签/搜索