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

简介: 本文章算是最为入门的一篇了,为大家讲解一下Optaplanner的下载,压缩包的内容结构,并将示例运行起来。好像大家对Optaplanner及其丰富的示例有个初步了解。本文章的Optaplanner基于7.5.0Final版。

      经过上面篇长篇大论的理论之后,在开始讲解Optaplanner相关基本概念及用法之前,我们先把他们提供的示例运行起来,好先让大家看看它是如何工作的。OptaPlanner的优点不仅仅是提供详细丰富的文档 ,还为各种应用场景提供丰富的示例,它的文档里都是以几个简单经典的例子来说名各种功能特征和深层次概念的,例如Solver, Phase及Move等,以下我们就先把这些示例运行起来,先看看整体的情况,下一往篇我们再把示例的源码导进Eclipse,拿一个简单经典的示例,讲解一下Optaplanner规划引擎工作时需要哪些要素,它是如何工作的。

 

1.下载:

      首先得把示例下载回来,大家到Optaplanner的官网就可以看到一个绿色的按钮(见下图),点击它就可以下载了。它的版本更新非常快,我们就基于7.6.0Final进行讲解。  

                 

2. 解压:

      下载回来的压缩包“optaplanner-distribution-7.6.0.Final.zip”包含了Optaplanner的源码、各种包(引擎自己的核心包及其依赖包)、说明文件和示例及其源码。其中示例包括两个版本,一个是基础Swing的,也就是Java的Windows程序;另一个是基于Web的,以War包提供,需要自己部署Tomcat等App服务器来运行。我们着重讨论Swing版本的,因为它不需要我们部署App服务器。如果以后大家有需要,我可以另写一篇专门部署Web版本示例的文章详细讲解。打开压缩包,里面的文件夹结构如下图:

            

3. 试运行示例:

      因为压缩包中除了提供源码,还提供了已编译的包,只要在你系统中安装好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的示例可以正常运行起来了。

          

            

            

      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和带宽也是同样的分配规则。

      2. 软性要求:任何一台Computer一旦有任务分配进去,即表示该Computer被占用,需计算这台Computer的成本。Optaplanner规划引擎需要找找出一个方案,在满足了第1点的硬性要求的前提下,令到这所有被占用的Computer的成本加起来尽量小(为什么不能说最小呢?因为这是一个NPC问题,不一定可以找到成本最小的,也就是 说不一定能找到最佳方案的,详情参考本系列文章中,关于规则问题与NP, NPC问题的篇章).

      下图是我进入这个示例后,选择了9个Processes分配到3台Computers上的示例。Optaplanner的示例程序都提供这些示例的相关数据,只要选择就可以了,所以还是比较贴心的,但我们自己做项目过程中,去生成、处理这些数据的工作量,就点了系统的不少比例了。

 

               

            

 

3.4. 运行并解读示例:

      点击顶端的Solve按钮,引擎就开始工作,它会不断尝试不同的组合方案(这是一个非常复杂的过程,涉及到中种搜索算法Tabu,模拟退火等),找到既满足Process对CPU、内存和带宽的要求,且所使用的所有Computer中,成本加起来尽量小。下面就是运行了一段时间之后,9个Process分配到了两个Computer的情况。所得的方案的好坏,是通过评分来实现的,关于评分,可以查看后面Optaplanner规划引擎关于分数方面的文章。      

            

 

      好了,到目前为止我们已经初成功能运行起了它的示例,大家也可以尝试一下其它示例,各个示例的背景,可以到Optaplanner官网关于示例的章节中查看。我在后面的文章中,也会找几个具代表性的示例进行翻译。

 

      在下一篇,我们就要用这个示例的源码生成Eclipse中项目,好让大家可以更深入具体了解Optaplanner的实现。


谢谢。

 


原创不易,如果觉得文章对你有帮助,欢迎点赞、评论。文章有疏漏之处,欢迎批评指正。

目录
相关文章
|
1月前
|
监控 Java jenkins
进阶指南:使用Cloud Toolkit提高Java应用部署效率
【10月更文挑战第19天】作为一名长期从事Java开发的技术人员,我对提高开发效率有着不懈的追求。阿里巴巴推出的Cloud Toolkit无疑是众多工具中的佼佼者,它不仅简化了日常开发工作,更重要的是极大地提升了部署效率。本文将从个人的角度出发,深入探讨如何利用Cloud Toolkit的功能来实现自动化部署、持续集成(CI)与持续部署(CD)管道设置,以及性能监控工具的使用,帮助开发者实现更加高效的开发工作流。
29 2
|
弹性计算 IDE 安全
Alibaba Cloud Toolkit:本地应用一键部署到任何机器上
Alibaba Cloud Toolkit:本地应用一键部署到任何机器上
1174 0
Alibaba Cloud Toolkit:本地应用一键部署到任何机器上
|
3月前
|
Java Spring 容器
【Azure Spring Cloud】在Azure Spring Apps上看见 App Memory Usage 和 jvm.menory.use 的指标的疑问及OOM
【Azure Spring Cloud】在Azure Spring Apps上看见 App Memory Usage 和 jvm.menory.use 的指标的疑问及OOM
|
3月前
|
微服务 Windows
【Azure微服务 Service Fabric 】在SF节点中开启Performance Monitor及设置抓取进程的方式
【Azure微服务 Service Fabric 】在SF节点中开启Performance Monitor及设置抓取进程的方式
|
6月前
|
iOS开发 开发者 UED
Objective-C 的应用程序在启动过程
Objective-C是苹果平台的核心编程语言,其应用启动涉及多个步骤:加载可执行文件到内存,从main函数开始执行,调用UIApplicationMain设置运行环境。UIApplication创建主窗口,加载UI,初始化AppDelegate以处理生命周期事件。AppDelegate的application:didFinishLaunchingWithOptions:方法执行初始化操作,然后显示界面,进入主事件循环处理用户输入。实际应用可能有更多初始化步骤,开发者需遵循苹果的人机界面指南,确保良好用户体验。
44 2
|
测试技术
loadrunner 运行场景-Controller及Load Generators宿主主机优化
loadrunner 运行场景-Controller及Load Generators宿主主机优化
99 0
第一次创建微服务项目,如何快速启动多个模块?,idea如何开启Run DashBoard(显示services)
第一次创建微服务项目,如何快速启动多个模块?,idea如何开启Run DashBoard(显示services)
|
调度 Docker Perl
使用MiniKube部署联邦学习Fate的详细过程-上篇(下)
使用MiniKube部署联邦学习Fate的详细过程-上篇(下)
260 0
使用MiniKube部署联邦学习Fate的详细过程-上篇(下)
|
Kubernetes 网络安全 Docker
使用MiniKube部署联邦学习Fate的详细过程-上篇(中)
使用MiniKube部署联邦学习Fate的详细过程-上篇(中)
194 0
使用MiniKube部署联邦学习Fate的详细过程-上篇(中)
|
Kubernetes 并行计算 Unix
Kubernetes必备知识: Device Plugin的工作机制
通过提供通用设备插件机制和标准的设备API接口。这样设备厂商只需要实现相应的API接口,无需修改Kubelet主干代码,就可以实现支持GPU、FPGA、高性能 NIC、InfiniBand 等各种设备的扩展。该能力在Kubernetes 1.8和1.9版本处于Alpha版本,在1.10会进入Beta版本。
1805 0
Kubernetes必备知识: Device Plugin的工作机制