5.2. 重新排序员工降级示例项目
员工的 rostering 示例项目是 Business Central 中提供的一个预配置的项目。您可以在 第 5.1 节 “在 Business Central 中部署 employees rostering 示例项目” 中了解如何部署此项目。
您可以创建员工的名册示例"全新"。您可以使用本例中的工作流在 Business Central 中创建您自己的类似项目。
5.2.1. 设置员工的 rostering 项目 复制链接链接已复制到粘贴板!
要在 Business Central 中开始开发解决方法,您必须设置该项目。
先决条件
- Red Hat Decision Manager 已经下载并安装。
-
您已部署了 Business Central,并使用具有管理员角色的用户登录。
流程
-
在 Business Central 中点 Menu
Design Projects Add Project 创建一个新项目。 在 Add Project 窗口中,填写以下字段:
-
Name
: staff-rostering - Description(可选):使用 OptaPlanner 的 Employee rostering 问题优化。可根据自身技能分配员工进行转变。
可选:点 Configure Advanced Options 来填充
组 ID、工件 ID和版本信息。-
组 ID
:员工 -
工件 ID
:员工 -
版本 1:1
NAPSHOT
-
Name
- 单击 Add,将项目添加到 Business Central 项目存储库。
5.2.2. 问题事实和规划实体 复制链接链接已复制到粘贴板!
员工时间表问题中的每个域类都归类为以下一种:
- 不相关的类:未由任何分数限制使用。从规划角度来说,这个数据已过时。
-
问题事实 类:在分数约束下使用,但在规划期间不会改变(只要问题仍保持相同),例如
Shift和Employee。问题事实类的所有属性都是问题属性。 计划实体类:在规划 过程中对分数约束和更改使用,例如
ShiftAssignment。规划期间更改的属性是 规划变量。其他属性是问题属性。询问以下问题:
- 计划过程中发生了哪些类变化?
哪个类具有我想要
更改的变量?该类是规划实体。
计划实体类需要使用
@PlanningEntity注释注释,或使用红帽在域设计器中的 OptaPlanner dock 进行定义。每个规划实体类都有一个或多个 规划变量,并且还必须有一个或多个定义属性。
大多数用例只有一个规划实体类,每个计划实体类只有一个规划变量。
5.2.3. 为员工降级项目创建数据模型 复制链接链接已复制到粘贴板!
使用这个部分,创建在 Business Central 中运行员工指定示例项目所需的数据对象。
先决条件
- 您已完成 第 5.2.1 节 “设置员工的 rostering 项目” 中描述的项目设置。
流程
-
使用新项目时,点击项目视角中的 Data Object,或者点击 Add Asset
Data Object 以创建新的数据对象。 将第一个数据对象
时间命名为,然后选择 employeesrostering.employeerostering作为 软件包。点 确定。
-
在 Data Objects 视角中,点 +add 字段将字段 添加到
Timeslotdata 对象。 -
在 id 字段中,键入
endTime。 -
单击 Type 旁边的下拉菜单,然后选择
LocalDateTime。 - 点击 Create 并继续 添加另一个字段。
-
添加另一个字段,其中包含 id
startTime和 TypeLocalDateTime。 - 点 Create。
-
单击右上角的 Save,以保存
Timeslot数据对象。 - 单击右上角的 x 以关闭 Data Objects 透视图,再返回到 Assets 菜单。
使用前面的步骤创建以下数据对象及其属性:
Expand 表 5.1. 技巧 id 类型 name字符串Expand 表 5.2. 员工 id 类型 name字符串技能employeerostering.employeerostering.Skill[List]Expand 表 5.3. 改变 id 类型 requiredSkillemployeerostering.employeerostering.Skilltimeslotemployeerostering.employeerostering.TimeslotExpand 表 5.4. DayOffRequest id 类型 dateLocalDate员工employeerostering.employeerostering.EmployeeExpand 表 5.5. ShiftAssignment id 类型 员工employeerostering.employeerostering.Employee改变employeerostering.employeerostering.Shift
有关创建数据对象的更多示例,请参阅开始使用决策服务。
5.2.3.1. 创建员工的 roster 计划实体 复制链接链接已复制到粘贴板!
为了解决员工问答规划问题,您必须创建一个计划实体和解决方法。计划实体在域设计人员中使用 OptaPlanner dock 中可用的属性定义。
使用以下步骤将 ShiftAssignment 数据对象定义为员工名册的规划实体。
先决条件
- 您已通过完成 第 5.2.3 节 “为员工降级项目创建数据模型” 中的步骤创建运行员工代理示例所需的相关数据对象和规划实体。
流程
-
在项目 Assets 菜单中,打开
ShiftAssignmentdata 对象。 -
在 Data Objects 视角中,点右侧的
来打开 OptaPlanner dock。
- 选择 计划实体。
-
从ShiftAssignmentdata 对象下的字段列表中选择 employees。 在 OptaPlanner dock 中,选择 规划变量。
在 Value Range Id 输入字段中,键入
employeesRange。这会在计划实体中添加@ValueRangeProvider注释,您可以通过单击设计者中的Source选项卡来查看。planning 变量的值范围通过
@ValueRangeProvider注释定义。@ValueRangeProvider注释始终具有属性id,它被@PlanningVariable属性值RangeProviderRefs引用。- 关闭 dock 并单击 Save 以保存数据对象。
5.2.3.2. 创建员工的 roster 计划解决方案 复制链接链接已复制到粘贴板!
员工的 roster 问题依赖于定义的规划解决方案。计划解决方案由红帽构建 OptaPlanner dock 中的属性在域设计器中定义。
先决条件
- 您已通过完成 第 5.2.3 节 “为员工降级项目创建数据模型” 和 第 5.2.3.1 节 “创建员工的 roster 计划实体” 中的步骤创建运行员工指定示例所需的相关数据对象和规划实体。
流程
-
使用标识符
EmployeeRoster创建一个新的数据对象。 创建以下字段:
Expand 表 5.6. EmployeeRoster id 类型 dayOffRequestListemployeerostering.employeerostering.DayOffRequest[List]shiftAssignmentListemployeerostering.employeerostering.ShiftAssignment[List]shiftListemployeerostering.employeerostering.Shift[List]skillListemployeerostering.employeerostering.Skill[List]timeslotListemployeerostering.employeerostering.Timeslot[List]-
在 Data Objects 视角中,点右侧的
来打开 OptaPlanner dock。
- 选择 规划解决方案.
-
将默认的
hard soft 分数保留为 Solution Score Type。这会在EmployeeRoster数据对象中自动生成分数,该分数作为类型。 使用以下属性添加新字段:
Expand id 类型 employeeListemployeerostering.employeerostering.Employee[List]选择 employees
List字段后,打开 OptaPlanner dock,再选择 Planning Value Range Provider 框。在 id 字段中,键入 staff
Range。关闭 dock。- 点击右上角的 Save 保存资产。
5.2.4. 员工的降级限制 复制链接链接已复制到粘贴板!
员工名单是一个规划问题。所有规划问题都包括必须满足约束才能找到最佳解决方案。
Business Central 中的员工指定示例项目包括以下硬和软限制:
- 硬约束
- 员工仅针对每天进行一次转变。
- 所有需要特定员工技能的改变都会为拥有该特定技能的员工分配。
- 软限制
- 所有员工都被分配了一项转变。
- 如果雇员请求一天,其变化会被重新分配给其他员工。
硬和软限制在 Business Central 中通过自由-form DRL 设计器定义,也可以使用指导规则。
5.2.4.1. DRL(Drools 规则语言)规则 复制链接链接已复制到粘贴板!
DRL(Drools Rule)规则是您在 .drl 文本文件中直接定义的业务规则。这些 DRL 文件是 Business Central 中所有其他规则资产渲染的源。您可以在 Business Central 界面中创建和管理 DRL 文件,或使用 Red Hat CodeReady Studio 或其他集成开发环境(IDE)在外部创建它们。DRL 文件可以包含一个或多个规则,它们至少定义规则条件(在时)和操作(然后再)。Business Central 中的 DRL 设计器为 Java、DRL 和 XML 提供语法高亮显示。
DRL 文件由以下组件组成:
DRL 文件中的组件
以下示例 DRL 规则决定了 loan 应用程序决策服务中的年龄限制:
loan Application age 限制的规则示例
DRL 文件包含单个或多个规则、查询和函数,并可以定义由规则和查询分配和使用的属性等资源声明。DRL 软件包必须在 DRL 文件的顶部列出,规则通常最后列出。所有其他 DRL 组件可遵循任何顺序。
每个规则必须在规则软件包中具有唯一的名称。如果您在软件包中的任何 DRL 文件中使用相同的规则名称多次,则规则无法编译。始终使用双引号括起规则名称(规则"rule name"),以防止可能出现的编译错误,特别是在规则名称中使用空格。
与 DRL 规则相关的所有数据对象都必须位于与 Business Central 中的 DRL 文件相同的项目软件包中。默认导入同一软件包中的资产。其他软件包中的现有资产可以通过 DRL 规则导入。
5.2.4.2. 使用 DRL designer 定义员工指定限制 复制链接链接已复制到粘贴板!
您可以使用 Business Central 中的自由-form DRL 设计器为员工名册创建约束定义。
使用此流程创建一个 硬约束,使其没有员工分配在之前的 10 小时后开始的转换。
流程
-
在 Business Central 中,前往 Menu
Design Projects 并点项目名称。 -
点 Add Asset
DRL 文件。 -
在 DRL 文件名 字段中,键入
complexScoreRules。 -
选择 employees
rostering.employeerostering软件包。 - 点 +Ok 创建 DRL 文件。
在 DRL 设计器的 Model 选项卡中,将
Employee10HourShiftSpace规则定义为 DRL 文件:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 点 Save 保存 DRL 文件。
有关创建 DRL 文件的更多信息,请参阅使用 DRL 规则设计决策服务。
5.2.5. 使用指导规则为员工名单创建规则 复制链接链接已复制到粘贴板!
您可以使用 Business Central 中的指导规则设计人员创建为员工名单定义硬和软约束的规则。
5.2.5.1. 指导规则 复制链接链接已复制到粘贴板!
指导规则是您通过规则创建在业务中心基于 UI 的指导规则设计者中创建的业务规则。指导规则设计器根据所定义规则的数据对象,提供可接受输入的字段和选项。您定义的指南规则与所有其他规则资产一样编译为 Drools Rule Language(DRL)规则。
与指导规则相关的所有数据对象都必须位于与指导规则相同的项目软件包中。默认导入同一软件包中的资产。创建必要的数据对象和指导规则后,您可以使用指南规则设计器的 Data Objects 选项卡来验证所有所需数据对象是否已列出或导入其他现有数据对象,方法是添加新项目。
5.2.5.2. 创建用于平衡员工切换数量的指导规则 复制链接链接已复制到粘贴板!
BalanceEmployeesShiftNumber 指导规则创建一个软约束,确保以尽可能均匀地平衡的方式为员工分配切换。它通过创建一个分数影响,在变送变小时增加。分数公式由规则实施,使 Solver 以更均衡的方式分发转换。
流程
-
在 Business Central 中,前往 Menu
Design Projects 并点项目名称。 -
点 Add Asset
Guided Rule。 -
输入
BalanceEmployeesShiftNumber作为 引导规则 名称,再选择 employeesrostering.employeerostering软件包。 - 点 Ok 创建规则资产。
-
点 WHEN 字段中的
来添加 WHEN 条件。
-
在规则窗口的 Add a 条件 中选择
Employee。单击 +Ok。 -
单击
Employee条件来修改限制,并添加变量名称$employee。 添加来自 加速
的 WHEN 条件。-
在
From Accumulate条件 上方点击 添加模式 并选择Number作为事实类型,从下拉列表中选择 Number。 -
将变量名称
$shiftCount添加到Number条件中。 -
在
From Accumulate条件下,单击添加模式,然后从下拉列表中选择ShiftAssignmentfact 类型。 -
将变量名称
$shiftAssignment添加到ShiftAssignmentfact 类型。 -
再次单击
ShiftAssignment条件,然后从 Add a restrictions on a field 下拉列表中选择 employees。 -
从 employees 约束旁边的下拉列表中选择
等于。 -
点击下拉按钮旁的
图标添加变量,然后点击 Field value 窗口中的 Bound 变量。
-
从下拉列表中选择
$employee。 -
在 Function 框中,键入
count($shiftAssignment)。
-
在
-
点 wordpress N 字段中的
来添加 wordpressN 条件。
在 Add a new action 窗口中选择
Modify Soft Score。单击 +Ok。-
在方框中输入以下表达式:
-($shiftCount.intValue()*$shiftCount.intValue())
-
在方框中输入以下表达式:
- 单击右上角的 Validate 来检查所有规则条件是否有效。如果规则验证失败,解决错误消息中描述的任何问题,查看规则中的所有组件,然后重试验证规则直到规则通过为止。
- 单击 Save 以保存该规则。
有关创建指导规则的更多信息 ,请参阅使用指导规则设计决策服务。
5.2.5.3. 为每天不一换个变化创建指导规则 复制链接链接已复制到粘贴板!
OneEmployeeShiftPerDay 指导规则创建了一个硬约束,员工不会超过一天的转变。在员工指定示例中,这个约束是使用指导的规则设计人员创建的。
流程
-
在 Business Central 中,前往 Menu
Design Projects 并点项目名称。 -
点 Add Asset
Guided Rule。 -
输入
OneEmployeeShiftPerDay作为 引导规则 名称,再选择 employeesrostering.employeerostering软件包。 - 点 Ok 创建规则资产。
-
点 WHEN 字段中的
来添加 WHEN 条件。
- 从 Add a condition to rule 窗口中选择 Free form DRL。
在自由表单 DRL 框中,输入以下条件:
$shiftAssignment : ShiftAssignment( employee != null ) ShiftAssignment( this != $shiftAssignment , employee == $shiftAssignment.employee , shift.timeslot.startTime.toLocalDate() == $shiftAssignment.shift.timeslot.startTime.toLocalDate() )
$shiftAssignment : ShiftAssignment( employee != null ) ShiftAssignment( this != $shiftAssignment , employee == $shiftAssignment.employee , shift.timeslot.startTime.toLocalDate() == $shiftAssignment.shift.timeslot.startTime.toLocalDate() )Copy to Clipboard Copied! Toggle word wrap Toggle overflow 此条件指出,不能分配给已经在同一天进行另一个切换分配的员工。
-
点 wordpress N 字段中的
来添加 wordpressN 条件。
- 从 Add a new action 窗口中选择 Add free form DRL。
在自由表单 DRL 框中,输入以下条件:
scoreHolder.addHardConstraintMatch(kcontext, -1);
scoreHolder.addHardConstraintMatch(kcontext, -1);Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 单击右上角的 Validate 来检查所有规则条件是否有效。如果规则验证失败,解决错误消息中描述的任何问题,查看规则中的所有组件,然后重试验证规则直到规则通过为止。
- 单击 Save 以保存该规则。
有关创建指导规则的更多信息 ,请参阅使用指导规则设计决策服务。
5.2.5.4. 创建一条指导规则以满足不断变化的要求技能 复制链接链接已复制到粘贴板!
ShiftReqiredSkillsAreMet guided 规则创建了一个硬约束,以确保所有转换都被分配了一组正确技能的员工。在员工指定示例中,这个约束是使用指导的规则设计人员创建的。
流程
-
在 Business Central 中,前往 Menu
Design Projects 并点项目名称。 -
点 Add Asset
Guided Rule。 -
输入
ShiftReqiredSkillsAreMet作为 引导规则 名称并选择 employeesrostering.employeerostering软件包。 - 点 Ok 创建规则资产。
-
点 WHEN 字段中的
来添加 WHEN 条件。
-
选择 Add a condition to rule 窗口中的
ShiftAssignment。单击 +Ok。 -
单击
ShiftAssignment条件,然后从 Add a limits on a field 下拉列表中选择 employees。 -
在设计人员中,单击
员工旁边的下拉列表,然后选择不是 null。 单击
ShiftAssignment条件,然后单击 Expression 编辑器。-
在设计人员中,单击
[not bound]以打开 Expression 编辑器,并将表达式绑定到变量$requiredSkill。点 Set。 -
在设计人员(
/requiredSkill旁边),从第一个下拉列表中选择转换,然后从下一下拉列表中选择requiredSkill。
-
在设计人员中,单击
单击
ShiftAssignment条件,然后单击 Expression 编辑器。-
在设计人员(
[not bound]旁边),从第一个下拉列表中选择员工,然后从下一下拉列表中选择技能。 -
将下一个下拉列表保留为
选择。 -
在下一个下拉菜单中,请更改
以排除。 -
点击
排除的
图标,在 Field value 窗口中点击 New formula 按钮。
-
在公式框中输入
$requiredSkill。
-
在设计人员(
-
点 wordpress N 字段中的
来添加 wordpressN 条件。
-
在 Add a new action 窗口中选择
Modify Hard Score。单击 +Ok。 -
在分数操作框中输入
-1。 - 单击右上角的 Validate 来检查所有规则条件是否有效。如果规则验证失败,解决错误消息中描述的任何问题,查看规则中的所有组件,然后重试验证规则直到规则通过为止。
- 单击 Save 以保存该规则。
有关创建指导规则的更多信息 ,请参阅使用指导规则设计决策服务。
5.2.5.5. 创建用于管理开箱即用请求的指南规则 复制链接链接已复制到粘贴板!
DayOffRequest guided 规则会创建一个软约束。如果最初被分配了该转换的人,则这个限制可以重新分配给另一位员工。在员工指定示例中,这个约束是使用指导的规则设计人员创建的。
流程
-
在 Business Central 中,前往 Menu
Design Projects 并点项目名称。 -
点 Add Asset
Guided Rule。 -
输入
DayOffRequest作为 引导规则 名称,再选择 employeesrostering.employeerostering软件包。 - 点 Ok 创建规则资产。
-
点 WHEN 字段中的
来添加 WHEN 条件。
- 从 Add a condition to rule 窗口中选择 Free form DRL。
在自由表单 DRL 框中,输入以下条件:
$dayOffRequest : DayOffRequest( ) ShiftAssignment( employee == $dayOffRequest.employee , shift.timeslot.startTime.toLocalDate() == $dayOffRequest.date )
$dayOffRequest : DayOffRequest( ) ShiftAssignment( employee == $dayOffRequest.employee , shift.timeslot.startTime.toLocalDate() == $dayOffRequest.date )Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果转移被分配给一个进行当天发出的某个员工,则该条件将指出,该条件可以取消对当天的转换进行取消签名。
-
点 wordpress N 字段中的
来添加 wordpressN 条件。
- 从 Add a new action 窗口中选择 Add free form DRL。
在自由表单 DRL 框中,输入以下条件:
scoreHolder.addSoftConstraintMatch(kcontext, -100);
scoreHolder.addSoftConstraintMatch(kcontext, -100);Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 单击右上角的 Validate 来检查所有规则条件是否有效。如果规则验证失败,解决错误消息中描述的任何问题,查看规则中的所有组件,然后重试验证规则直到规则通过为止。
- 单击 Save 以保存该规则。
有关创建指导规则的更多信息 ,请参阅使用指导规则设计决策服务。
5.2.6. 为员工降级创建解决器配置 复制链接链接已复制到粘贴板!
您可以在 Business Central 中创建并编辑 Solver 配置。Solver 配置设计器会创建一个解决器配置,可在项目部署后运行。
先决条件
- Red Hat Decision Manager 已经下载并安装。
- 您已为员工名录示例创建并配置了所有相关资产。
流程
-
在 Business Central 中,点击 Menu
Projects,然后点击您的项目打开它。 -
在 Assets 视角中,点 Add Asset
Solver 配置 在 Create new Solver 配置 窗口中,为您的 Solver 键入名称
EmployeeRosteringSolverConfig,然后点击 Ok。这会打开 Solv er 配置 设计器。
在 Score Director Factory 配置部分中,定义包含评分规则定义的 KIE 基础。员工的 rostering 示例项目使用
defaultKieBase。-
选择在 KIE 基本中定义的一个 KIE 会话。员工的 rostering 示例项目使用
defaultKieSession。
-
选择在 KIE 基本中定义的一个 KIE 会话。员工的 rostering 示例项目使用
- 单击右上角的 Validate,以检查 Score Director Factory 配置是否正确。如果验证失败,解决错误消息中描述的任何问题,然后重试进行验证,直到配置通过。
- 点 Save 保存 Solver 配置。
5.2.7. 为员工降级项目配置 Solver 终止 复制链接链接已复制到粘贴板!
您可以将 Solver 配置为在指定时间后终止。默认情况下,计划引擎会提供无限的时间段来解决问题实例。
员工的 rostering 示例项目设置为运行 30 秒。
先决条件
-
您已为员工名册项目创建了所有相关资产,并在 Business Central 中创建了
EmployeeRosteringSolverConfigsolver 配置,如 第 5.2.6 节 “为员工降级创建解决器配置” 所述。
流程
-
从 Assets 视角打开
EmployeeRosteringSolverConfig。这将打开 Solv er 配置 设计器。 - 在 Termination 部分,点 Add 在所选逻辑组中创建新终止元素。
-
从下拉列表中选择所花费的终止类型。这会在终止配置中添加为输入字段。 - 使用时间元素旁边的箭头来调整 30 秒的时间。
- 单击右上角的 Validate,以检查 Score Director Factory 配置是否正确。如果验证失败,解决错误消息中描述的任何问题,然后重试进行验证,直到配置通过。
- 点 Save 保存 Solver 配置。