OptaPlanner – 把example运行起来(运行并浅析Cloud balancing)

22次阅读

共计 3334 个字符,预计需要花费 9 分钟才能阅读完成。

经过上面篇长篇大论的理论之后,在开始讲解 Optaplanner 相关基本概念及用法之前,我们先把他们提供的示例运行起来,好先让大家看看它是如何工作的。OptaPlanner 的优点不仅仅是提供详细丰富的文档,还为各种应用场景提供丰富的示例,它的文档里都是以几个简单经典的例子来说名各种功能特征和深层次概念的,例如 Solver, Phase 及 Move 等,以下我们就先把这些示例运行起来,先看看整体的情况,下一往篇我们再把示例的源码导进 Eclipse,拿一个简单经典的示例,讲解一下 Optaplanner 规划引擎工作时需要哪些要素,它是如何工作的。
1. 下载:
首先得把示例下载回来,大家到 Optaplanner 的官网就可以看到一个绿色的按钮(见下图),点击它就可以下载了。它的版本更新非常快,我们就基于 7.6.0Final 进行讲解。图片描述
解压:
下载回来的压缩包“optaplanner-distribution-7.6.0.Final.zip”包含了 Optaplanner 的源码、各种包(引擎自己的核心包及其依赖包)、说明文件和示例及其源码。其中示例包括两个版本,一个是基础 Swing 的,也就是 Java 的 Windows 程序;另一个是基于 Web 的,以 War 包提供,需要自己部署 Tomcat 等 App 服务器来运行。我们着重讨论 Swing 版本的,因为它不需要我们部署 App 服务器。如果以后大家有需要,我可以另写一篇专门部署 Web 版本示例的文章详细讲解。打开压缩包,里面的文件夹结构如下图:图片描述
试运行示例:
因为压缩包中除了提供源码,还提供了已编译的包,只要在你系统中安装好 Java 环境,就可以运行起来,先看个究竟了。ps:java 要 1.8 以上。
3.1:解压示例文件:你会看到一个包文件夹 (binaries), 一个源码文件夹(sources), 一个 windows 批处理命令文件(runExamples.bat) 和一个 Linux 下运行示例的 Shell 文件 (runExamples.sh). 因为我是在 Windows 环境下运行的,所以把 binaries 和 runExamples.bat 解压出来放在同一文件夹即可,examples 子文件夹中的目录结构如下图。图片描述
3.2 运行示例: 如果 windows 下使用 cmd 不太熟悉的话,就按我下面的步骤操作. 完成之后就可以看到它示例的真容了。示例程序是基于 Swing 做的,理论上通过里面的批处理文件就可以运行起来,其实里面就是一些运行 jar 包的命令, 只不过它会有更多的功能,例如检查当前系统的 JRE 等等。不过中间有点小插曲,我使用 7.6.0 的示例运行的时候,它报了一个 slf4j 找不到的异常,应该是一个日志组件缺少了,我要看看它这个版本的更新记录,看是否有相关的提示,否则我得联系一下他们项目组的人才行。后来我用 7.5.0Final 的示例可以正常运行起来了。
图片描述
通过鼠标右键调出 CMD
图片描述运行示例批处理文件图片描述
多达 18 个示例,最简单的 N 王后问题,到复杂的车辆路线规划问题.7.5.0 版本提供了 18 个示例,已经 包含了几乎所有 Optaplanner 规划引擎具有的特性及应用模式。但其实在他们的 Github 中提供了更多的示例,有兴趣的同学可以关注一下 Github 上 optaplanner 项目的 leader Geoffrey De Smit,他现在是 Optaplanner 项目的头儿,也是 Optaplanner 的作者,10 多年前他开发了 Optaplanner,前些年他把它贡献给了 JBoss 开源社区,任这个项目的头儿。我在使用 Optaplanner 做项目的时候,他们的讨论组上向他提过一些问题,他为人相当 nice 且有耐心,给我解答了不少问题。
3.3 运行示例:我们选择一个比较经典的 Cloud balancing 示例运行一下看看。
先说明一下这个示例,这个示例是模拟在云端进行进程管理(或称进程调度,或称任务调度吧),也就是进程分配到不同的计算资源(也就是计算机)的方案,演示 Optaplanner 规划引擎是如何在保证每个进程都满足运行要求的情况下,以最节省成本的方式分配计算机资源的。
示例中有两个主要实体概念 – 进程 (Process,下面跟着官方文档称 Process 吧, 可以理解为我们的程序,或任务) 和 Computer(也就是我们理解的计算机、服务器了)。每个 Process 有 CPU 速度, 内存大小和网络带宽三大要求。对应地,每台 Computer 也有一个固定的参数,表明该 Computer 可提供的 CPU 速度、内存大小和带宽;Computer 另外还有一个属性就是成本。也就是这台电脑一但被使用了,就需要花费成本去维护。这个示例的目标是:给出一些 Process 和一些 Computer,Optaplanner 规划引擎在对这些实体进行对比运算,将所有 Process 分配到指定的一台 Computer, 这个分配方案有两个要求:
1. 硬性要求:Process 所分配到的 Computer 必然满足 CPU,内存和带宽三大要求要求。ps: 当多个 Process 被分配到同一个 Computer 时,它的 CPU,内存和带宽资源占用是累加的,也就是说,当台 Computer 只有 2G 内存,若已经有一个内存需求是 1G 的 Process 被分配在它上面,那后面可以再分配给它的 Process,其内存要求必然是 1G 以下的,因为这进修这台 Computer 还只剩下 1G 内存了,CPU 和带宽也是同样的分配规则。
软性要求:任何一台 Computer 一旦有任务分配进去,即表示该 Computer 被占用,需计算这台 Computer 的成本。Optaplanner 规划引擎需要找找出一个方案,在满足了第 1 点的硬性要求的前提下,令到这所有被占用的 Computer 的成本加起来尽量小(为什么不能说最小呢?因为这是一个 NPC 问题,不一定可以找到成本最小的,也就是 说不一定能找到最佳方案的,详情参考本系列文章中,关于规则问题与 NP, NPC 问题的篇章).
下图是我进入这个示例后,选择了 9 个 Processes 分配到 3 台 Computers 上的示例。Optaplanner 的示例程序都提供这些示例的相关数据,只要选择就可以了,所以还是比较贴心的,但我们自己做项目过程中,去生成、处理这些数据的工作量,就点了系统的不少比例了。
图片描述 Cloud balancing 示例中 Process 与 Computer 信息图片描述每个 Process 对计算资源的要求 3.4. 运行并解读示例:点击顶端的 Solve 按钮,引擎就开始工作,它会不断尝试不同的组合方案(这是一个非常复杂的过程,涉及到中种搜索算法 Tabu,模拟退火等),找到既满足 Process 对 CPU、内存和带宽的要求,且所使用的所有 Computer 中,成本加起来尽量小。下面就是运行了一段时间之后,9 个 Process 分配到了两个 Computer 的情况。所得的方案的好坏,是通过评分来实现的,关于评分,可以查看后面 Optaplanner 规划引擎关于分数方面的文章。
图片描述运行结果,以硬分数 (反映资源敏合度) 和软分数 (反映成本) 组成。好了,到目前为止我们已经初成功能运行起了它的示例,大家也可以尝试一下其它示例,各个示例的背景,可以到 Optaplanner 官网关于示例的章节中查看。我在后面的文章中,也会找几个具代表性的示例进行翻译。
在下一篇,我们就要用这个示例的源码生成 Eclipse 中项目,好让大家可以更深入具体了解 Optaplanner 的实现。
谢谢。
End.
Optaplanner 开源规划引擎地址:www.optaplanner.org
* 如需了解更多关于 Optaplanner 的应用,请发电邮致:kentbill@gmail.com 或到讨论组发表你的意见:https://groups.google.com/for… 若有需要可添加本人微信(13631823503)或 QQ(12977379)实时沟通,但因本人日常工作繁忙,通过微信,QQ 等工具可能无法深入沟通,较复杂的问题,建议以邮件或讨论组方式提出。(讨论组属于 google 邮件列表,国内网络可能较难访问,需自行解决)*

正文完
 0