最適化
シフト最適化(時間配分タイプ)
概要
このブロックは、従業員の勤務時間を動的に配分して最適なシフト計画を自動で作成します。これにより、人員配置の最適化とコスト削減が期待できます。従来のシフト最適化と異なり、時間配分タイプでは、勤務時間数を柔軟に調整しながら必要な業務量をカバーする最適な配分計画を立てることができます。
「時間配分タイプ」では、従業員の勤務可能な時間、グループ割当て、業務スキル、コスト制約などを総合的に考慮し、時間軸での最適な配分パターンを自動的に計算します。これにより、複雑な条件下でも公平なシフト配分が実現できます。
内部では、状況に応じて最適な計算エンジン(専門的にはソルバーと呼ばれ、D-Wave、SQBM+、Amplify AEなどが該当)が自動的に選択されます。量子コンピューティング技術(量子アニーリングなど)をはじめとする先進技術を用いて高速に計算処理を行います。利用者は技術的な詳細を意識することなく、最適なシフト配分結果のみが簡単に得られます。
プロパティ
プロパティ名 | 説明 |
---|---|
ブロック名 |
フローの中で、このブロックを識別するための表示名を設定します。例えば、「 |
GCPサービスアカウント |
最適化処理を実行するために、Google Cloud Platform(GCP)のサービスアカウントを選択します。処理に必要な権限を持つアカウントを設定してください。 |
データセット |
BigQueryのデータセットを指定します。(必須) このデータセットには、最適化計算に使用する入力データテーブルと、計算結果を保存する出力データテーブルが含まれます。 具体的には、従業員情報、ジョブ情報、時間情報、アサイン計画、制約条件などが格納されたテーブルをこのデータセット内に準備してください。 |
アサイン情報が保存されているテーブル |
アサイン計画に関する情報(時間ID、ジョブID、割当人数の上下限など)が格納されたテーブル名を指定します。(必須) このテーブルには、「 |
シフトパラメータが保存されているテーブル |
各制約に対応するパラメータ(重み)が格納されたテーブル名を指定します。(必須) このテーブルには、以下のパラメータが含まれます。 「 |
ジョブ関連情報が保存されているテーブル |
ジョブ間の関連情報が格納されたテーブル名を指定します。 このテーブルには、「 |
ジョブ情報が保存されているテーブル |
ジョブ(Job)に関する情報が格納されたテーブル名を指定します。(必須) このテーブルには、「 |
従業員、ジョブ関連情報が保存されているテーブル |
従業員とジョブの関連情報が格納されたテーブル名を指定します。(必須) このテーブルには、「 |
ジョブ割当制約が保存されているテーブル |
従業員に対するジョブの割当回数や総労働時間に関する制約を定義するテーブル名を指定します。(必須) このテーブルには、「 |
従業員情報が保存されているテーブル |
従業員に関する基本情報が格納されたテーブル名を指定します。(必須) このテーブルには、「 |
時間情報が保存されているテーブル |
割当ての時間を定義するテーブル名を指定します。(必須) このテーブルには、「 |
実行結果を格納するテーブル |
最適化計算の結果(具体的なシフト配分計画)を格納するテーブル名を指定します。 指定しない場合、計算結果は保存されません。最適化結果を保存し、他の処理ブロックから参照したり、後で分析したりする場合は必ず設定してください。事前に作成する必要はなく、指定したテーブルがなければ、自動作成されます。既に存在する場合は、追加されます。 |
結果を格納する変数 |
最適化実行の基本的な情報(ジョブIDなど)を格納する変数名を指定します。(必須) この変数には、実行結果に関する基本的な情報が格納され、後続の処理ブロックで参照できます。 |
最適化実行に関する情報を格納する変数 |
最適化処理を実行した際の詳細情報(メタデータ)を格納する変数名を指定します。 この変数には、実行時間、使用したソルバー、エネルギー値などの詳細情報が格納されます。 |
ジョブのラベル名 |
実行する最適化ジョブに付与するラベル名(識別名)を指定します。 複数の最適化処理を区別するために使用します。特に、複数のジョブを同時に実行する場合や、後で特定のジョブの結果を確認する際に役立ちます。 |
ブロックメモ |
このブロックに関するメモを自由に記述できます。 フローの管理やメンテナンス時の情報共有に役立ちます。このメモの内容は、ブロックの実行には影響しません。 |
シフトの処理ステップ |
シフト最適化の処理ステップ数を指定します。 一般的には1000ステップで良好な結果が得られますが、問題の複雑さに応じて調整できます。値が大きいほど精度が向上しますが、計算時間も増加します。 |
シフトの処理回数 |
シフト最適化の処理回数を指定します。 一般的には10回で良好な結果が得られます。より良い解を求める場合は値を大きくできます。回数が多いほど解の品質は向上する可能性があるが、計算時間も増加する。 |
テーブルスキーマ
このブロックでは、複数の入力情報(テーブル形式)と、結果を格納する出力情報(テーブル形式)を使用します。それぞれのテーブルがどのような構造を持ち、どのようなデータを含める必要があるかを理解しておくことが重要です。
注:「必須」列の「✓」マークは、その項目が必須であることを示します。「*」付きのものは条件付き必須を示します(詳細は各テーブルの説明を参照)。
1. アサイン情報が保存されているテーブル
アサイン計画を定義するテーブルです。各時間帯にどのジョブで何人必要かを指定します。時間配分タイプでは、上下限で人数の範囲を指定できます。
JSONスキーマを表示
[
{ "name": "time_id", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "group_id", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "lower_bound", "type": "INTEGER", "mode": "NULLABLE", "description": "" },
{ "name": "upper_bound", "type": "INTEGER", "mode": "NULLABLE", "description": "" }
]
カラム名 | データ型 | 必須/条件付き | 説明 |
---|---|---|---|
time_id | 文字列(STRING) | ✓ | 時間ID(下記「8. 時間情報が保存されているテーブル」の time_id と対応) |
group_id | 文字列(STRING) | ✓ | ジョブID(下記「4. ジョブ情報が保存されているテーブル」の group_id と対応) |
lower_bound | 整数(INTEGER) | ✓ | 割当人数の下限値。この時間・ジョブに必要な最小人数。 |
upper_bound | 整数(INTEGER) | ✓ | 割当人数の上限値。この時間・ジョブに配置できる最大人数。 |
2. シフトパラメータが保存されているテーブル
各制約に対応するパラメータを定義するテーブルです。時間配分タイプでは、5つの主要な制約パラメータを設定します。いずれも大きな値になるほどその制約条件が優先されます。
JSONスキーマを表示
[
{ "name": "jobconn", "type": "INTEGER", "mode": "NULLABLE", "description": "" },
{ "name": "emptime", "type": "INTEGER", "mode": "NULLABLE", "description": "" },
{ "name": "empplan", "type": "INTEGER", "mode": "NULLABLE", "description": "" },
{ "name": "dayplan", "type": "INTEGER", "mode": "NULLABLE", "description": "" },
{ "name": "empcaps", "type": "INTEGER", "mode": "NULLABLE", "description": "" }
]
カラム名 | データ型 | 必須/条件付き | 説明 |
---|---|---|---|
jobconn | 整数(INTEGER) | ✓ | ジョブ接続制約。下記「3. ジョブ関連情報が保存されているテーブル」に対する制約の重み。 |
emptime | 整数(INTEGER) | ✓ | 総労働時間の制約。下記「6. ジョブ割当制約が保存されているテーブル」(group_idなし)に対する制約の重み。 |
empplan | 整数(INTEGER) | ✓ | ジョブの割当て日数制約。下記「6. ジョブ割当制約が保存されているテーブル」(group_idあり)に対する制約の重み。 |
dayplan | 整数(INTEGER) | ✓ | アサイン割当て制約。上記「1. アサイン情報が保存されているテーブル」に対する制約の重み。 |
empcaps | 整数(INTEGER) | ✓ | 実行可能ジョブ制約。下記「5. 従業員、ジョブ関連情報が保存されているテーブル」に対する制約の重み。 |
3. ジョブ関連情報が保存されているテーブル
ジョブ間の関連情報を定義するテーブルです。連続して割り当てるジョブ間のコストを設定します。制約として不要な場合は設定を省略できます。
JSONスキーマを表示
[
{ "name": "previous_group_id", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "current_group_id", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "cost", "type": "INTEGER", "mode": "NULLABLE", "description": "0: no restriction, 0<: cost" }
]
カラム名 | データ型 | 必須/条件付き | 説明 |
---|---|---|---|
previous_group_id | 文字列(STRING) | ✓ | 前の割当ジョブID(下記「4. ジョブ情報が保存されているテーブル」の group_id と対応) |
current_group_id | 文字列(STRING) | ✓ | 割当ジョブID(下記「4. ジョブ情報が保存されているテーブル」の group_id と対応) |
cost | 整数(INTEGER) | ✓ | 割当のコスト。0: 関連に制限を設定しない、0より大きい値: 大きければ大きいほど割当コストが高くなる(割り当てられ難くなる) |
4. ジョブ情報が保存されているテーブル
ジョブ(Job)を定義するテーブルです。時間配分タイプでは、各ジョブに必要な時間を指定します。
JSONスキーマを表示
[
{ "name": "group_id", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "group_name", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "group_duration", "type": "INTEGER", "mode": "NULLABLE", "description": "" }
]
カラム名 | データ型 | 必須/条件付き | 説明 |
---|---|---|---|
group_id | 文字列(STRING) | ✓ | ジョブを一意に識別するためのID(例:shift_a 、shift_b ) |
group_name | 文字列(STRING) | ジョブの表示名(例:「シフトA 」、「シフトB 」)。省略可能です。 |
|
group_duration | 整数(INTEGER) | ✓ | このジョブに必要な時間(時間単位)。時間配分の計算に使用されます。 |
5. 従業員、ジョブ関連情報が保存されているテーブル
従業員とジョブの関連情報を定義するテーブルです。どの従業員がどの時間、どのジョブへ所属できるかを示します。person_id-group_idのペアにtime_id(Timesで指定するすべての時間)を割り当てたレコードが必要です。
JSONスキーマを表示
[
{ "name": "person_id", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "time_id", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "group_id", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "cost", "type": "INTEGER", "mode": "NULLABLE", "description": "" }
]
カラム名 | データ型 | 必須/条件付き | 説明 |
---|---|---|---|
person_id | 文字列(STRING) | ✓ | 従業員ID(下記「7. 従業員情報が保存されているテーブル」の person_id と対応) |
time_id | 文字列(STRING) | ✓ | 時間ID(下記「8. 時間情報が保存されているテーブル」の time_id と対応) |
group_id | 文字列(STRING) | ✓ | ジョブID(上記「4. ジョブ情報が保存されているテーブル」の group_id と対応) |
cost | 整数(INTEGER) | ✓ | 割り当てのコスト。0: 割り当てない、1: プライオリティが一番高い、2以上: 低いほどプライオリティが高くなる(割り当てられ易くなる) |
6. ジョブ割当制約が保存されているテーブル
従業員のジョブ割当回数や総労働時間に関する情報を定義するテーブルです。特定のジョブに対する割当回数を制限する場合は group_id
を指定し、従業員全体の総労働時間を制限する場合は group_id
をnullにします。
注:lower_bound
、upper_bound
の値は、ジョブID(group_id
)を設定するかしないかで意味が変わります。ジョブIDを設定した場合はそのジョブへの「割当回数」の上下限となり、設定しない場合は従業員の「総労働時間」の上下限となります。
JSONスキーマを表示
[
{ "name": "person_id", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "group_id", "type": "STRING", "mode": "NULLABLE", "description": "null is for this person's total working 'hours'" },
{ "name": "lower_bound", "type": "INTEGER", "mode": "NULLABLE", "description": "" },
{ "name": "upper_bound", "type": "INTEGER", "mode": "NULLABLE", "description": "" }
]
カラム名 | データ型 | 必須/条件付き | 説明 |
---|---|---|---|
person_id | 文字列(STRING) | ✓ | 従業員ID(下記「7. 従業員情報が保存されているテーブル」の person_id と対応) |
group_id | 文字列(STRING) | ジョブID。指定しない場合は従業員の総労働時間に関する制約となります。(上記「4. ジョブ情報が保存されているテーブル」の group_id と対応) |
|
lower_bound | 整数(INTEGER) | ✓ | 割当ての下限値。ジョブIDを設定した場合は該当従業員へのジョブ割当回数の下限、設定しない場合は総労働時間の下限。 |
upper_bound | 整数(INTEGER) | ✓ | 割当ての上限値。ジョブIDを設定した場合は該当従業員へのジョブ割当回数の上限、設定しない場合は総労働時間の上限。 |
7. 従業員情報が保存されているテーブル
従業員の基本情報を定義するテーブルです。シフト対象となる全ての従業員をここに登録します。
JSONスキーマを表示
[
{ "name": "person_id", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "person_name", "type": "STRING", "mode": "NULLABLE", "description": ""}
]
カラム名 | データ型 | 必須/条件付き | 説明 |
---|---|---|---|
person_id | 文字列(STRING) | ✓ | 従業員を一意に識別するためのID(例:emp_001 、staff_A ) |
person_name | 文字列(STRING) | 従業員の表示名(例:「田中太郎 」、「佐藤花子 」)。省略可能です。 |
8. 時間情報が保存されているテーブル
割当ての時間を定義するテーブルです。シフトの時間単位や期間を管理します。
JSONスキーマを表示
[
{ "name": "time_id", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "note", "type": "STRING", "mode": "NULLABLE", "description": "" }
]
カラム名 | データ型 | 必須/条件付き | 説明 |
---|---|---|---|
time_id | 文字列(STRING) | ✓ | 時間を一意に識別するためのID(例:2024-01-01 、morning ) |
note | 文字列(STRING) | 時間IDの説明や付帯情報(例:「2024年1月1日 午前 」、「営業時間 」)。省略可能です。 |
9. 実行結果を格納するテーブル
最適化計算の実行後に生成される結果が格納されるテーブルです。どの従業員がどの時間にどのジョブへ配置されたかが記録されます。時間配分タイプでは、時間ID(time_id)ベースで結果が出力されます。
JSONスキーマを表示
[
{ "name": "job_id", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "energy", "type": "FLOAT", "mode": "NULLABLE", "description": "" },
{ "name": "solution_index", "type": "INTEGER", "mode": "NULLABLE", "description": "" },
{ "name": "person_index", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "person_id", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "person_name", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "group_index", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "group_id", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "group_name", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "time_id", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "time_note", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "label", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "created_at", "type": "TIMESTAMP", "mode": "NULLABLE", "description": "" }
]
カラム名 | データ型 | 出力有無 | 説明 |
---|---|---|---|
job_id | 文字列(STRING) | 必須 | 実行された最適化ジョブのID |
energy | 数値(FLOAT) | 必須 | 計算結果の評価値(エネルギー値)。値が小さいほど、制約条件をよく満たした良い解であることを示します。 |
solution_index | 整数(INTEGER) | 必須 | 複数の解が得られた場合の、解のインデックス番号(時間配分タイプでは通常0固定) |
person_index | 文字列(STRING) | 条件付き | 内部で設定された従業員IDに対応するインデックス |
person_id | 文字列(STRING) | 必須 | 従業員ID(上記「7. 従業員情報が保存されているテーブル」の person_id と対応) |
person_name | 文字列(STRING) | 条件付き | 従業員名(上記「7. 従業員情報が保存されているテーブル」の person_name と対応) |
group_index | 文字列(STRING) | 条件付き | 内部で設定されたジョブIDに対応するインデックス |
group_id | 文字列(STRING) | 必須 | ジョブID(上記「4. ジョブ情報が保存されているテーブル」の group_id と対応) |
group_name | 文字列(STRING) | 条件付き | ジョブ名(上記「4. ジョブ情報が保存されているテーブル」の group_name と対応) |
time_id | 文字列(STRING) | 必須 | 時間ID(上記「8. 時間情報が保存されているテーブル」の time_id と対応) |
time_note | 文字列(STRING) | 条件付き | 時間IDに対応する付帯情報(上記「8. 時間情報が保存されているテーブル」の note と対応) |
label | 文字列(STRING) | 必須 | 実行されたジョブのラベル名 |
created_at | タイムスタンプ(TIMESTAMP) | 条件付き | 実行ジョブの作成時間 |