最適化
シフト最適化(複数実行)
概要
このブロックは、人員のシフト管理を複数のパラメータセットで同時に最適化し、最適な人員の配置計画を効率的に比較・検討することを可能にします。例えば、病院の看護師シフト、コールセンターのオペレーター配置、工場の作業員シフトなど、様々な業界での複雑な人員配置の課題に対応できます。
「複数実行タイプ」では、異なる重み付けや制約条件を設定した複数のシナリオを並列実行し、それぞれの結果を比較することで、現実的なビジネス要件に最も適した配置パターンを選択できます。これにより、「コスト最優先」「出勤の希望最優先」「公平性重視」など、様々な方針での最適化結果を一度に得ることができます。
内部では、レイヤー構造(時間の粒度別階層)とスコープ(最適化の対象範囲)を用いて問題を構造化し、量子コンピューティング技術(量子アニーリングなど)をはじめとする先進技術を活用して高速に計算処理を行います。利用者は複雑な技術的詳細を意識することなく、実用的なシフト計画のみが得られます。
プロパティ
プロパティ名 | 説明 |
---|---|
ブロック名 |
フローの中で、このブロックを識別するための表示名を設定します。例えば、「 |
GCPサービスアカウント |
最適化処理を実行するために、Google Cloud Platform(GCP)のサービスアカウントを選択します。処理に必要な権限を持つアカウントを設定してください。 |
入力テーブル群を指定するデータセット |
BigQueryのデータセットを指定します。(必須) このデータセットには、シフト最適化計算に使用する複数の入力データテーブル(人員マスタ、グループマスタ、所属関係、制約条件など)と、複数実行用のパラメータテーブル、計算結果を保存する出力データテーブルが含まれます。 |
入力テーブル群を指定するテーブル |
複数実行のパラメータと、各実行で使用する入力テーブル群の情報が格納されたテーブル名を指定します。(必須) このテーブルには、実行ラベル( 行ごとに異なるパラメータセットで最適化ジョブが生成されます。 |
結果を格納する変数 |
最適化処理を実行した際の複数ジョブ全体の情報を格納する変数名を指定します。(必須) この変数には、各実行のジョブIDや処理状況に関する情報が格納され、後続の処理ブロックで参照できます。具体的には、実行されたジョブのリストと各ジョブの基本的な情報が含まれます。 |
ブロックメモ |
このブロックに関するメモを自由に記述できます。 フローの管理やメンテナンス時の情報共有に役立ちます。このメモの内容は、ブロックの実行には影響しません。 |
テーブルスキーマ
このブロックでは、複数実行のパラメータを含む1つの入力情報(テーブル形式)と、各実行で使用される複数の入力テーブル、結果を格納する出力情報(テーブル形式)を使用します。それぞれのテーブルがどのような構造を持ち、どのようなデータを含める必要があるかを理解しておくことが重要です。
注:「必須」列の「✓」マークは、その項目が必須であることを示します。「*」付きのものは条件付き必須を示します(詳細は各テーブルの説明を参照)。
1. 入力テーブル群を指定するテーブル(複数実行パラメータ)
複数実行のパラメータと、各実行で使用するテーブル群を指定するテーブルです。このテーブルの各行が、それぞれ独立したシフト最適化ジョブとして実行されます。
JSONスキーマを表示
[
{"name":"execution_label","mode":"NULLABLE","description":"label for this parameter","type":"STRING"},
{"name":"persons","mode":"NULLABLE","description":"persons master table","type":"STRING"},
{"name":"groups","mode":"NULLABLE","description":"groups master table","type":"STRING"},
{"name":"belongs","mode":"NULLABLE","description":"person group relations table","type":"STRING"},
{"name":"work_types","mode":"NULLABLE","description":"persons work types table","type":"STRING"},
{"name":"time_indices","mode":"NULLABLE","description":"layer time index table","type":"STRING"},
{"name":"assigns","mode":"NULLABLE","description":"assigns table","type":"STRING"},
{"name":"assign_limitations","mode":"NULLABLE","description":"assign limitation table","type":"STRING"},
{"name":"person_costs","mode":"NULLABLE","description":"person costs table","type":"STRING"},
{"name":"group_costs","mode":"NULLABLE","description":"group costs table","type":"STRING"},
{"name":"group_relations","mode":"NULLABLE","description":"group costs table","type":"STRING"},
{"name":"coefficients","mode":"NULLABLE","description":"coefficient table","type":"STRING"},
{"name":"result","mode":"NULLABLE","description":"result table","type":"STRING"},
{"name":"result_job","mode":"NULLABLE","description":"result job table","type":"STRING"}
]
このテーブルの各行が、1つの独立した最適化ジョブを表します。係数テーブル(coefficients
)に複数のレコードがある場合は、それらも別々のジョブとして実行されるため、合計のジョブ数は「このテーブルの行数 × 係数テーブルの行数」となります。
2. 人員マスタ(Persons)
シフト対象となる従業員の基本情報を定義するテーブルです。
JSONスキーマを表示
[
{ "name": "person_id", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "person_name", "type": "STRING", "mode": "NULLABLE", "description": "" }
]
カラム名 | データ型 | 必須/条件付き | 説明 |
---|---|---|---|
person_id | 文字列(STRING) | ✓ | 従業員を一意に識別するためのID(例:EMP001 、nurse_tanaka ) |
person_name | 文字列(STRING) | 従業員の表示名(例:「田中太郎 」、「看護師_田中 」)。省略可能です。 |
3. グループマスタ(Groups)
アサイン対象となるグループ(配置先)の基本情報を定義するテーブルです。例えば、病院であれば「ICU」「外来」「救急」、工場であれば「製造ライン1」「検査部門」「出荷部門」などのグループを定義します。
JSONスキーマを表示
[
{ "name": "group_id", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "group_name", "type": "STRING", "mode": "NULLABLE", "description": "" }
]
カラム名 | データ型 | 必須/条件付き | 説明 |
---|---|---|---|
group_id | 文字列(STRING) | ✓ | グループを一意に識別するためのID(例:ICU 、LINE_A ) |
group_name | 文字列(STRING) | グループの表示名(例:「集中治療室 」、「製造ラインA 」)。省略可能です。 |
4. 所属関係(Belongs)
どの従業員がどのグループに所属できるか(配置可能か)を定義するテーブルです。ポイント制約を使用する場合は、人員とグループの組み合わせに対するポイント値も設定できます。
JSONスキーマを表示
[
{ "name": "person_id", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "group_id", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "point", "type": "INTEGER", "mode": "NULLABLE", "description": "" }
]
カラム名 | データ型 | 必須/条件付き | 説明 |
---|---|---|---|
person_id | 文字列(STRING) | ✓ | 従業員ID(人員マスタのperson_id と対応) |
group_id | 文字列(STRING) | ✓ | グループID(グループマスタのgroup_id と対応) |
point | 整数(INTEGER) | * | ポイント制約を使用する場合に必須。その人員とグループの組み合わせに割り当てられるポイント値 |
このテーブルに登録されていない人員とグループの組み合わせは、配置不可能として扱われます。すべての従業員をすべてのグループに配置可能とする場合は、全ての組み合わせのレコードを作成してください。
5. 従業員スケジュール設定(Work Types)
従業員の出勤・休暇スケジュールを定義するテーブルです。特定の時間に特定のグループで出勤可能(assignable)か、または休暇(unassignable)かを設定できます。
JSONスキーマを表示
[
{ "name": "person_id", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "group_id", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "time_index", "type": "INTEGER", "mode": "NULLABLE", "description": "" },
{ "name": "time_title", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "type", "type": "STRING", "mode": "NULLABLE", "description": "" }
]
カラム名 | データ型 | 必須/条件付き | 説明 |
---|---|---|---|
person_id | 文字列(STRING) | ✓ | 従業員ID |
group_id | 文字列(STRING) | * | グループID。出勤時は必須、休暇時は指定しない場合は全グループが対象 |
time_index | 整数(INTEGER) | ✓ | 時間インデックス(layer_3のtime_index値) |
time_title | 文字列(STRING) | 時間インデックスの説明(例:「2024-07-04-09:00 」) |
|
type | 文字列(STRING) | ✓ | 「assignable 」(出勤可能)または「unassignable 」(休暇)を指定 |
設定例:
- 出勤指定: 田中さんが7月4日9時に ICU で出勤可能
- 休暇指定: 佐藤さんが7月4日終日休暇(group_idは指定しない)
6. タイムボックス設定(Time Indices)
時間の階層構造(レイヤー)を定義するテーブルです。シフト最適化では、時間を複数の粒度で階層的に管理できます(例:月 → 週 → 日 → 時間)。
JSONスキーマを表示
[
{ "name": "layer_id", "type": "INTEGER", "mode": "NULLABLE", "description": "" },
{ "name": "layer_name", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "base_time_index", "type": "INTEGER", "mode": "NULLABLE", "description": "" },
{ "name": "time_index", "type": "INTEGER", "mode": "NULLABLE", "description": "" },
{ "name": "time_title", "type": "STRING", "mode": "NULLABLE", "description": "" }
]
カラム名 | データ型 | 必須/条件付き | 説明 |
---|---|---|---|
layer_id | 整数(INTEGER) | ✓ | レイヤーID(0, 1, 2, 3のいずれか。0と3は固定、1と2は任意設定) |
layer_name | 文字列(STRING) | レイヤーの名称(例:「日 」「時間 」) |
|
base_time_index | 整数(INTEGER) | ✓ | 最小粒度(layer_3)のtime_index値 |
time_index | 整数(INTEGER) | ✓ | 該当レイヤーでのtime_index値 |
time_title | 文字列(STRING) | 時間インデックスの説明 |
レイヤー概念:
- Layer 0: 固定レイヤー(time_indexは全て0)
- Layer 1, 2: カスタムレイヤー(例:週、日)
- Layer 3: 最小粒度レイヤー(例:時間、シーケンシャルな番号)
7. アサイン計画(Assigns)
各グループに対して、各時間帯で必要な人員数を定義するテーブルです。これが最適化の「目標」となります。
JSONスキーマを表示
[
{ "name": "group_id", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "time_index", "type": "INTEGER", "mode": "NULLABLE", "description": "" },
{ "name": "assignment", "type": "INTEGER", "mode": "NULLABLE", "description": "" }
]
カラム名 | データ型 | 必須/条件付き | 説明 |
---|---|---|---|
group_id | 文字列(STRING) | ✓ | グループID |
time_index | 整数(INTEGER) | ✓ | 時間インデックス |
assignment | 整数(INTEGER) | ✓ | そのグループ・時間帯で必要な人員数 |
例:ICUで7月4日9時〜10時に看護師2名が必要、という場合は assignment = 2
と設定します。
8. アサイン許容数設定(Assign Limitations)
従業員の勤務に関する制約条件を定義するテーブルです。勤務回数の上下限、連続の勤務制限、ポイント制約などを設定できます。
JSONスキーマを表示
[
{ "name": "person_id", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "scope_id", "type": "INTEGER", "mode": "NULLABLE", "description": "" },
{ "name": "layer_id", "type": "INTEGER", "mode": "NULLABLE", "description": "" },
{ "name": "time_index", "type": "INTEGER", "mode": "NULLABLE", "description": "" },
{ "name": "type", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "min", "type": "INTEGER", "mode": "NULLABLE", "description": "" },
{ "name": "max", "type": "INTEGER", "mode": "NULLABLE", "description": "" },
{ "name": "enable_zero", "type": "BOOLEAN", "mode": "NULLABLE", "description": "" },
{ "name": "specific", "type": "INTEGER", "mode": "NULLABLE", "description": "" },
{ "name": "limit", "type": "INTEGER", "mode": "NULLABLE", "description": "" },
{ "name": "target_point", "type": "INTEGER", "mode": "NULLABLE", "description": "" }
]
カラム名 | データ型 | 必須/条件付き | 説明 |
---|---|---|---|
person_id | 文字列(STRING) | ✓ | 従業員ID |
scope_id | 整数(INTEGER) | * | スコープID(1〜3)。連続の勤務制限では不要 |
layer_id | 整数(INTEGER) | ✓ | レイヤーID(制約種別により制限あり) |
time_index | 整数(INTEGER) | * | 時間インデックス。連続の勤務制限では不要 |
type | 文字列(STRING) | * | 「range 」(範囲指定)または「specific 」(固定値) |
min | 整数(INTEGER) | * | type=rangeの場合の最小値 |
max | 整数(INTEGER) | * | type=rangeの場合の最大値 |
enable_zero | 真偽値(BOOLEAN) | * | type=rangeの場合、ゼロを許可するか |
specific | 整数(INTEGER) | * | type=specificの場合の固定値 |
limit | 整数(INTEGER) | * | 連続の勤務制限の場合の上限日数 |
target_point | 整数(INTEGER) | * | ポイント制約の場合の目標ポイント数 |
制約タイプ例:
- 勤務の回数範囲: 週に2〜4回勤務(type=range, min=2, max=4)
- 勤務の回数固定: 月に必ず20回勤務(type=specific, specific=20)
- 連続の勤務制限: 5日連続勤務まで(limit=5)
9. 従業員コスト設定(Person Costs)
従業員ごとの勤務コストや従業員間の組み合わせコストを定義するテーブルです。
JSONスキーマを表示
[
{ "name": "person_id", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "layer_id", "type": "INTEGER", "mode": "NULLABLE", "description": "" },
{ "name": "time_index", "type": "INTEGER", "mode": "NULLABLE", "description": "" },
{ "name": "time_title", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "pair_person_id", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "cost", "type": "INTEGER", "mode": "NULLABLE", "description": "" }
]
カラム名 | データ型 | 必須/条件付き | 説明 |
---|---|---|---|
person_id | 文字列(STRING) | ✓ | 従業員ID |
layer_id | 整数(INTEGER) | * | レイヤーID(0〜2)。従業員間コストでは不要 |
time_index | 整数(INTEGER) | * | 時間インデックス。従業員間コストでは不要 |
time_title | 文字列(STRING) | 時間インデックスの説明 | |
pair_person_id | 文字列(STRING) | * | 従業員間コストの場合のペア相手のID |
cost | 整数(INTEGER) | ✓ | コスト値(大きいほど避けたい組み合わせ) |
10. グループコスト設定(Group Costs)
グループと従業員の組み合わせごとのコストを定義するテーブルです。
JSONスキーマを表示
[
{ "name": "group_id", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "person_id", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "layer_id", "type": "INTEGER", "mode": "NULLABLE", "description": "" },
{ "name": "time_index", "type": "INTEGER", "mode": "NULLABLE", "description": "" },
{ "name": "time_title", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "cost", "type": "INTEGER", "mode": "NULLABLE", "description": "" }
]
カラム名 | データ型 | 必須/条件付き | 説明 |
---|---|---|---|
group_id | 文字列(STRING) | ✓ | グループID |
person_id | 文字列(STRING) | ✓ | 従業員ID |
layer_id | 整数(INTEGER) | ✓ | レイヤーID(0〜2) |
time_index | 整数(INTEGER) | ✓ | 時間インデックス |
time_title | 文字列(STRING) | 時間インデックスの説明 | |
cost | 整数(INTEGER) | ✓ | コスト値 |
使用する場合は、所属関係テーブル(Belongs)で定義したすべての人員-グループ組み合わせのコストを設定してください。
11. グループ関連コスト設定(Group Relations)
連続して異なるグループに配置される場合のコストを定義するテーブルです。
JSONスキーマを表示
[
{ "name": "person_id", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "group_id", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "next_group_id", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "cost", "type": "INTEGER", "mode": "NULLABLE", "description": "" }
]
カラム名 | データ型 | 必須/条件付き | 説明 |
---|---|---|---|
person_id | 文字列(STRING) | ✓ | 従業員ID |
group_id | 文字列(STRING) | ✓ | 最初のグループID |
next_group_id | 文字列(STRING) | ✓ | 次に配置されるグループID |
cost | 整数(INTEGER) | ✓ | 連続配置のコスト |
例:ICUから救急への連続配置は負担が大きいため高コストを設定、といった用途で使用します。
12. パラメータ設定(Coefficients)
最適化計算の挙動を細かく制御するためのパラメータを設定するテーブルです。このテーブルに複数行がある場合、各行が独立したジョブとして実行されます。
JSONスキーマを表示(主要な項目抜粋)
[
{"name":"label","type":"STRING","mode":"NULLABLE"},
{"name":"assign_coeff","type":"FLOAT","mode":"NULLABLE"},
{"name":"not_assign_multi_set_per_time_coeff","type":"FLOAT","mode":"NULLABLE"},
{"name":"assignable","type":"RECORD","mode":"NULLABLE","fields":[
{"name":"coeff","type":"FLOAT","mode":"NULLABLE"},
{"name":"force","type":"BOOLEAN","mode":"NULLABLE"}
]},
{"name":"unassignable","type":"RECORD","mode":"NULLABLE","fields":[
{"name":"coeff","type":"FLOAT","mode":"NULLABLE"},
{"name":"force","type":"BOOLEAN","mode":"NULLABLE"}
]}
// その他多数のパラメータ...
]
カラム名 | データ型 | 必須/条件付き | 説明 |
---|---|---|---|
label | 文字列(STRING) | 複数の同時実行時のジョブラベル識別名 | |
assign_coeff | 数値(FLOAT) | ✓ | 基本アサイン係数(必須パラメータ) |
not_assign_multi_set_per_time_coeff | 数値(FLOAT) | ✓ | 同時間複数グループアサイン不可制約の係数 |
assignable | 複合型(RECORD) | * | 出勤制約のパラメータ(Work Typesでassignableを使用する場合は必須) |
assignable.coeff | 数値(FLOAT) | * | 出勤制約の重み係数 |
assignable.force | 真偽値(BOOLEAN) | * | 出勤を厳守するか(trueで厳守) |
unassignable | 複合型(RECORD) | * | 休暇制約のパラメータ(Work Typesでunassignableを使用する場合は必須) |
unassignable.coeff | 数値(FLOAT) | * | 休暇制約の重み係数 |
unassignable.force | 真偽値(BOOLEAN) | * | 休暇を厳守するか(trueで厳守) |
パラメータ設定のルール:
- 制約を使用しない: null(カラムを登録しない)
- 自動設定: 0(文字列の場合は"null")
- 値を指定: 0以外の値
注:Coefficientsテーブルには他にも多数のパラメータがあります。詳細はスキーマ仕様書を参照してください。
13. 実行結果(Results)
最適化計算の実行後に生成される結果が格納されるテーブルです。どの従業員がどのグループにどの時間帯で配置されたかが記録されます。
注:結果テーブルのスキーマは実行時に自動生成されるため、事前の作成は不要です。
カラム名 | データ型 | 出力有無 | 説明 |
---|---|---|---|
job_id | 文字列(STRING) | 必須 | 実行された最適化ジョブのID |
energy | 数値(FLOAT) | 必須 | 計算結果の評価値(エネルギー値)。値が小さいほど良い解 |
solution_index | 整数(INTEGER) | 必須 | 複数の解が得られた場合の解のインデックス番号 |
person_index | 整数(INTEGER) | 必須 | 従業員の内部インデックス |
person_id | 文字列(STRING) | 任意 | 配置された従業員のID |
person_name | 文字列(STRING) | 任意 | 従業員の名前 |
holiday | 整数(INTEGER) | 必須 | 休暇設定(1の場合は休暇) |
group_index | 整数(INTEGER) | 必須 | グループの内部インデックス |
group_id | 文字列(STRING) | 任意 | 配置先のグループID |
group_name | 文字列(STRING) | 任意 | グループの名前 |
time_index | 整数(INTEGER) | 必須 | 配置された時間インデックス (layer_3) |
time_title | 文字列(STRING) | 任意 | 時間インデックスに対応する付帯情報 |
assigned | 整数(INTEGER) | 必須 | グループへのアサイン結果(1の場合はアサイン) |
created_at | タイムスタンプ(TIMESTAMP) | 必須 | 実行ジョブの作成日時 |
このテーブルから、「田中さんが7月4日9時〜10時にICUで配置された」といった具体的なシフト計画を読み取ることができます。
14. 実行情報(Result Job)
最適化処理の実行に関するメタデータを保存するテーブルです。処理のパフォーマンスや解の品質に関する詳細情報を記録します。
注:実行情報テーブルのスキーマは実行時に自動生成されるため、事前の作成は不要です。
カラム名 | データ型 | 必須 | 説明 |
---|---|---|---|
job_id | 文字列(STRING) | ✓ | 実行された最適化ジョブのID |
optimization_type | 文字列(STRING) | ✓ | 実行された最適化のタイプ |
solutions | 複合型(RECORD, REPEATED) | 解の情報。解のインデックスとエネルギー値が含まれます。 | |
solutions.solution_index | 整数(INTEGER) | ✓ | 解のインデックス番号 |
solutions.energy | 数値(FLOAT) | ✓ | 解の評価値(エネルギー値)。小さいほど良い解です。 |
solver_type | 整数(INTEGER) | ✓ | 使用された計算エンジンの種類コード |
total_qubit_num | 整数(INTEGER) | 計算に使用された論理的な変数(qubit)の総数 | |
created_at | タイムスタンプ(TIMESTAMP) | ✓ | 処理が作成された日時 |
これらの情報により、複数のシナリオ実行結果の品質や計算効率を比較・分析できます。