内容概要
上一篇文章,我们学习了OptaPlanner的基本使用,及部分基本概念。也学会构建一个课程分配的例子。这次我们继续来通过案例来学习OptaPlanner的使用。
问题描述
假设你的公司拥有一些云计算机,需要在这些计算机上运行一些进程,需要将每个进程分配到一台计算机上运行。 必须满足以下硬约束:
- 每台计算机必须能够处理其进程总和的最低硬件要求。
- CPU功率:一台计算机的CPU功率必须至少是分配给该计算机的进程所需的CPU功率之和。
- 内存容量:一台计算机的RAM内存必须至少是分配给该计算机的进程所需的RAM内存的总和。
- 网络容量:一台计算机的网络带宽必须至少是分配给该计算机的进程所需的网络带宽之和。
应优化以下软约束:
- 每台分配有一个或多个进程的计算机都会产生维护费用(每台计算机的费用是固定的)。
- 成本:使总的维护成本最小化。
这个问题是装箱问题的一种形式。下面是一个简化的例子,我们用一个简单的算法,将四个进程分配给两台有两个约束条件(CPU和RAM)的计算机。
这里使用的简单算法是贪心算法(又称贪婪算法,是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解)。
它首先分配较大的进程,然后将较小的进程分配到剩余空间。正如我们所看到的,这不是最优的,因为它没有留下足够的空间来分配黄色进程D。
OptaPlanner通过使用额外的、更智能的算法找到了更理想的解决方案。它还可以扩展:在数据(更多的进程,更多的计算机)和约束(更多的硬件要求,其他约束)方面。
问题大小
我们从下面的表格来看不同线程数、计算机数的搜索空间是多大。
业务建模
我们在建模的时候,要区分出来哪些是 Planning entities规划实体,它们的哪些属性是Planning variables规划属性。
这个例子的模型中定义出代表问题的输入数据对象,这个简单例子中,这些对象就是Computer、Progress。 在这个模型中的一个单独的对象必须代表问题的完整数据集,其中包含输入数据以及解决方案。在这个例子中,这个对象持有一个Computer的列表和一个Progress的列表。每个Progress被分配给一台Computer;Computer之间的Progress分配就是解决方案。
步骤
- 绘制UML图。
- 规划模型数据,不要出现重复数据。
- 写出模型内每一个实例:
- Computer: 代表一台有一定硬件和维护费用的计算机。在这个例子中,
Computer
的属性是:cpuPower
,memory
,networkBandwidth
,cost
.。 - Progress:代表一个有需求的进程。需要由OptaPlanner分配给一台计算机。
Progress
的属性有:requiredCpuPower
,requiredMemory
, andrequiredNetworkBandwidth
. - CloudBalance:代表一个
Problem
。包含某个数据集的每台计算机和进程。
- Computer: 代表一台有一定硬件和维护费用的计算机。在这个例子中,
- 找出哪些字段在求解期间会发生变化。
- Planning entity:OptaPlanner在求解过程中可以改变的类。在这个例子中,它是
Progress
类&#
- Planning entity:OptaPlanner在求解过程中可以改变的类。在这个例子中,它是