Red Hat Training
A Red Hat training course is available for Red Hat Decision Manager
第6章 ガイド付きルールを使用して従業員の勤務表にルールの作成
Decision Central でガイド付きルールデザイナーを使用して、従業員の勤務表にハード制約およびソフト制約を定義するルールを作成できます。
6.1. ガイド付きルール
ガイド付きルールは、ルール作成のプロセスを提供する、Decision Central の UI ベースのガイド付きルールデザイナーで作成するビジネスルールです。ガイド付きルールデザイナーを使用すると、ルールを定義するデータオブジェクトに基づいて、可能なインプットにフィールドおよびオプションを提供します。定義したガイド付きルールは、その他のすべてのルールアセットとともに Drools Rule Language (DRL) ルールにコンパイルされます。
ガイド付きルールに関連するすべてのデータオブジェクトは、ガイド付きルールと同じプロジェクトパッケージに置く必要があります。同じパッケージに含まれるアセットはデフォルトでインポートされます。必要なデータオブジェクトとガイド付きルールを作成したら、ガイド付きルールデザイナーの Data Objects タブから、必要なデータオブジェクトがすべてリストされていることを検証したり、 新規アイテム を追加してその他の既存データオブジェクトをインポートしたりできます。
6.2. 従業員のシフト数のバランスを取るガイド付きルールの作成
ガイド付きルール BalanceEmployeesShiftNumber は、可能な限りバランスを取るように従業員にシフトを割り当てるソフト制約を作成します。これは、シフトの分配が平等でなくなると増えるスコアペナルティーを作成することで行います。ルールによって実装されたスコア式により、Solver がよりバランスの取れるようにシフトを分散させます。

手順
- Menu → Design → Projects に移動して、プロジェクト名をクリックします。
- Create New Asset → Guided Rule をクリックします。
-
Guided Rule 名 に
BalanceEmployeesShiftNumberを入力し、Package でemployeerostering.employeerosteringを選択します。 - OK をクリックして、ルールアセットを作成します。
-
WHEN フィールドで
をクリックして、WHEN 条件を追加します。
-
Add a condition to the rule ウィンドウで
Employeeを選択し、+Ok をクリックします。 -
Employee条件でクリックして制約を修正し、変数名$employeeを追加します。 WHEN 条件
From Accumulateを追加します。-
From Accumulate条件の上で click to add pattern をクリックし、ドロップダウンリストでファクトタイプNumberを選択します。 -
変数名
$shiftCountをNumber条件に追加します。 -
From Accumulate条件の下で click to add pattern をクリックして、ドロップダウンリストでShiftAssignmentファクトタイプを選択します。 -
変数名
$shiftAssignmentをShiftAssignmentファクトタイプに追加します。 -
ShiftAssignment条件を再度クリックし、Add a restriction on a field ドロップダウンリストでemployeeを選択します。 -
employee制約の横にあるドロップダウンリストでequal toを選択します。 -
ドロップダウンボタンの横の
アイコンをクリックして変数を追加し、Field value ウィンドウで Bound variable をクリックします。
-
ドロップダウンリストで
$employeeを選択します。 -
Function ボックスに
count($shiftAssignment)と入力します。
-
-
THEN フィールドで
をクリックして、THEN 条件を追加します。
Add a new action ウィンドウで
Modify Soft Scoreを選択し、+Ok をクリックします。-
ボックスに
-($shiftCount.intValue()*$shiftCount.intValue())と入力します。
-
ボックスに
- 右上の Validate をクリックし、ルール条件がすべて有効であることを確認します。ルールの妥当性確認に失敗したら、エラーメッセージに記載された問題に対応し、ルールの全コンポーネントを見直し、エラーが表示されなくなるまでルールの妥当性確認を行います。
- Save をクリックして、ルールを保存します。
ガイド付きルールの作成方法は『ガイド付きルールを使用したデシジョンサービスの作成』を参照してください。
6.3. 同じ日に複数のシフトを割り当てないようにするガイド付きルールの作成
ガイド付きルール OneEmployeeShiftPerDay は、同じ日の複数のシフトに従業員を割り当てないようにするハード制約を作成します。従業員の勤務表サンプルでは、このガイド付きルールデザイナーを使用してこの制約が作成されます。

手順
- Menu → Design → Projects に移動して、プロジェクト名をクリックします。
- Create New Asset → Guided Rule をクリックします。
-
Guided Rule 名に
OneEmployeeShiftPerDayと入力し、Package でemployeerostering.employeerosteringを選択します。 - OK をクリックして、ルールアセットを作成します。
-
WHEN フィールドで
をクリックして、WHEN 条件を追加します。
- Add a condition to the rule ウィンドウから Free form DRL を選択します。
フリーフォームの DRL ボックスに、以下の条件を入力します。
$shiftAssignment : ShiftAssignment( employee != null ) ShiftAssignment( this != $shiftAssignment , employee == $shiftAssignment.employee , shift.timeslot.startTime.toLocalDate() == $shiftAssignment.shift.timeslot.startTime.toLocalDate() )
この条件は、同じ日に別のシフトがすでに割り当てられている従業員にはシフトを割り当てることができないことを示しています。
-
THEN フィールドで
をクリックして、THEN 条件を追加します。
- Add a new action ウィンドウから Add free form DRL を選択します。
フリーフォームの DRL ボックスに、以下の条件を入力します。
scoreHolder.addHardConstraintMatch(kcontext, -1);
- 右上の Validate をクリックし、ルール条件がすべて有効であることを確認します。ルールの妥当性確認に失敗したら、エラーメッセージに記載された問題に対応し、ルールの全コンポーネントを見直し、エラーが表示されなくなるまでルールの妥当性確認を行います。
- Save をクリックして、ルールを保存します。
ガイド付きルールの作成方法は『ガイド付きルールを使用したデシジョンサービスの作成』を参照してください。
6.4. シフト要件にスキルを一致させるガイド付きルールの作成
ガイド付きルール ShiftReqiredSkillsAreMet は、すべてのシフトが、適切なスキルセットを持つ従業員に割り当てられるのを確認するハード制約を作成します。従業員の勤務表サンプルでは、ガイド付きルールデザイナーを使用してこの制約を作成します。

手順
- Menu → Design → Projects に移動して、プロジェクト名をクリックします。
- Create New Asset → Guided Rule をクリックします。
-
Guided Rule 名に
ShiftReqiredSkillsAreMetと入力し、Package でemployeerostering.employeerosteringを選択します。 - OK をクリックして、ルールアセットを作成します。
-
WHEN フィールドで
をクリックして、WHEN 条件を追加します。
-
Add a condition to the rule ウィンドウで
ShiftAssignmentを選択します。+Ok をクリックします。 -
ShiftAssignment条件をクリックし、Add a restriction on a field ドロップダウンリストでemployeeを選択します。 -
デザイナーで、
employeeの横のドロップダウンリストをクリックし、is not nullを選択します。 ShiftAssignment条件をクリックし、Expression editor をクリックします。-
デザイナーで、
[not bound]をクリックし、Expression editor を開き、式と変数$requiredSkillをバインドします。Set をクリックします。 -
デザイナーの
$requiredSkillの横にあるドロップダウンリストでshiftを選択し、その隣のドロップダウンリストでrequiredSkillを選択します。
-
デザイナーで、
ShiftAssignment条件をクリックし、Expression editor をクリックします。-
デザイナーで、
[not bound]の横にあるドロップダウンリストでemployeeを選択し、その隣のドロップダウンリストでskillsを選択します。 -
その隣のドロップダウンリストでは
Chooseを選択したままにします。 -
その隣のドロップダウンボックスで、
please chooseをexcludesに変更します。 -
excludesの隣の
アイコンをクリックし、Field value ウィンドウで New formula ボタンをクリックします。
-
式ボックスに
$requiredSkillを追加します。
-
デザイナーで、
-
THEN フィールドで
をクリックして、THEN 条件を追加します。
-
Add a new action ウィンドウで
Modify Hard Scoreを選択し、+Ok をクリックします。 -
スコアアクションボックスに
-1を入力します。 - 右上の Validate をクリックし、ルール条件がすべて有効であることを確認します。ルールの妥当性確認に失敗したら、エラーメッセージに記載された問題に対応し、ルールの全コンポーネントを見直し、エラーが表示されなくなるまでルールの妥当性確認を行います。
- Save をクリックして、ルールを保存します。
ガイド付きルールの作成方法は『ガイド付きルールを使用したデシジョンサービスの作成』を参照してください。
6.5. 休暇申請を管理するガイド付きルールの作成
ガイド付きルール DayOffRequest は、そのシフトに元々割り当てられていた従業員がその日に就業できなくなった場合に、別の従業員にシフトを再割り当てできるようにするソフト制約を作成します。従業員の勤務表サンプルでは、この制約はガイド付きルールデザイナーを使用して作成されます。

手順
- Menu → Design → Projects に移動して、プロジェクト名をクリックします。
- Create New Asset → Guided Rule をクリックします。
-
Guided Rule 名に
DayOffRequestと入力し、Package でemployeerostering.employeerosteringを選択します。 - OK をクリックして、ルールアセットを作成します。
-
WHEN フィールドで
をクリックして、WHEN 条件を追加します。
- Add a condition to the rule ウィンドウから Free form DRL を選択します。
フリーフォームの DRL ボックスに、以下の条件を入力します。
$dayOffRequest : DayOffRequest( ) ShiftAssignment( employee == $dayOffRequest.employee , shift.timeslot.startTime.toLocalDate() == $dayOffRequest.date )
この条件は、休暇申請を行った従業員にシフトを割り当てている場合に、その従業員をその日のシフト割り当てから削除できることを示しています。
-
THEN フィールドで
をクリックして、THEN 条件を追加します。
- Add a new action ウィンドウから Add free form DRL を選択します。
フリーフォームの DRL ボックスに、以下の条件を入力します。
scoreHolder.addSoftConstraintMatch(kcontext, -100);
- 右上の Validate をクリックし、ルール条件がすべて有効であることを確認します。ルールの妥当性確認に失敗したら、エラーメッセージに記載された問題に対応し、ルールの全コンポーネントを見直し、エラーが表示されなくなるまでルールの妥当性確認を行います。
- Save をクリックして、ルールを保存します。
ガイド付きルールの作成方法は『ガイド付きルールを使用したデシジョンサービスの作成』を参照してください。