【教程12】OptaPlaner构造启发式算法

本文详细介绍了OptaPlanner中的多种构造启发式算法,包括首次适应法、首次适应法-递减、最弱适应法及其递减版、最强适应法及其递减版。这些算法用于在有限时间内构建初始解,虽然不保证最优,但能快速找到解决方案。文章还讨论了算法的配置、排序方式以及扩展性,包括初始化得分趋势、多规划变量处理和扩展技术等。

构造启发式算法

1. 概述

构造启发式算法在有限时间内构建一个相当不错的初始解。它的解决方案并不总是可行的,但它能够快速找到一个解决方案,以便后续元启发式算法能够完成任务。

构造启发式算法会自动终止,因此通常无需专门配置构造启发式算法阶段的终止条件。

2. 首次适应法(First Fit)

2.1 算法描述

首次适应法算法按照默认顺序循环遍历所有的规划实体,并逐个初始化。它将规划实体分配给最佳的可用规划值,同时考虑已经初始化的规划实体。当所有的规划实体都被初始化后,算法终止。一旦规划实体被分配,就不再改变。

firstFitNQueens04

请注意,该算法从将皇后A放置在第0行开始(之后不再移动),这使得达到最优解成为不可能。可以通过添加元启发式算法来修复这个问题。

2.2 配置

简单配置:

<constructionHeuristic>
  <constructionHeuristicType>FIRST_FIT</constructionHeuristicType>
</constructionHeuristic>

高级配置:

<constructionHeuristic>
  <constructionHeuristicType>FIRST_FIT</constructionHeuristicType>
  <...MoveSelector/>
  <...MoveSelector/>
  ...
</constructionHeuristic>

如需进行扩展,请参考构造启发式算法的扩展配置。如需进行高级配置,请参考从队列中分配实体。

3. 首次适应法-递减(First Fit Decreasing)

3.1 算法描述

与首次适应法类似,但是首次适应法-递减先分配较困难的规划实体,因为它们更不容易适应剩余部分。因此,它会按照降序对规划实体进行排序

firstFitDecreasingNQueens04

要求模型支持规划实体的难度比较。

通常情况下,人们预期这个算法的结果比首次适应法更好。但并非总是如此。

3.2 配置

简单配置:

<constructionHeuristic>
  <constructionHeuristicType>FIRST_FIT_DECREASING</constructionHeuristicType>
</constructionHeuristic>

高级配置:

<constructionHeuristic>
  <constructionHeuristicType>FIRST_FIT_DECREASING</constructionHeuristicType>
  <...MoveSelector/>
  <...MoveSelector/>
  ...
</constructionHeuristic>

如需进行扩展,请参考构造启发式算法的扩展配置。如需进行高级配置,请参考从队列中分配实体。

4. 最弱适应法(Weakest Fit)

4.1 算法描述

最弱适应法类似于首次适应法,但是它先使用较弱的规划值,因为较强的规划值更有可能能够容纳后续的规划实体。因此,它按照规划值的强度递增顺序排序。

要求模型支持规划值的强度比较

请不要假设这个算法的结果比首次适应法更好,通常情况下并非如此。

4.2 配置

简单配置:

<constructionHeuristic>
  <constructionHeuristicType>WEAKEST_FIT</constructionHeuristicType>
</constructionHeuristic>

高级配置:

<constructionHeuristic>
  <constructionHeuristicType>WEAKEST_FIT</constructionHeuristicType>
  <...MoveSelector/>
  <...MoveSelector/>
  ...
</constructionHeuristic>

如需进行扩展,请参考构造启发式算法的扩展配置。如需进行高级配置,请参考从队列中分配实体。

5. 最弱适应法-递减(Weakest Fit Decreasing)

5.1 算法描述

结合了首次适应法-递减和最弱适应法。它将规划实体按照降序难度排序,将规划值按照递增强度排序。

要求模型支持规划实体的难度比较和规划值的强度比较。

请不要假设这个算法的结果比首次适应法-递减更好,通常情况下并非如此。但它通常优于最弱适应法。

5.2 配置

简单配置:

<constructionHeuristic>
  <constructionHeuristicType>WEAKEST_FIT_DECREASING</constructionHeuristicType>
</constructionHeuristic>

高级配置:

<constructionHeuristic>
  <constructionHeuristicType>WEAKEST_FIT_DECREASING</constructionHeuristicType>
  <...MoveSelector/>
  <...MoveSelector/>
  ...
</constructionHeuristic>

如需进行扩展,请参考构造启发式算法的扩展配置。如需进行高级配置,请参考从队列中分配实体。

6. 最强适应法(Strongest Fit)

6.1 算法描述

类似于首次适应法,但是最强适应法先使用强的规划值,因为强的规划值更有可能具有较低的软成本。因此,它按照规划值的强度递减顺序排序。

要求模型支持规划值的强度比较

请不要假设这个算法的结果比首次适应法或最弱适应法更好,通常情况下并非如此。

6.2 配置

简单配置:

<constructionHeuristic>
  <constructionHeuristicType>STRONGEST_FIT</constructionHeuristicType>
</constructionHeuristic>

高级配置:

<constructionHeuristic>
  <constructionHeuristicType>STRONGEST_FIT</constructionHeuristicType>
  <...MoveSelector/>
  <...MoveSelector/>
  ...
</constructionHeuristic>

如需进行扩展,请参考构造启发式算法的扩展配置。如需进行高级配置,请参考从队列中分配实体。

7. 最强适应法-递减(Strongest Fit Decreasing)

7.1 算法描述

结合了首次适应法-递减和最强适应法。它将规划实体按照降序难度排序,将规划值按照递减强度排序。

要求模型支持规划实体的难度比较和规划值的强度比较。

请不要假设这个算法的结果比首次适应法-递减或最弱适应法-递减更好,通常情况下并非如此。但它通常优于最强适应法。

7.2 配置

简单配置:

<constructionHeuristic>
  <constructionHeuristicType>STRONGEST_FIT_DECREASING</constructionHeuristicType>
</constructionHeuristic>

高级配置:

<constructionHeuristic>
  <constructionHeuristicType>STRONGEST_FIT_DECREA
### OptaPlanner 规则引擎使用指南 #### 一、规则引擎概述 OptaPlanner集成了强大的规则引擎,通常采用Drools作为实现工具。通过这种方式,能够灵活地处理复杂的业务逻辑和约束条件。规则引擎允许用户以声明式的方式编写业务规则,从而简化了复杂问题的建模过程[^2]。 #### 二、定义领域模型 为了有效地利用规则引擎,在开始之前需要明确定义好待解决问题中的实体及其关系。这涉及到创建Java类表示不同的对象实例,并设置属性用于描述这些对象的关键特征。例如,在员工排班场景下,可以有`Employee`, `Shift`, 和 `Skill`这样的基本单元[^3]。 ```java public class Employee { private String id; private Set<Skill> skills; // Getters and setters... } ``` #### 三、配置规则文件 接下来就是构建具体的规则文件(.drl),其中每条规则都由前提部分(when)和动作部分(do)组成。当满足特定条件下触发相应的操作或计算得分变化。下面是一个简单的例子展示了如何为两个连续工作日安排相同技能组员制定惩罚性分数: ```drools rule "Avoid consecutive shifts with same skill" when $e1 : ShiftAssignment(employee != null, shiftDate == d1, requiredSkills contains $s) $e2 : ShiftAssignment(this != $e1, employee == $e1.employee, this.shiftDate.after(d1), this.requiredSkills contains $s) then scoreHolder.addHardConstraintMatch(kcontext, -10); end ``` 此段代码意味着如果某位具有某种技能($s)的雇员被分配到了相邻两天的工作,则会扣除一定的硬性罚分(-10)。 #### 四、集成与测试 完成上述步骤之后就可以将规则文件加载到应用程序当中去,并确保其能够在求解过程中正常发挥作用。可以通过模拟数据来进行初步验证,观察是否按照预期产生了合理的规划方案;也可以借助于内置的日志记录功能跟踪具体执行情况以便调试优化。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BigDataMLApplication

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值