最適化
総移動コスト最適化
概要
このブロックは、複数の地点を巡回する際の移動コストを最小化する最適なルートを自動で計算します。これにより、配送効率の向上やコスト削減が期待できます。例えば、宅配業者の配送ルート、営業担当者の訪問順序、保守点検の巡回順序など、様々なビジネスシーンで活用できます。
「総移動コスト最適化」では、訪問すべき地点とそれらの間の移動コスト(距離、時間、費用など)を定義し、全ての地点を一度ずつ訪問して元の地点に戻る際の総移動コストが最小となるルートを自動的に計算します。これは巡回セールスマン問題(TSP:Traveling Salesman Problem)として知られる最適化問題であり、人手では対応が困難な複雑な組み合わせでも、最適なルートが効率的に見つけられます。
内部では、状況に応じて最適な計算エンジン(専門的にはソルバーと呼ばれ、SQBM+のTSPソルバーなどが該当)が自動的に選択され、ATSP(非対称巡回セールスマン問題)形式を用いて高速に計算処理を行います。利用者は技術的な詳細を意識することなく、最適な巡回ルートのみが簡単に得られます。
プロパティ
プロパティ名 | 説明 |
---|---|
ブロック名 |
フローの中で、このブロックを識別するための表示名を設定します。例えば、「 |
GCPサービスアカウント |
最適化処理を実行するために、Google Cloud Platform(GCP)のサービスアカウントを選択します。処理に必要な権限を持つアカウントを設定してください。 |
データセット |
BigQueryのデータセットを指定します。(必須) このデータセットには、最適化計算に使用する入力データテーブルと、計算結果を保存する出力データテーブルが含まれます。 具体的には、地点情報や移動コストなどが格納されたテーブルをこのデータセット内に準備してください。 |
地点のテーブル |
巡回対象となる地点の情報が格納されたテーブル名を指定します。(必須) このテーブルには、「 |
移動コストのテーブル |
地点間の移動コスト(距離、時間、費用など)が格納されたテーブル名を指定します。(必須) このテーブルには、「 |
実行結果を格納するテーブル |
最適化計算の結果(具体的な巡回ルート)を格納するテーブル名を指定します。 指定しない場合、計算結果は保存されません。最適化結果を保存し、他の処理ブロックから参照したり、後で分析したりする場合は必ず設定してください。事前に作成する必要はなく、指定したテーブルがなければ、自動作成されます。既に存在する場合は、追加されます。 |
結果を格納する変数 |
最適化処理の実行結果に関する主要な情報を格納する変数名を指定します。(必須) この変数には、実行結果に関する基本的な情報(ジョブIDなど)が格納され、後続の処理ブロックで参照できます。具体的には、以下のような構造のJSONオブジェクトが格納されます。
主なキーの説明は以下の通りです。
|
ジョブのラベル名 |
実行する最適化ジョブに付与するラベル名(識別名)を指定します。 複数の最適化処理を区別するために使用します。特に、複数のジョブを同時に実行する場合や、後で特定のジョブの結果を確認する際に役立ちます。 |
ブロックメモ |
このブロックに関するメモを自由に記述できます。 フローの管理やメンテナンス時の情報共有に役立ちます。このメモの内容は、ブロックの実行には影響しません。 |
処理ステップ |
TSPソルバーの処理ステップ数を指定します。(デフォルト:1000) 値を大きくすると、より精密な計算ができる可能性がありますが、計算時間が増加します。通常はデフォルト値で十分な結果が得られます。 |
処理回数 |
TSPソルバーの処理回数を指定します。(デフォルト:10) 値を大きくすると、より良い解を見つけられる可能性がありますが、計算時間が増加します。通常はデフォルト値で十分な結果が得られます。 |
テーブルスキーマ
このブロックでは、2つの入力情報(テーブル形式)と、結果を格納する出力情報(テーブル形式)を使用します。それぞれのテーブルがどのような構造を持ち、どのようなデータを含める必要があるかを理解しておくことが重要です。
注:「必須」列の「✓」マークは、その項目が必須であることを示します。
1. 地点のテーブル
巡回対象となる地点の基本情報を定義するテーブルです。配送先、営業訪問先、保守・点検箇所などの地点を登録します。
JSONスキーマを表示
[
{ "name": "node_id", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "node_name", "type": "STRING", "mode": "NULLABLE", "description": "optional" }
]
カラム名 | データ型 | 必須/条件付き | 説明 |
---|---|---|---|
node_id | 文字列(STRING) | ✓ | 地点を一意に識別するためのID(例:warehouse 、customer_A 、shop_001 ) |
node_name | 文字列(STRING) | 地点の表示名(例:「倉庫 」、「顧客A 」、「店舗001 」)。省略可能です。 |
各地点には必ず一意なID(node_id
)を指定します。この値が、移動コストテーブルでの関連付けに使用されます。地点名(node_name
)は表示用の名前であり、省略できます。
2. 移動コストのテーブル
地点間の移動にかかるコスト(距離、時間、費用など)を定義するテーブルです。このテーブルの情報を基に、最適な巡回ルートが計算されます。
JSONスキーマを表示
[
{ "name": "originate_node_id", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "terminate_node_id", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "value", "type": "INTEGER", "mode": "NULLABLE", "description": "edge value" }
]
カラム名 | データ型 | 必須/条件付き | 説明 |
---|---|---|---|
originate_node_id | 文字列(STRING) | ✓ | 始点の地点ID(上記「1. 地点のテーブル」の node_id と対応) |
terminate_node_id | 文字列(STRING) | ✓ | 終点の地点ID(上記「1. 地点のテーブル」の node_id と対応) |
value | 整数(INTEGER) | ✓ | 始点から終点への移動にかかるコスト(距離、時間、費用など) |
このテーブルでは、地点間の移動コストを定義します。以下の特殊なルールが適用されます。
- 同一地点間の移動: 始点と終点が同じ地点の場合、移動コストの指定がなければ自動的に0として扱われる。
- 非対称な移動コスト: A地点からB地点への移動コストが定義されているが、B地点からA地点への移動コストが定義されていない場合、A→Bの値がB→Aの値としても使用される。
例えば、一方通行の道路がある場合や、上り坂と下り坂で移動時間が異なる場合など、方向によって移動コストが異なる状況にも対応できます。
3. 実行結果を格納するテーブル
最適化計算の実行後に生成される結果が格納されるテーブルです。具体的に、どの順序で地点を巡回すれば総移動コストが最小になるかが記録されます。
JSONスキーマを表示
[
{ "name": "job_id", "type": "STRING", "mode": "NULLABLE", "description": "BLOCKS job id" },
{ "name": "route_order", "type": "INTEGER", "mode": "NULLABLE", "description": "result order" },
{ "name": "node_index", "type": "INTEGER", "mode": "NULLABLE", "description": "" },
{ "name": "node_id", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "value", "type": "INTEGER", "mode": "NULLABLE", "description": "value of minimum distance" },
{ "name": "time", "type": "FLOAT", "mode": "NULLABLE", "description": "elapsed time" },
{ "name": "label", "type": "STRING", "mode": "NULLABLE", "description": "" },
{ "name": "created_at", "type": "TIMESTAMP", "mode": "NULLABLE", "description": "" }
]
カラム名 | データ型 | 出力有無 | 説明 |
---|---|---|---|
job_id | 文字列(STRING) | 必須 | 実行された最適化ジョブのID |
route_order | 整数(INTEGER) | 必須 | 巡回順序(1から始まる連番で、この順序で地点を巡回することで総移動コストが最小になります) |
node_index | 整数(INTEGER) | 必須 | システム内部で使用される地点のインデックス番号(1始まり) |
node_id | 文字列(STRING) | 条件付き | 対応する地点ID(地点テーブルの node_id と対応) |
value | 整数(INTEGER) | 必須 | 計算された最小移動コストの総計。すべての地点を巡回する際の最小コストです。 |
time | 数値(FLOAT) | 条件付き | TSP計算の実行時間(秒)。計算の所要時間の参考値です。 |
label | 文字列(STRING) | 条件付き | ジョブに設定されたラベル名 |
created_at | タイムスタンプ(TIMESTAMP) | 条件付き | 処理が作成された日時 |
最適化結果は、route_order
の順序に従って地点を巡回することで総移動コストが最小になることを示しています。例えば、route_order
の値1、2、3の順で地点A、B、Cが出力された場合、「地点A → 地点B → 地点C → 地点A(出発点に戻る)」の順序で巡回するのが最適であることを意味します。
value
は全体の最小移動コストの総計を示し、この値が小さいほど移動時間やコストを抑えたルートであることを表します。