关于OptaPlanner的使用(一)——简介

简介: 关于OptaPlanner的使用(一)——简介

最近项目中有个要给司机排班的需求,自己写了一个可用的算法。看到网上介绍说有这个可以实现统筹规划的规则引擎OptaPlanner,学习一下,看能否满足需求进而可以替换掉自己写的算法。


可以用的地方就是需要一些排班,调度等方面的时候,当情况比较复杂,使用人力无法轻易得到一个相对最优的计划时,可以使用计算机的高处理速度,在当前的资源条件下,得到一个细致的执行命令,实现相对最优的资源配置。


先来说一下业务规则的种类:一种是硬规则,另一种是软规则。硬规则就是一些必定不能违反的规则,例如一个产品所使用的原料必然是指定范围内的,需要使用指定的机台进行生产,否则就不可能生产出来,或出来的必然是报废品。而有一些是软规则,就是一些规则老板们希望都不要违反,违反了会让他掉钱的,但客观事实出现了一些情况,没办法完全保证所有规则都 遵循,部分规则也只能放弃部分规则了,也就是两害相遇取其轻。


OptaPlanner所解决的问题几乎可以都被视为NPC问题,什么是NPC问题呢?

概括来说,就是一些没有办法使用确定性算法来得到结果的问题,而对于这类问题,又分为NP问题和NPC问题,但都只能通过遍历的办法才能找到。

NP问题:一种无法通过确定性算法直接获得解,但对获得的解是可验证的,比如只要求做出一个可行的生产计划,成本、效率什么的都不管,那么这就是一个NP问题。要做出这个计划,是没有直接的、确定的方法或算法来做的;更多的是靠计划人的经验、对实际情况的有限掌握、对未来情况的预判和感觉等。但是做出来的计划是可以验证的。也就是说这个生产计划是确定可以执行的,而不会出现缺少原材料等违反硬规则的情况, 所以做一个可行计划,可以被视作是NP问题。


NPC问题:则是那种不旦无法通过确定性算法获得解,对所得的解,也没有一个确定的办法去验证的问题。比如要求做一个所有情况下除了可行,还要成本最低、效率最高的生产计划。那么这个成本低效率高的情况是无法验证的,除非把所有的可能的生产计划都列出来,但有的时候一个计划的条件和情况会比较多比较复杂,哪怕是靠计算机,如果一个个去遍历的话,也要花很多时间。而OptaPlanner的进行的遍历是有条件有方法的,通过很多算法的组合(Tabu search算法,遗传算法,退火算法和爬山算法,禁忌搜索等),得到比一个个遍历效率更高的计划出来。

可以下载Optaplanner的例子和文档看一下。例子在examples文件夹的runExamples.bat。

执行后会出现下列界面,是各种情况下的排序案例。可以先点着看看。这一章先到这,下一章执行一个案例看看效果。

目录
相关文章
|
算法 Java 决策智能
运筹优化工具库介绍(一)
运筹优化问题有时候极其复杂,我们可以使用运筹优化工具库帮助数学建模,解决复杂的最优化问题,本文介绍几个常见的运筹优化工具库。
1901 0
|
算法
OR-tools求解器使用介绍(二)
OR-tools求解器使用介绍(二)
1260 0
|
Java
Java 解析cad文件数据开源免费jar整理
Java 解析cad文件数据开源免费jar整理
1603 0
Java 解析cad文件数据开源免费jar整理
|
前端开发 JavaScript Go
VSCode 配置本地服务器
VSCode 配置本地服务器
931 0
VSCode 配置本地服务器
|
存储 缓存 NoSQL
Redis常见面试题(二):redis分布式锁、redisson、主从一致性、Redlock红锁;Redis集群、主从复制,哨兵模式,分片集群;Redis为什么这么快,I/O多路复用模型
redis分布式锁、redisson、可重入、主从一致性、WatchDog、Redlock红锁、zookeeper;Redis集群、主从复制,全量同步、增量同步;哨兵,分片集群,Redis为什么这么快,I/O多路复用模型——用户空间和内核空间、阻塞IO、非阻塞IO、IO多路复用,Redis网络模型
Redis常见面试题(二):redis分布式锁、redisson、主从一致性、Redlock红锁;Redis集群、主从复制,哨兵模式,分片集群;Redis为什么这么快,I/O多路复用模型
Qt绘图之QWidget
Qt绘图之QWidget
193 1
|
前端开发 数据库 JavaScript
基于Flowable的流程挂接自定义业务表单的设计与实践
文章讨论了如何在Flowable流程引擎中挂接自定义业务表单,以及相关设计和实践的步骤。文章中包含了一些前后端代码示例,如Vue组件的模板和脚本部分,这些代码用于实现与Flowable流程引擎交互的界面。例如,有一个按钮组件用于提交申请,点击后会触发applySubmit方法,该方法会与后端API进行交互,处理流程启动、查询关联流程等逻辑。
52784 11
|
SQL Java 数据库连接
MyBatis痛点验证,使用 foreach 批量插入慢?
MyBatis痛点验证,使用 foreach 批量插入慢?
643 0
|
开发者 Python
【Python】已完美解决:ERROR: Could not find a version that satisfies the requirement re
【Python】已完美解决:ERROR: Could not find a version that satisfies the requirement re
2531 0
|
算法 Java Maven
关于OptaPlanner的使用(三)——运行代码案例
关于OptaPlanner的使用(三)——运行代码案例
519 0