OptaPlanner 规则引擎例子分析和简单入门
官方网站典型问题分析:(云资源平衡问题CloudBalance)
首先大概了解了什么是规则引擎和有一些什么约束后就可以着手进行代码层面的分析了,我们看一下这个例子上给出的注解和一些官方的解析:
官方网站对这个问题给了一个类图进行参考:
(这个例子主要包含了三个模型:进程(Process)、电脑(Computer)、解决方案,包含了分配的所有资源(CloudBalance)
对一些类和方法上的注解可以这样理解:
1、CloudProcess进程类:进程需要占用CPU、内存和带宽
@PlanningEntity(difficultyComparatorClass = CloudProcessDifficultyComparator.class)
@XStreamAlias(“CloudProcess”)
public class CloudProcess extends AbstractPersistable {
private int requiredCpuPower; // 需要的CPU资源
private int requiredMemory; // 需要的内存资源
private int requiredNetworkBandwidth; // 要求的网络的带宽
private CloudComputer computer;// 规划变量,在规划进行分数计算的时候会发生改变
…//getter …setter
@PlanningVariable(valueRangeProviderRefs = {“computerRange”},
strengthComparatorClass = CloudComputerStrengthComparator.class)
public CloudComputer getComputer() {
return computer;
}
public void setComputer(CloudComputer computer) {
this.computer = computer;
}
}
@PlanningEntity(…) :将要被计划器分配资源的实体(这里是进程)
@PlanningVariable() :告诉计划器在POJO中获取属性的值得时候可以改变该属性的值进行运算获得分数,这个注解在getter方法上,可以知道计划引擎会将这个变量不断改变进行计算,当然也要给这个改变的变量一个setter方法,因为计划引擎在解决问题的过程中可以修改它。
valueRangeProviderRefs:计划器在POJO中获取属性的时候需要匹配一个在CloudBalance中电脑列表的id,如下:
@ValueRangeProvider(id = “computerRange”)
@ProblemFactCollectionProperty
public List getComputerList() {
return computerList;
}
2、CloudBalance类
@PlanningSolution
@XStreamAlias(“CloudBalance”)
public class CloudBalance extends AbstractPersistable {
private List computerList;
private List processList;
@XStreamConverter(HardSoftScoreXStreamConverter.class)
private HardSoftScore score;
@ValueRangeProvider(id = “computerRange”)
@ProblemFactCollectionProperty
public List getComputerList() {
return computerList;
}
public void setComputerList(List computerList) {
this.computerList = computerList;
}
@PlanningEntityCollectionProperty
public List getProcessList() {
return processList;
}
public void setProcessList(List processList) {
this.processList = processList;
}
@PlanningScore
public HardSoftScore getScore() {
return score;
}
public void setScore(HardSoftScore score) {
this.score = score;
}
}
@PlanningSolution:代表这是规划方案
@ValueRangeProvider(id = “computerRange”):值范围提供者,此处是一个集合,指定ID后其他类可以通过@PlanningVariable(valueRangeProviderRefs=xx)来指定该值的搜索范围
@ProblemFactCollectionProperty 指定当前实际问题即资源的集合
@PlanningEntityCollectionProperty 指定提供规划实体的集合,此处是进程列表
@PlanningScore 当前规划的分数
3、CloudComputer 类
public class CloudComputer … {
private int cpuPower;
private int memory;
private int networkBandwidth;
private int cost;
… // getters
}
该类就是一个简单的POJO,等待分配给进程。
模型建立完毕之后,可以按照指定的开发流程去进行规