第 4 章 红帽构建的 OptaPlanner 示例
Red Hat Process Automation Manager 提供了几个红帽构建的 OptaPlanner 示例。您可以检查示例的代码,并根据需要对其进行修改以满足您的需要。
红帽不支持 Red Hat Process Automation Manager 发行版本中所含的示例代码。
一些 OptaPlanner 示例解决了在技术 contests 中出出的问题。以下表中的 Contest 列列出了 contests。它也识别一个示例为 realistic 或 unrealistic 用于 contest 的目的。最后的 contest 是符合以下标准的官方独立 contest:
- 明确定义的实际用例
- 真实限制
- 多个真实数据集
- 在特定硬件的特定时间限制中可重复生成结果
- 领导和/或企业级操作人员的严重参与。
架构师 contests 提供 OptaPlanner 的目标比较,与研究软件和研究方面提供了目标比较。
| 示例 | Domain | 大小 | 法国 | 目录名称 |
|---|---|---|---|---|
| 1 个实体类 (1 个变量) |
实体 IANA
值 IANA
搜索空间 | Pointless (cheatable) |
| |
| 1 个实体类 (1 个变量) |
实体为
值 IANA
搜索空间 | 否(由我们定义) |
| |
| 1 个实体类 (1 个链变量) |
实体 IANA
值
搜索空间 | unrealistic TSP web |
| |
| 1 个实体类 (1 个变量) |
实体
值 IANA
搜索空间 | 否(由我们定义) |
| |
| 1 个实体类 (2 个变量) |
实体关联
值
搜索空间 | 否(由我们定义) |
| |
| 1 个实体类 (2 个变量) |
实体 IANA
值 IANA
搜索空间 |
| ||
| 1 个实体类 (1 个变量) |
实体为
值 IANA
搜索空间 | 最近迁移的 ROADEF 2012 |
| |
| 1 个实体类 (1 个链变量) 1 个影子实体类 (1 自动影子变量) |
实体 IANA
值 IANA
搜索空间 | 非弹性 VRP Web |
| |
| 带有时间窗的 vehicle 路由 | 所有 Vehicle 路由 (1 shadow 变量) |
实体 IANA
值 IANA
搜索空间 | 非弹性 VRP Web |
|
| 1 个实体类 (2 个变量) (1 shadow 变量) |
实体为
值 IANA
搜索空格 | 近远的 MISTA 2013 |
| |
| 1 个实体类 (1 个链变量) (1 shadow 变量) 1 个影子实体类 (1 自动影子变量) |
实体为
值
搜索空间 | 没有定义 |
| |
| 2 个实体类(相同层次结构) (2 个变量) |
实体为
值 IANA
搜索空间 |
| ||
| 1 个实体类 (1 个变量) |
实体为
值 IANA
搜索空间 |
| ||
| 1 个实体类 (1 个变量) |
实体
值
搜索空间 | unrealistic TTP |
| |
| 1 个实体类 (2 个变量) |
实体为
值 IANA
搜索空间 | 近似的 ICONHQ |
| |
| 1 个实体类 (1 个变量) |
实体关联
value =
搜索空间 | 没有定义 |
| |
| 1 个实体类 (2 个变量) |
实体 IANA
值 IANA
搜索空间 | 没有定义 |
| |
| 1 个实体类 (1 个链变量) (4 影子变量) 1 个影子实体类 (1 自动影子变量) |
实体依赖项
值 IANA
搜索空间 | 没有定义 |
| |
| 1 个实体类 (1 个变量) 1 个影子实体类 (1 自动影子变量) |
实体
值
搜索空间 | 没有定义 |
|
4.1. N queens 复制链接链接已复制到粘贴板!
将 n queens 放在 n 大小的 chessboard 中,因此不会相互攻击两个 queens。最常见的 n queens puzzle 是 8 个 queens puzzle,带有 n = 8 :
约束:
- 使用 n 列的数量和 n 行。
- 将 n queens 放在按板上。
- 没有两个 queens 可以相互攻击。queen 可以在同一个水平、垂直或 diagonal 行中对任何其他 queen 进行攻击。
本文档主要使用 4 queens puzzle 作为主要示例。
建议的解决方案可以是:
图 4.1. Four queens puzzle 的一个错误的解决方案
以上解决方案是错误,因为 queens A1 和 B0 可以相互攻击(因此可能会 queens B0 和 D0)。删除 queen B0 会遵循 "no two queens 可相互攻击"约束,但会破坏 "place n queens" 约束。
以下是正确的解决方案:
图 4.2. Four queens puzzle 的正确解决方案
所有约束都已满足,因此解决方案正确。
请注意,大多数 queens puzzles 具有多个正确的解决方案。我们将专注于查找给定 n 的正确解决方案,而不是查找给定 n 可能的正确解决方案数量。
问题大小
4queens has 4 queens with a search space of 256.
8queens has 8 queens with a search space of 10^7.
16queens has 16 queens with a search space of 10^19.
32queens has 32 queens with a search space of 10^48.
64queens has 64 queens with a search space of 10^115.
256queens has 256 queens with a search space of 10^616.
n queens 示例的实现尚未优化,因为它作为 beginner 示例。然而,它可以轻松地处理 64 queens。通过一些更改,它已被显示,可以轻松地处理 5000 queens 等。
4.1.1. N queens 的域模型 复制链接链接已复制到粘贴板!
本例使用域模型来解决四个 queens 问题。
创建域模型
良好的域模型将更方便地理解并解决您的规划问题。
这是 n queens 示例的域模型:
public class Column { private int index; // ... getters and setters }public class Row { private int index; // ... getters and setters }public class Queen { private Column column; private Row row; public int getAscendingDiagonalIndex() {...} public int getDescendingDiagonalIndex() {...} // ... getters and setters }计算搜索空间.
Queen实例有一个Column(例如: 0 是列 A, 1 is column B, …) 和一个Row(例如,0 为行 0,1 为行 1, …)。根据列和行计算升序行和降序行。
列和行索引从小时的左上角开始。
public class NQueens { private int n; private List<Column> columnList; private List<Row> rowList; private List<Queen> queenList; private SimpleScore score; // ... getters and setters }查找解决方案
单个
NQueens实例包含所有Queen实例的列表。它是解决方案实现,它将由 Solver 提供、解决并从 Solver 检索。
请注意,在四个 queens 示例中,NQueens 的 getN () 方法始终返回四个。
图 4.3. Four Queens 的解决方案
| columnIndex | rowIndex | ascendingDiagonalIndex (columnIndex + rowIndex) | descendingDiagonalIndex (columnIndex - rowIndex) | |
|---|---|---|---|---|
| A1 | 0 | 1 | 1 (**) | -1 |
| B0 | 1 | 0 (*) | 1 (**) | 1 |
| C2 | 2 | 2 | 4 | 0 |
| D0 | 3 | 0 (*) | 3 | 3 |
当两个 queens 共享相同的列时,行或 diagonal 行(如 ASP 和(DSL))可以相互攻击。