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的实现。


谢谢。

 


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

目录
相关文章
|
5月前
|
存储 人工智能 移动开发
AppFlow —— 给您的网站或企微添加AI助手
AppFlow AI助手提供灵活配置,助您轻松实现AI工具的Web页面访问与多种集成方式(H5页面、悬浮框等)。支持自定义页面生成及样式调整,满足个性化需求。文中详细介绍了创建AI助手、模型配置、Web页面集成等步骤,并展示不同场景下的使用效果。此外,还提供了企业微信集成、模型管理和插件扩展等相关操作指引,助力高效利用AI助手提升工作体验。
586 15
AppFlow —— 给您的网站或企微添加AI助手
|
9月前
|
存储 弹性计算 网络协议
深度对比阿里云服务器ECS通用型g7、g7a、g8i、g8y、g8ise和g8a性能对比
阿里云通用型ECS云服务器(g7、g7a、g8i、g8y、g8ise和g8a)具有1:4的CPU内存比,适合多种应用场景。配置从2核8G到128核512G不等,基于第三代神龙架构或CIPU架构,采用Intel、AMD及自研倚天710处理器,主频在2.55 GHz至3.7 GHz之间。支持IPv4/IPv6,具备高网络收发包PPS能力,适用于企业级应用、数据库、Web服务、AI训练、音视频处理等场景。I/O优化实例仅支持ESSD云盘,确保高性能存储。
|
JSON JavaScript 前端开发
Vue项目使用Cookie,以Json格式存入与读取Cookie,设置过期时间以及删除操作
这篇文章介绍了在Vue项目中如何使用JavaScript操作Cookie,包括设置、读取、设置过期时间以及删除Cookie的方法。
653 0
|
安全 算法 Java
实现Java中的线程安全集合类
实现Java中的线程安全集合类
|
DataWorks 关系型数据库 MySQL
DataWorks操作报错合集之在尝试连接到MySQL数据库时遇到了“Communications link failure”错误,如何解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
传感器 物联网 数据处理
MQTT 和 EMQX到底有啥区别?
MQTT 和 EMQX到底有啥区别?
3156 3
MQTT 和 EMQX到底有啥区别?
vscode 打开csv乱码
vscode 打开csv乱码
2924 0
|
数据采集 Java API
详细说明--使用阿里云接口进行银行卡四要素实名认证
如今随着互联网产业的多元化发展,尤其是互联网金融,O2O,共享经济等新兴商业形式的兴起,企业对实名认证业务的数据形式和数据质量有了更高的需求。如今也衍生出银行卡实名认证业务,通过接口将银行卡号、手机号、身份证号码、姓名上传至阿里云,再与银联系统进行匹配,判断信息的真实性。
229 0
详细说明--使用阿里云接口进行银行卡四要素实名认证
|
存储 Python
【Python】HTML中Base64存储的图片转为本地图片文件
【Python】HTML中Base64存储的图片转为本地图片文件
373 0
【POI框架实战】——POI导出Excel时设置单元格类型为数值类型
  最近做的一个ITFIN的项目中,后台需要用POI实现导出功能,导出的数据中有文本格式,也有货币格式,所以为了方便在将来导出的表格中做计算,存放货币的单元格需要设置为数值类型。
【POI框架实战】——POI导出Excel时设置单元格类型为数值类型