最適化
工程最適化
概要
このブロックは、製造業や物流業などにおける工程の実行順序と、各工程に割り当てるリソース(機械、作業者など)を最適化します。これにより、全体の作業時間を最小化し、納期遅延リスクを低減できます。例えば、複数の製品を複数の機械で加工する際の工程順序、作業者のタスク割り当て、配送ルートの時間調整など、様々な場面で活用できます。
「工程最適化」では、ジョブ(作業の単位)、オペレーション(各ジョブに含まれる個別の工程)、リソース(機械や作業者)の関係を定義します。これらの制約条件(作業順序、リソースの利用可能な時間など)を考慮しながら、処理時間を短縮したスケジュールを自動計算します。これにより、人手では対応が困難な複雑な工程計画でも、最適なスケジューリングが可能になります。
内部では、状況に応じて最適な計算エンジン(専門的にはソルバーと呼ばれ、D-Wave、SQBM+、Amplify AEなどが該当)が自動選択されます。量子コンピューティング技術(量子アニーリングなど)をはじめとする先進技術を用いて高速に計算処理を行います。利用者は技術的な詳細を意識することなく、最適なスケジュール結果のみが簡単に得られます。
プロパティ
プロパティ名 | 説明 |
---|---|
ブロック名 |
フローの中で、このブロックを識別するための表示名を設定します。例えば、「 |
GCPサービスアカウント |
最適化処理を実行するために、Google Cloud Platform(GCP)のサービスアカウントを選択します。処理に必要な権限を持つアカウントを設定してください。 |
データセット |
BigQueryのデータセットを指定します。(必須) このデータセットには、最適化計算に使用する入力データテーブルと、計算結果を保存する出力データテーブルが含まれます。 具体的には、ジョブ、オペレーション、リソースなどの情報が格納されたテーブルをこのデータセット内に準備してください。 |
作業のテーブルが保存されているテーブル |
作業(ジョブ)の基本情報が格納されたテーブル名を指定します。(必須) このテーブルには、「 |
オペレーションが保存されているテーブル |
オペレーション(個別の工程)の情報が格納されたテーブル名を指定します。(必須) このテーブルには、「 |
リソースが保存されているテーブル |
リソース(機械、作業者など)の情報が格納されたテーブル名を指定します。(必須) このテーブルには、「 |
オペレーションの順序関係が保存されているテーブル |
オペレーション間の実行順序(依存関係)を定義したテーブル名を指定します。(必須) このテーブルには、「 |
オペレーションとリソースと時間が保存されているテーブル |
各オペレーションをどのリソースで実行し、どれだけの時間がかかるかを定義したテーブル名を指定します。(必須) このテーブルには、「 |
オペレーションのリソースの前提を定義するテーブル |
リソースの使用可能な時間帯や制限事項を定義したテーブル名を指定します。 このテーブルには、「 |
パラメータが保存されているテーブル |
最適化計算の挙動や制約の重要度を調整するためのパラメータが格納されたテーブル名を指定します。(必須) このテーブルには、時間設定、各種制約の係数、ソルバーオプションなどが含まれます。これらの設定により、最適化の計算方法や結果の品質を調整できます。 |
最適化実行に関する情報を格納する変数 |
最適化処理を実行した際のジョブID(処理識別子)などを格納する変数名を指定します。(必須) この変数には、実行結果に関する基本的な情報(ジョブIDなど)が格納され、後続の処理ブロックで参照できます。具体的には、以下のような構造のJSONオブジェクトが格納されます。
主なキーの説明は以下の通りです。
|
実行に関する情報を格納するテーブル |
最適化計算の実行に関する詳細な情報(メタデータ)を格納するテーブル名を指定します。 指定しない場合、これらのメタデータは保存されません。実行にかかった時間や計算の評価値(エネルギー値)など、処理の詳細情報を記録・分析したい場合に設定します。事前に作成する必要はなく、指定したテーブルがなければ、自動作成されます。既に存在する場合は、追加されます。 |
実行結果を格納するテーブル |
最適化計算の結果(具体的なスケジュール)を格納するテーブル名を指定します。 指定しない場合、計算結果は保存されません。最適化結果を保存し、他の処理ブロックから参照したり、後で分析したりする場合は必ず設定してください。事前に作成する必要はなく、指定したテーブルがなければ、自動作成されます。既に存在する場合は、追加されます。 |
ジョブのラベル名 |
実行する最適化ジョブに付与するラベル名(識別名)を指定します。 複数の最適化処理を区別するために使用します。特に、複数のジョブを同時に実行する場合や、後で特定のジョブの結果を確認する際に役立ちます。 |
ブロックメモ |
このブロックに関するメモを自由に記述できます。 フローの管理やメンテナンス時の情報共有に役立ちます。このメモの内容は、ブロックの実行には影響しません。 |
テーブルスキーマ
このブロックでは、7つの入力情報(テーブル形式)と、結果を格納する出力情報(テーブル形式)を使用します。それぞれのテーブルがどのような構造を持ち、どのようなデータを含める必要があるかを理解しておくことが重要です。
注:「必須」列の「✓」マークは、その項目が必須であることを示します。「*」付きのものは条件付き必須を示します(詳細は各テーブルの説明を参照)。
1. 作業のテーブルが保存されているテーブル
作業(ジョブ)の基本情報を定義するテーブルです。ジョブとは、複数のオペレーション(工程)をまとめた作業の単位を指します。
JSONスキーマを表示
[
{ "name": "job_id", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "job_name", "type": "STRING", "mode": "NULLABLE", "description": "" }
]
カラム名 | データ型 | 必須/条件付き | 説明 |
---|---|---|---|
job_id | 文字列(STRING) | ✓ | ジョブを一意に識別するためのID(例:job_A 、order_001 ) |
job_name | 文字列(STRING) | ジョブの表示名(例:「製品Aの製造 」、「注文001の処理 」)。省略可能です。 |
各ジョブは、後述するオペレーションの集合として定義されます。例えば、「製品Aの製造」というジョブには、「切削」「研磨」「塗装」といった複数のオペレーションが含まれます。
2. オペレーションが保存されているテーブル
オペレーション(個別の工程)を定義するテーブルです。各オペレーションは、ジョブを構成する最小単位の作業を表します。
JSONスキーマを表示
[
{ "name": "operation_id", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "operation_name", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "job_id", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "delivery_time", "type": "INTEGER", "mode": "NULLABLE", "description": "" }
]
カラム名 | データ型 | 必須/条件付き | 説明 |
---|---|---|---|
operation_id | 文字列(STRING) | ✓ | オペレーションを一意に識別するためのID(例:cutting_01 、assembly_A ) |
operation_name | 文字列(STRING) | オペレーションの表示名(例:「切削工程 」、「組立工程A 」)。省略可能です。 |
|
job_id | 文字列(STRING) | ✓ | このオペレーションが属するジョブのID(上記「1. 作業のテーブルが保存されているテーブル」の job_id と対応) |
delivery_time | 整数(INTEGER) | オペレーションを完了すべき時刻。スケジューリング全体の開始時刻を基準とした相対時間(分単位など)で設定します。例:開始時刻が12:00で、このオペレーションの納期が14:00の場合、120 (分)を設定。省略可能です。 |
delivery_time
を設定することで、特定のオペレーションに対して納期制約を課すことができます。設定しない場合は、納期制約なしとして扱われます。
3. リソースが保存されているテーブル
リソース(機械、作業者、設備など)を定義するテーブルです。オペレーション処理に必要な資源を表します。
JSONスキーマを表示
[
{ "name": "resource_id", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "resource_name", "type": "STRING", "mode": "NULLABLE", "description": "" }
]
カラム名 | データ型 | 必須/条件付き | 説明 |
---|---|---|---|
resource_id | 文字列(STRING) | ✓ | リソースを一意に識別するためのID(例:machine_01 、worker_A ) |
resource_name | 文字列(STRING) | リソースの表示名(例:「CNC旋盤1号機 」、「作業者A 」)。省略可能です。 |
リソースは、同時に複数のオペレーション処理ができません。最適化エンジンでは、この制約を考慮してスケジュールを作成します。
4. オペレーションの順序関係が保存されているテーブル
オペレーション間の実行順序(先行/後続の関係)を定義するテーブルです。これにより、あるオペレーションが別のオペレーションの完了を待ってから開始される、という依存関係を指定します。
JSONスキーマを表示
[
{ "name": "operation_id", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "before_operation_id", "type": "STRING", "mode": "NULLABLE", "description": "" }
]
カラム名 | データ型 | 必須/条件付き | 説明 |
---|---|---|---|
operation_id | 文字列(STRING) | ✓ | 後続オペレーションのID(このオペレーションが開始される前に、先行オペレーションが完了している必要がある) |
before_operation_id | 文字列(STRING) | ✓ | 先行オペレーションのID(このオペレーションが完了しないと、後続オペレーションは開始できない) |
例えば、「研磨」オペレーション(operation_id
)の前に「切削」オペレーション(before_operation_id
)を完了させる必要がある場合、その関係を1つのレコードとして定義します。これにより、単純な直線的な順序だけでなく、複数の工程が合流・分岐するような複雑な依存関係も表現できます。
5. オペレーションとリソースと時間が保存されているテーブル
各オペレーションをどのリソースで実行し、どれだけの時間がかかるかを定義するテーブルです。
JSONスキーマを表示
[
{ "name": "operation_id", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "resource_id", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "cost_time", "type": "FLOAT", "mode": "NULLABLE", "description": "" }
]
カラム名 | データ型 | 必須/条件付き | 説明 |
---|---|---|---|
operation_id | 文字列(STRING) | ✓ | オペレーションID(上記「2. オペレーションが保存されているテーブル」の operation_id と対応) |
resource_id | 文字列(STRING) | ✓ | リソースID(上記「3. リソースが保存されているテーブル」の resource_id と対応) |
cost_time | 数値(FLOAT) | ✓ | オペレーションの処理時間を示す数値(0以上)。時間の単位は、パラメータテーブルで設定する時間単位と一致させます。 |
このテーブルにより、同じオペレーションでも使用するリソースによって処理時間が異なる場合を表現できます。例えば、「切削」オペレーションが「新型機械」では30分、「旧型機械」では45分かかるといった設定が可能です。
6. オペレーションのリソースの前提を定義するテーブル
リソースの使用可能な時間帯や制限事項を定義するテーブルです。メンテナンス時間や作業者の休憩時間など、リソースが使用できない期間を設定します。
JSONスキーマを表示
[
{"name":"resource_id","type":"STRING","mode":"NULLABLE","description":""},
{"name":"start_time","type":"INTEGER","mode":"NULLABLE","description":""},
{"name":"end_time","type":"INTEGER","mode":"NULLABLE","description":""},
{"name":"assign_type","type":"STRING","mode":"NULLABLE","description":""}
]
カラム名 | データ型 | 必須/条件付き | 説明 |
---|---|---|---|
resource_id | 文字列(STRING) | ✓ | リソースID(上記「3. リソースが保存されているテーブル」の resource_id と対応) |
start_time | 整数(INTEGER) | ✓ | 使用不可な期間の開始時刻 |
end_time | 整数(INTEGER) | ✓ | 使用不可な期間の終了時刻。例:start_time=2 , end_time=5 の場合、時刻2,3,4,5が使用不可となります。 |
assign_type | 文字列(STRING) | 割当タイプ。現在は「unavailable (使用不可)」のみサポート。省略可能です。 |
複数の使用不可な期間を定義したい場合は、同じリソースに対して複数のレコードを作成します。例えば、機械のメンテナンス時間(10-11時)と清掃時間(15-16時)を別々のレコードとして登録します。
7. パラメータが保存されているテーブル
最適化計算の挙動を細かく制御するためのパラメータを設定するテーブルです。
JSONスキーマを表示
[
{"name":"label","type":"STRING","mode":"NULLABLE"},
{"name":"time","type":"RECORD","mode":"NULLABLE",
"fields":[
{ "name": "limit", "type": "INTEGER", "mode": "NULLABLE", "description": "" },
{ "name": "step", "type": "INTEGER", "mode": "NULLABLE", "description": "" }
], "description": "" },
{ "name": "operation_order", "type": "FLOAT", "mode": "NULLABLE", "description": "" },
{ "name": "operation_consistency", "type": "FLOAT", "mode": "NULLABLE", "description": "" },
{ "name": "resource_single_operation", "type": "FLOAT", "mode": "NULLABLE", "description": "" },
{"name":"resource_unavailable","type":"RECORD","mode":"NULLABLE",
"fields":[
{ "name": "coeff", "type": "FLOAT", "mode": "NULLABLE", "description": "" },
{ "name": "force", "type": "BOOLEAN", "mode": "NULLABLE", "description": "" }
], "description": "" },
{ "name": "cost_time", "type": "FLOAT", "mode": "NULLABLE", "description": "" },
{ "name": "delivery_time", "type": "FLOAT", "mode": "NULLABLE", "description": "" },
{ "name": "resource_job_count", "type": "FLOAT", "mode": "NULLABLE", "description": "" },
{ "name": "table_integrity", "type": "FLOAT", "mode": "NULLABLE", "description": "" },
{"name":"solver_options","type":"RECORD","mode":"NULLABLE",
"fields":[
{ "name": "normalize", "type": "BOOLEAN", "mode": "NULLABLE" },
{ "name": "backend", "type": "STRING", "mode": "NULLABLE" },
{"name": "dwave", "type": "RECORD", "mode": "NULLABLE", "fields": []},
{ "name": "sbm", "type": "RECORD", "mode": "NULLABLE", "fields": []}
]
}
]
カラム名 | データ型 | 必須/条件付き | 説明 |
---|---|---|---|
label | 文字列(STRING) | 複数の最適化処理を実行する際のジョブラベル(識別名)。省略可能です。 | |
time | 複合型(RECORD) | ✓ | 時間に関する設定 |
time.limit | 整数(INTEGER) | ✓* | スケジュール全体の時間枠の上限 |
time.step | 整数(INTEGER) | ✓* | 時間の最小単位(例:1分、5分、1時間など) |
operation_order | 数値(FLOAT) | 作業順序に関する制約の重み係数。値が大きいほど、オペレーションの順序を厳密に守ろうとします。省略可能です。 | |
operation_consistency | 数値(FLOAT) | 作業の一貫性に関する制約の重み係数。値が大きいほど、同一ジョブのオペレーションを連続して実行しようとします。省略可能です。 | |
resource_single_operation | 数値(FLOAT) | リソースの非並列制約の重み係数。値が大きいほど、1つのリソースで同時に複数のオペレーションを実行しないようにします。省略可能です。 | |
resource_unavailable | 複合型(RECORD) | リソースの使用不可に関する制約の設定。省略可能です。 | |
resource_unavailable.coeff | 数値(FLOAT) | ✓* | 使用不可に関する制約の重み係数 |
resource_unavailable.force | 真偽値(BOOLEAN) | ✓* | true :使用不可な期間を強制的に守る、false :ベストエフォート |
cost_time | 数値(FLOAT) | 処理時間の最小化制約の重み係数。値が大きいほど、全体の処理時間を短くしようとします。省略可能です。 | |
delivery_time | 数値(FLOAT) | 納期誤差の最小化制約の重み係数。値が大きいほど、納期を守ろうとします。省略可能です。 | |
resource_job_count | 数値(FLOAT) | リソースごとの使用先ジョブ数の最小化制約の重み係数。値が大きいほど、各リソースが扱うジョブ数を減らそうとします。省略可能です。 | |
table_integrity | 数値(FLOAT) | テーブルの整合性制約の重み係数。データの整合性を保つための内部的な制約です。省略可能です。 | |
solver_options | 複合型(RECORD) |
使用する計算エンジン(ソルバー)固有の詳細な設定。通常は設定不要です。省略可能です。
|
* time
の設定項目(limit, step)は、time
自体を定義する場合に必須となります。resource_unavailable
の設定項目も同様です。
各制約の重み係数は、問題の特性や要求に応じて調整します。例えば、納期厳守が最重要の場合は delivery_time
の値を大きく、処理時間の短縮が重要な場合は cost_time
の値を大きく設定します。
8. 実行に関する情報を格納するテーブル
最適化処理の実行結果に関するメタデータを保存するテーブルです。処理のパフォーマンスや解の品質に関する詳細情報を記録します。
JSONスキーマを表示
[
{ "name": "job_id", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "optimization_type", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "solver_type", "type": "INTEGER", "mode": "NULLABLE", "description": "" },
{ "name": "solutions", "type": "RECORD", "mode": "REPEATED", "fields": [
{ "name": "solution_index", "type": "INTEGER", "mode": "NULLABLE", "description": "" },
{ "name": "energy", "type": "FLOAT", "mode": "NULLABLE", "description": "" }
] },
{ "name": "total_qubit_num", "type": "INTEGER", "mode": "NULLABLE", "description": "" },
{ "name": "qubo", "type": "RECORD", "mode": "NULLABLE", "fields": [
{ "name": "maximum_coeff_ratio", "type": "FLOAT", "mode": "NULLABLE", "description": "" },
{ "name": "max", "type": "FLOAT", "mode": "NULLABLE", "description": "" },
{ "name": "min", "type": "FLOAT", "mode": "NULLABLE", "description": "" },
{ "name": "max_positive", "type": "FLOAT", "mode": "NULLABLE", "description": "" },
{ "name": "min_positive", "type": "FLOAT", "mode": "NULLABLE", "description": "" },
{ "name": "max_negative", "type": "FLOAT", "mode": "NULLABLE", "description": "" },
{ "name": "min_negative", "type": "FLOAT", "mode": "NULLABLE", "description": "" },
{ "name": "nonzero_num", "type": "INTEGER", "mode": "NULLABLE", "description": "" },
{ "name": "density", "type": "FLOAT", "mode": "NULLABLE", "description": "" }
] },
{ "name": "solver_response", "type": "RECORD", "mode": "REPEATED", "fields":[
{ "name": "id", "type": "STRING", "mode": "NULLABLE" },
{ "name": "qpu_sampling_time", "type": "INTEGER", "mode": "NULLABLE" },
{ "name": "qpu_anneal_time_per_sample", "type": "INTEGER", "mode": "NULLABLE" },
{ "name": "qpu_readout_time_per_sample", "type": "INTEGER", "mode": "NULLABLE" },
{ "name": "qpu_access_time", "type": "INTEGER", "mode": "NULLABLE" },
{ "name": "qpu_access_overhead_time", "type": "INTEGER", "mode": "NULLABLE" },
{ "name": "qpu_programming_time", "type": "INTEGER", "mode": "NULLABLE" },
{ "name": "qpu_delay_time_per_sample", "type": "INTEGER", "mode": "NULLABLE" },
{ "name": "total_post_processing_time", "type": "INTEGER", "mode": "NULLABLE" },
{ "name": "post_processing_overhead_time", "type": "INTEGER", "mode": "NULLABLE" },
{ "name": "charge_time", "type": "INTEGER", "mode": "NULLABLE" },
{ "name": "run_time", "type": "INTEGER", "mode": "NULLABLE" },
{ "name": "calculation_time", "type": "FLOAT", "mode": "NULLABLE" },
{ "name": "wait_time", "type": "FLOAT", "mode": "NULLABLE" },
{ "name": "num_runs", "type": "INTEGER", "mode": "NULLABLE" },
{ "name": "message", "type": "STRING", "mode": "NULLABLE" }
] },
{ "name": "constraints", "type": "RECORD", "mode": "REPEATED", "fields":[
{ "name": "solution_index", "type": "INTEGER", "mode": "NULLABLE" },
{ "name": "name", "type": "STRING", "mode": "NULLABLE" },
{ "name": "energy", "type": "FLOAT", "mode": "NULLABLE" },
{ "name": "coeff", "type": "STRING", "mode": "NULLABLE" }
] },
{ "name": "created_at", "type": "TIMESTAMP", "mode": "NULLABLE", "description": "" }
]
カラム名 | データ型 | 必須/条件付き | 説明 |
---|---|---|---|
job_id | 文字列(STRING) | ✓ | 最適化実行時のJob ID |
optimization_type | 文字列(STRING) | ✓ | 最適化のタイプ(例:jobshop ) |
solver_type | 整数(INTEGER) | ✓ | 実行されたソルバーの種別(1: dwave, 2: SQBM+, ...) |
solutions | 複合型(RECORD, REPEATED) | 得られた解のリスト | |
solutions.solution_index | 整数(INTEGER) | ✓* | 解のインデックス |
solutions.energy | 数値(FLOAT) | ✓* | 解に対応する評価値(エネルギー値) |
total_qubit_num | 整数(INTEGER) | 計算に使用された論理的な変数(qubit)の総数 | |
qubo | 複合型(RECORD) | QUBOモデルに関する詳細情報 | |
qubo.maximum_coeff_ratio | 数値(FLOAT) | QUBOの最大係数比 | |
qubo.density | 数値(FLOAT) | QUBOの密度(非ゼロ要素の割合) | |
solver_response | 複合型(RECORD, REPEATED) | ソルバーからの応答データ(ソルバー毎に内容が異なります) | |
constraints | 複合型(RECORD, REPEATED) | 各制約の満足度に関する情報 | |
created_at | タイムスタンプ(TIMESTAMP) | ✓ | 処理の実行時刻 |
これらのメタデータを分析することで、最適化計算のパフォーマンスや結果の品質を客観的に評価でき、パラメータ調整の参考になります。
9. 実行結果を格納するテーブル
最適化計算の実行後に生成される結果が格納されるテーブルです。具体的に、どのジョブのどのオペレーションが、どのリソースで、いつ実行されるかが記録されます。
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": "jobshop_job_id", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "operation_id", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "resource_id", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "start_time", "type": "INTEGER", "mode": "NULLABLE", "description": "" },
{ "name": "end_time", "type": "INTEGER", "mode": "NULLABLE", "description": "" },
{ "name": "cost_time", "type": "FLOAT", "mode": "NULLABLE", "description": "" },
{ "name": "delivery_time", "type": "INTEGER", "mode": "NULLABLE", "description": "" },
{ "name": "created_at", "type": "TIMESTAMP", "mode": "NULLABLE", "description": "" }
]
カラム名 | データ型 | 出力有無 | 説明 |
---|---|---|---|
job_id | 文字列(STRING) | 必須 | 実行された最適化ジョブのID |
energy | 数値(FLOAT) | 必須 | 計算結果の評価値(エネルギー値)。値が小さいほど、制約条件をよく満たした良い解であることを示します。 |
solution_index | 整数(INTEGER) | 必須 | 複数の解が得られた場合の、解のインデックス番号 |
jobshop_job_id | 文字列(STRING) | 必須 | スケジューリング対象のジョブID |
operation_id | 文字列(STRING) | 必須 | スケジューリングされたオペレーションID |
resource_id | 文字列(STRING) | 必須 | オペレーションが割り当てられたリソースID |
start_time | 整数(INTEGER) | 必須 | オペレーションの開始時刻 |
end_time | 整数(INTEGER) | 必須 | オペレーションの終了時刻 |
cost_time | 数値(FLOAT) | 必須 | オペレーションの処理時間 |
delivery_time | 整数(INTEGER) | 必須 | オペレーションの納期(完了時刻) |
created_at | タイムスタンプ(TIMESTAMP) | 必須 | 実行ジョブの作成時間 |
このテーブルの各レコードは、1つのオペレーションのスケジュール結果を表します。全体のスケジュールは、このテーブルの全レコードを時系列に並べることで確認できます。