最適化
割当て最適化(分量固定タイプ・複数実行)【ベータ版】
MAGELLAN BLOCKSのお問い合わせ機能からお願いします。
このブロックはベータ版です。機能改善や不具合などの情報提供は、概要
このブロックは、限られた資源(リソース)を最も効率的に配分するための計画を複数のシナリオで同時に作成します。これにより、様々な条件下でのコスト削減や生産性の向上を比較検討できます。例えば、生産ラインにおける原材料の配分、プロジェクトへの人員配置、配送車両への荷物の割り当てなど、様々なビジネスシーンで複数のパラメータ設定を一度に検証できます。
「分量固定タイプ・複数実行」では、あらかじめ設定したリソースの総量と各配分先で必要となる量に基づいて、複数の最適化パラメータを同時に実行し、それぞれの最適な配分パターンを自動的に計算します。これにより、パラメータの違いによる結果の比較が効率的に行えるため、最適な設定の選択が可能です。
内部では、状況に応じて最適な計算エンジン(専門的にはソルバーと呼ばれ、D-Wave、SQBM+、Amplify AEなどが該当)が自動的に選択されます。量子コンピューティング技術(量子アニーリングなど)をはじめとする先進技術を用いて高速に計算処理を行います。利用者は技術的な詳細を意識することなく、複数の最適な配分結果を一度に取得できます。
プロパティ
プロパティ名 | 説明 |
---|---|
ブロック名 |
フローの中で、このブロックを識別するための表示名を設定します。例えば、「 |
GCPサービスアカウント |
最適化処理を実行するために、Google Cloud Platform(GCP)のサービスアカウントを選択します。処理に必要な権限を持つアカウントを設定してください。 |
入力テーブル群を指定するデータセット |
BigQueryのデータセットを指定します。(必須) このデータセットには、最適化計算に使用する入力データテーブルと、計算結果を保存する出力データテーブルが含まれます。 具体的には、リソース情報や配分先の情報などが格納されたテーブルをこのデータセット内に準備します。 |
入力テーブル群を指定するテーブル |
複数の最適化実行の設定を定義したテーブル名を指定します。(必須) このテーブルには、実行する複数のシナリオごとに、使用する入力テーブル名と出力テーブル名を定義します。各行が1つの最適化実行を表し、それぞれ異なるパラメータや設定で同時に最適化が実行されます。 このテーブルには、主に以下のカラム(列)が必要です。
|
結果を格納する変数 |
複数の最適化処理を実行した際の全体的な実行状況を格納する変数名を指定します。(必須) この変数には、各実行ジョブの基本的な情報(ジョブIDと実行状態など)が格納され、後続の処理ブロックで参照できます。具体的には、以下のような構造のJSONオブジェクトが格納されます。
主なキーの説明は以下の通りです。
|
ブロックメモ |
このブロックに関するメモを自由に記述できます。 フローの管理やメンテナンス時の情報共有に役立ちます。このメモの内容は、ブロックの実行には影響しません。 |
テーブルスキーマ
このブロックでは、複数実行の設定テーブルと、各実行で使用される4つの入力情報(テーブル形式)を使用します。それぞれのテーブルがどのような構造を持ち、どのようなデータを含める必要があるかを理解しておくことが重要です。
注:「必須」列の「✓」マークは、その項目が必須であることを示します。「*」付きのものは条件付き必須を示します(詳細は各テーブルの説明を参照)。
1. 入力テーブル群を指定するテーブル
複数の最適化実行の設定を定義するテーブルです。各行が1つの最適化実行シナリオを表し、使用する入力テーブル名と出力テーブル名を指定します。
JSONスキーマを表示
[
{"name":"execution_label","type":"STRING","mode":"NULLABLE","description":"label for this parameter"},
{"name":"resources","type":"STRING","mode":"NULLABLE","description":"resources master table"},
{"name":"targets","type":"STRING","mode":"NULLABLE","description":"targets master table"},
{"name":"target_resources","type":"STRING","mode":"NULLABLE","description":"target resource table"},
{"name":"coefficients","type":"STRING","mode":"NULLABLE","description":"config table"},
{"name":"result","type":"STRING","mode":"NULLABLE","description":"result table"},
{"name":"result_job","type":"STRING","mode":"NULLABLE","description":"result job table"}
]
このテーブルの各行は、1つの独立した最適化実行を表します。例えば、異なるパラメータ設定や異なる入力データでの最適化結果を比較したい場合、それぞれに対応する行を定義します。実行時には、指定されたテーブル名から実際のデータが読み込まれ、各行の設定に基づいて並行して最適化が実行されます。
2. リソースが保存されているテーブル
利用可能なリソースの基本情報と総量を定義するテーブルです。例えば、人員、原材料、機械の稼働時間などをリソースとして登録します。
JSONスキーマを表示
[
{ "name": "resource_id", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "resource_name", "type": "STRING", "mode": "NULLABLE", "description": ""},
{ "name": "amount", "type": "INTEGER", "mode": "NULLABLE", "description": "" }
]
カラム名 | データ型 | 必須/条件付き | 説明 |
---|---|---|---|
resource_id | 文字列(STRING) | ✓ | リソースを一意に識別するためのID(例:material_X 、staff_A ) |
resource_name | 文字列(STRING) | リソースの表示名(例:「素材X 」、「スタッフA 」)。省略可能です。 |
|
amount | 整数(INTEGER) | ✓ | リソースの総量(例:在庫数、総労働時間など) |
各リソースには必ず総量(amount
)を指定します。この値が、配分可能なリソースの上限となります。例えば、作業者のシフトであれば総労働の可能時間、材料であれば在庫数などを設定します。
3. 割当て先が保存されているテーブル
リソースを配分する対象(例:製品、プロジェクト、タスクなど)を定義するテーブルです。各配分先には、任意で利益や優先度を示す値(profit
)を設定できます。
JSONスキーマを表示
[
{ "name": "target_id", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "target_name", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "profit", "type": "INTEGER", "mode": "NULLABLE", "description": "" }
]
カラム名 | データ型 | 必須/条件付き | 説明 |
---|---|---|---|
target_id | 文字列(STRING) | ✓ | 配分先を一意に識別するためのID(例:product_A , project_X ) |
target_name | 文字列(STRING) | 配分先の表示名(例:「製品A 」、「プロジェクトX 」)。省略可能です。 |
|
profit | 整数(INTEGER) | この配分先にリソースを配分した場合に得られる利益や価値の指標。省略可能です。 |
profit
は、その配分先の優先度や価値を表す数値です。値が大きいほど、最適化計算において優先的にリソースが配分される傾向にあります。例えば、製品ごとの利益率やプロジェクトの重要度などを数値化して設定します。
4. 割当て先へのリソースが保存されているテーブル
どの配分先が、どのリソースを、どれだけ必要とするか(消費するか)を定義する関連情報テーブルです。
JSONスキーマを表示
[
{ "name": "target_id", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "resource_id", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "consume_amount", "type": "INTEGER", "mode": "NULLABLE", "description": "" }
]
カラム名 | データ型 | 必須/条件付き | 説明 |
---|---|---|---|
target_id | 文字列(STRING) | ✓ | 配分先ID(上記「3. 割当て先が保存されているテーブル」の target_id と対応) |
resource_id | 文字列(STRING) | ✓ | リソースID(上記「2. リソースが保存されているテーブル」の resource_id と対応) |
consume_amount | 整数(INTEGER) | ✓ | その配分先で、指定したリソースを1単位生産(または実行)する際に必要となる量 |
このテーブルは、配分先とリソースの間の「多対多」の関係(1つの配分先が複数のリソースを必要とし、1つのリソースが複数の配分先で使用される関係)を表現します。consume_amount
は、その配分先に対してリソースを1単位配分したときに消費される量です。例えば、製品Aを1つ作るのに素材Xが2個、作業時間Bが0.5時間必要、といった情報を定義します。
5. パラメータが保存されているテーブル
最適化計算の挙動をより細かく制御するためのパラメータを設定するテーブルです。
JSONスキーマを表示
[
{"name":"label","type":"STRING","mode":"NULLABLE"},
{ "name": "assign_all_resource", "type": "RECORD", "mode": "NULLABLE", "description": "", "fields": [
{ "name": "type", "type": "STRING", "mode": "NULLABLE" },
{ "name": "coeff", "type": "FLOAT", "mode": "NULLABLE" }
]
},
{ "name": "target_profit_coeff", "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": "params_type", "type": "STRING", "mode": "NULLABLE" },
{ "name": "params_version", "type": "STRING", "mode": "NULLABLE" },
{ "name": "params_time_limit", "type": "INTEGER", "mode": "NULLABLE" },
{ "name": "info_qubit_info", "type": "STRING", "mode": "NULLABLE" },
{ "name": "info_timing", "type": "STRING", "mode": "NULLABLE" },
{ "name": "info_debug_level", "type": "INTEGER", "mode": "NULLABLE" },
{ "name": "info_response", "type": "STRING", "mode": "NULLABLE" }
]},
{ "name": "sbm", "type": "RECORD", "mode": "NULLABLE", "fields": [
{ "name": "params_type", "type": "STRING", "mode": "NULLABLE" },
{ "name": "params_version", "type": "STRING", "mode": "NULLABLE" },
{ "name": "params_steps", "type": "INTEGER", "mode": "NULLABLE" },
{ "name": "params_loops", "type": "INTEGER", "mode": "NULLABLE" },
{ "name": "params_timeout", "type": "INTEGER", "mode": "NULLABLE" },
{ "name": "params_maxwait", "type": "INTEGER", "mode": "NULLABLE" },
{ "name": "params_target", "type": "FLOAT", "mode": "NULLABLE" },
{ "name": "params_maxout", "type": "INTEGER", "mode": "NULLABLE" },
{ "name": "params_dt", "type": "INTEGER", "mode": "NULLABLE" },
{ "name": "params_C", "type": "INTEGER", "mode": "NULLABLE" },
{ "name": "info_qubit_info", "type": "STRING", "mode": "NULLABLE" },
{ "name": "info_timing", "type": "STRING", "mode": "NULLABLE" },
{ "name": "info_response", "type": "STRING", "mode": "NULLABLE" },
{ "name": "info_exec", "type": "STRING", "mode": "NULLABLE" }
]}
]
}
]
カラム名 | データ型 | 必須/条件付き | 説明 |
---|---|---|---|
label | 文字列(STRING) | 複数の最適化処理を実行する際のジョブラベル(識別名)。省略可能です。 | |
assign_all_resource | 複合型(RECORD) | 「すべてのリソースを可能な限り使い切る」という制約に関する設定。省略可能です。 | |
assign_all_resource.type | 文字列(STRING) | ✓* | 制約のタイプ。現状は「strict (厳密)」のみ指定可能です。 |
assign_all_resource.coeff | 数値(FLOAT) | ✓* | 上記制約の強さ(重み係数)。値が大きいほど、リソースを使い切ろうとする傾向が強まります。 |
target_profit_coeff | 数値(FLOAT) | 利益(profit )を最大化しようとする度合い(重み係数)。値が大きいほど、利益の高い配分先を優先する傾向が強まります。省略可能です。 |
|
solver_options | 複合型(RECORD) |
使用する計算エンジン(ソルバー)固有の詳細な設定。通常は設定不要です。省略可能です。
|
* assign_all_resource
の設定項目(type, coeff)は、assign_all_resource
自体を定義する場合に必須となります。
各パラメータの値は、一般的に以下のように設定します。
- 制約を使用しない場合: そのカラム自体をテーブルに含めない(
null
扱い)。 - 自動パラメータ設定を利用する場合:
0
を設定(一部パラメータ)。 - 特定の値を指定する場合:
0
以外の数値を設定。
例えば、初めて利用する場合は以下の設定から試すことを推奨します。
assign_all_resource.type = "strict"
、assign_all_resource.coeff = 100
(リソースをしっかり使う)、target_profit_coeff = 1.0
(利益も考慮する)。
6. 実行結果を格納するテーブル
最適化計算の実行後に生成される結果が格納されるテーブルです。具体的に、どのリソースがどの配分先にどれだけ配分されたかが記録されます。
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": "resources", "type": "RECORD", "mode": "REPEATED", "fields": [
{ "name": "resource_id", "type": "STRING", "mode": "NULLABLE" },
{ "name": "resource_name", "type": "STRING", "mode": "NULLABLE" },
{ "name": "resource_index", "type": "INTEGER", "mode": "NULLABLE" },
{ "name": "amount", "type": "INTEGER", "mode": "NULLABLE", "description": "" }
], "description": "" },
{ "name": "target_id", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "target_name", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "target_index", "type": "INTEGER", "mode": "NULLABLE", "description": "" }
]
カラム名 | データ型 | 出力有無 | 説明 |
---|---|---|---|
job_id | 文字列(STRING) | 必須 | 実行された最適化ジョブのID |
energy | 数値(FLOAT) | 必須 | 計算結果の評価値(エネルギー値)。値が小さいほど、制約条件をよく満たした良い解であることを示します。 |
solution_index | 整数(INTEGER) | 必須 | 複数の解が得られた場合の、解のインデックス番号 |
resources | 複合型(RECORD)、 繰り返し(REPEATED) |
配分されたリソースに関する情報(複数のリソース情報が含まれる場合があります) | |
resources.resource_id | 文字列(STRING) | 条件付き | 配分されたリソースのID |
resources.resource_name | 文字列(STRING) | 条件付き | 配分されたリソースの名称。仕様により、このフィールドには常にNULL が出力されます。 |
resources.resource_index | 整数(INTEGER) | 必須 | システム内部で使用されるリソースのインデックス番号 |
resources.amount | 整数(INTEGER) | 必須 | その配分先に配分されたリソースの量 |
target_id | 文字列(STRING) | 条件付き | リソースが配分された先のID |
target_name | 文字列(STRING) | 条件付き | リソースが配分された先の名称。仕様により、このフィールドには常にNULL が出力されます。 |
target_index | 整数(INTEGER) | 必須 | システム内部で使用される配分先のインデックス番号 |
「エネルギー値(energy
)」は、最適化計算の「良さ」を示す数値です。この値が小さいほど、設定した制約条件(例:リソースの上限を超えない、利益を最大化する等)をより良く満たしている「良い解」であると解釈できます。複数実行の場合、各実行シナリオで得られたエネルギー値を比較することで、どの設定が最も良い結果をもたらすかを判断できます。
7. 実行に関する情報を格納するテーブル
最適化処理の実行結果に関するメタデータを保存するテーブルです。処理のパフォーマンスや解の品質に関する詳細情報を記録します。
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": "" }
], "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": "" }
], "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" }
], "description": "" },
{ "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" }
], "description": "" },
{ "name": "created_at", "type": "TIMESTAMP", "mode": "NULLABLE", "description": "" }
]
カラム名 | データ型 | 説明 |
---|---|---|
job_id | 文字列(STRING) | 最適化実行時のJob ID |
optimization_type | 文字列(STRING) | 最適化のタイプ(例:strict_allocation ) |
solver_type | 整数(INTEGER) | 実行されたソルバーの種別(例: 1: dwave, 2: SQBM+, 7: amplify) |
solutions | 複合型(RECORD)、 繰り返し(REPEATED) |
解に関する情報 |
solutions.solution_index | 整数(INTEGER) | 解のインデックス番号 |
solutions.energy | 数値(FLOAT) | 解に対応するエネルギー値 |
total_qubit_num | 整数(INTEGER) | QUBOの総変数(Qubit)数 |
qubo | 複合型(RECORD) | QUBOに関する情報 |
qubo.maximum_coeff_ratio | 数値(FLOAT) | QUBO係数の最大比率(max / min)。値が小さいほど精度が安定します。 |
qubo.max | 数値(FLOAT) | QUBO係数の最大値 |
qubo.min | 数値(FLOAT) | QUBO係数の最小値 |
qubo.max_positive | 数値(FLOAT) | QUBO係数の正の最大値 |
qubo.min_positive | 数値(FLOAT) | QUBO係数の正の最小値 |
qubo.max_negative | 数値(FLOAT) | QUBO係数の負の最大値 |
qubo.min_negative | 数値(FLOAT) | QUBO係数の負の最小値 |
qubo.nonzero_num | 整数(INTEGER) | QUBOの非ゼロ要素の数 |
qubo.density | 数値(FLOAT) | QUBOの密度(非ゼロ要素数 / 総変数数) |
solver_response | 複合型(RECORD)、 繰り返し(REPEATED) |
ソルバーからの応答情報。ソルバー毎に内容が異なります。 |
constraints | 複合型(RECORD)、 繰り返し(REPEATED) |
制約に関する情報 |
constraints.solution_index | 整数(INTEGER) | 対応する解のインデックス番号 |
constraints.name | 文字列(STRING) | 制約の名前 |
constraints.energy | 数値(FLOAT) | 制約ごとのエネルギー値 |
constraints.coeff | 文字列(STRING) | 最終的に実行された係数の値(JSON形式) |
created_at | タイムスタンプ(TIMESTAMP) | レコードが作成された日時 |
これらのメタデータを分析することで、最適化計算のパフォーマンスや結果の品質を客観的に評価できます。また、問題の定式化(リソースや制約の与え方)が適切であったかどうかの判断材料にもなり、設定の調整や改善する際に役立ちます。