第 4 章 红帽构建的 OptaPlanner 示例


Red Hat Process Automation Manager 提供了几个红帽构建的 OptaPlanner 示例。您可以检查示例的代码,并根据需要对其进行修改以满足您的需要。

注意

红帽不支持 Red Hat Process Automation Manager 发行版本中所含的示例代码。

一些 OptaPlanner 示例解决了在技术 contests 中出出的问题。以下表中的 Contest 列列出了 contests。它也识别一个示例为 realisticunrealistic 用于 contest 的目的。最后的 contest 是符合以下标准的官方独立 contest:

  • 明确定义的实际用例
  • 真实限制
  • 多个真实数据集
  • 在特定硬件的特定时间限制中可重复生成结果
  • 领导和/或企业级操作人员的严重参与。

架构师 contests 提供 OptaPlanner 的目标比较,与研究软件和研究方面提供了目标比较。

Expand
表 4.1. 示例概述
示例Domain大小法国目录名称

N queens

1 个实体类

(1 个变量)

实体 IANA 256

值 IANA 256

搜索空间 10^616

Pointless (cheatable)

nqueens

Cloud balancing

1 个实体类

(1 个变量)

实体为 2400

值 IANA 800

搜索空间 10^6967

否(由我们定义)

cloudbalancing

trafficing Salesman

1 个实体类

(1 个链变量)

实体 IANA 980

980

搜索空间 10^2504

unrealistic TSP web

tsp

Tennis club 调度

1 个实体类

(1 个变量)

实体 72

值 IANA 7

搜索空间 10^60

否(由我们定义)

tennis

会议调度

1 个实体类

(2 个变量)

实体关联 10

320 和 IANA 5

搜索空间 10^320

否(由我们定义)

会议计划

类时间设置

1 个实体类

(2 个变量)

实体 IANA 434

值 IANA 25 和 IANA 20

搜索空间 10^1171

ITC 2007 跟踪 3

curriculumCourse

机器重新分配

1 个实体类

(1 个变量)

实体为 50000

值 IANA 5000

搜索空间 10^184948

最近迁移的 ROADEF 2012

machineReassignment

vehicle 路由

1 个实体类

(1 个链变量)

1 个影子实体类

(1 自动影子变量)

实体 IANA 2740

值 IANA 2795

搜索空间 10^8380

非弹性 VRP Web

vehiclerouting

带有时间窗的 vehicle 路由

所有 Vehicle 路由

(1 shadow 变量)

实体 IANA 2740

值 IANA 2795

搜索空间 10^8380

非弹性 VRP Web

vehiclerouting

项目作业调度

1 个实体类

(2 个变量)

(1 shadow 变量)

实体为 640

值 IANA ? 和 IANA ?

搜索空格

近远的 MISTA 2013

projectjobscheduling

任务分配

1 个实体类

(1 个链变量)

(1 shadow 变量)

1 个影子实体类

(1 自动影子变量)

实体为 500

520

搜索空间 10^1168

没有定义

taskassigning

评估时间设置

2 个实体类(相同层次结构)

(2 个变量)

实体为 1096

值 IANA 80 和 IANA 49

搜索空间 10^3374

ITC 2007 跟踪 1

考试

Nurse rostering

1 个实体类

(1 个变量)

实体为 752

值 IANA 50

搜索空间 10^1277

2010 年 10 月 11 日

nurserostering

趋势

1 个实体类

(1 个变量)

实体 1560

78

搜索空间 10^2301

unrealistic TTP

trafficingtournament

更便宜的时间调度

1 个实体类

(2 个变量)

实体为 500

值 IANA 100 和 IANA 288

搜索空间 10^20078

近似的 ICONHQ

cheaptimescheduling

参与

1 个实体类

(1 个变量)

实体关联 11

value = 1000

搜索空间 10^4

没有定义

参与

指导调度

1 个实体类

(2 个变量)

实体 IANA 216

值 IANA 18 和 IANA 20

搜索空间 10^552

没有定义

指导调度

rock 导览

1 个实体类

(1 个链变量)

(4 影子变量)

1 个影子实体类

(1 自动影子变量)

实体依赖项 47

值 IANA 48

搜索空间 10^59

没有定义

rocktour

飞行人员的调度

1 个实体类

(1 个变量)

1 个影子实体类

(1 自动影子变量)

实体 4375

750

搜索空间 10^12578

没有定义

flightcrewscheduling

4.1. N queens

n queens 放在 n 大小的 chessboard 中,因此不会相互攻击两个 queens。最常见的 n queens puzzle 是 8 个 queens puzzle,带有 n = 8

nQueensScreenshot

约束:

  • 使用 n 列的数量和 n 行。
  • n queens 放在按板上。
  • 没有两个 queens 可以相互攻击。queen 可以在同一个水平、垂直或 diagonal 行中对任何其他 queen 进行攻击。

本文档主要使用 4 queens puzzle 作为主要示例。

建议的解决方案可以是:

图 4.1. Four queens puzzle 的一个错误的解决方案

partiallySolvedNQueens04Explained

以上解决方案是错误,因为 queens A1B0 可以相互攻击(因此可能会 queens B0D0)。删除 queen B0 会遵循 "no two queens 可相互攻击"约束,但会破坏 "place n queens" 约束。

以下是正确的解决方案:

图 4.2. Four queens puzzle 的正确解决方案

solvedNQueens04

所有约束都已满足,因此解决方案正确。

请注意,大多数 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 的解决方案

partiallySolvedNQueens04Explained
Expand
表 4.2. 域模型中解决方案详情
 columnIndexrowIndexascendingDiagonalIndex (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))可以相互攻击。

Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

关于红帽文档

Legal Notice

Theme

© 2026 Red Hat
返回顶部