荷物・渋滞・時間をひとつの重みに束ねて最適ルートを求める — 配達・物量のイメージで学ぶ重み付き最短経路(Antigravity SSSP 拡張)
記事について: 本拡張は実道路地図ではありません。格子+幹線の人工グラフに乱数で属性を付け、1 本の合成コストで最短路を比較する教育・実験用デモです。配達最適化そのものの再現ではありませんが、「重みをどう束ね、どう高速に解くか」の感覚を掴む用途向きです。
5 手法は同一条件です。単純な「距離だけ最短」ではなく、各辺(ルートの断片)に距離・所要時間・渋滞・運転しづらさ・天候・積載余裕の 6 種を乱数で割り当て、係数付きで1 本の整数コスト(合成重み w)に束ねたうえで最短路を求めます。辺のデータには w と内訳 6 数(計 7 つの数値)が載るイメージです。組み合わせ次第では現実よりシビアな道も普通に出る、というかなりマニアックな実験台です。ニーズは薄いかもしれませんが、作者が面白がって記事にしたものです。
興味があれば、Antigravity / VS Code 向けにパッケージ(ZIP 内 VSIX)も用意してありますので、下のダウンロードから試せます。網羅的なベンチマークではありませんが、筆者が調べた範囲では「代表的な最短経路アルゴリズムを、多次元条件を束ねた重み付きグラフ上で、同じ実装環境に並べて速さを見る」という形はあまり見かけず、そこに一点ものの価値がある、という位置づけです(世界最速・最高性能の一般主張ではありません)。
現場のルート話では、距離だけでなく時間帯・渋滞・積載の余裕・走りにくさまで同時に気になります。それらを無視して最短距離だけ取ると、現実の「やりにくさ」とズレます。この拡張は、そうした要因を整数の合成重みに圧縮し、同じグラフ・同じ始点終点のまま複数アルゴリズムの計算時間(ms)と経路コストを並べます。
以下は Antigravity SSSP を、使う順番と画面の見方中心にまとめたものです。裏側の計算の細部に踏み込む内容は載せていません。
拡張パッケージ v1.0.0(推奨: ZIP)
ZIP の中に VSIX が 1 つ入っています。展開後、.vsix をエディタからインストールしてください。
Antigravity / VS Code で「拡張機能」→「VSIX からのインストール」。手順は brief047 も参照。
拡張は無料です。継続開発の応援がつながるとうれしいです。
使い方(最初の一通り)
- ZIP を展開し、中の拡張パッケージをエディタの「VSIX からのインストール」で入れる。
- 左の Antigravity SSSP を開き、「比較パネルを開く」で大きい画面を出す。
- 頂点数を選び、「比較する」を押す(大きいほど待ち時間が伸びます)。
- 棒グラフ・表・地図で、合成重み(ルートの総コスト)とミリ秒(計算の速さ)を眺める。
- 頂点数が 5,000 を超える(5,001 以上)ときは、地図でドラッグしてゾーンを置き、「ゾーンを反映して再計測」で変化を試す。
起動と画面の位置
左端の Activity Bar に Antigravity SSSP があります。そこを開くと説明付きのサイドバーが出ます。上の 「比較パネルを開く」 を押すと、地図とグラフが並ぶ大きな作業画面が開きます(一覧の歯車アイコンからも同じパネルを開けます)。
このアプリで押さえる 3 点
① いろいろな事情を一本の「コスト」にまとめている ② 同じ地図で計算の速さを並べている ③ Bucket (Dial) は整数コスト向けの速い代表例
-
1 合成
距離だけじゃない「とおりにくさ」
各リンクに距離・時間・渋滞などが仮想で付き、それらを一本の数値(合成重み)にまとめたうえで、いちばん安いルートを探します。配達で「総合的に楽な道」を一つの目安にするイメージです。
-
2 比較
出発とゴールは固定、条件は同じ
出発はいつも地点 0、ゴールはいちばん大きい番号の地点です。同じ地図に対し、計算のやり方が違う5 通りを、それぞれ何度か測って平均の速さ(ミリ秒)を棒グラフにしています。
-
3 Bucket
Bucket (Dial) が伸びやすい理由(ざっくり)
よく知られた手法は「いまいちばん有望な地点」を並べ替えながら進めます。一方、コストがきちんとした整数にまとまっているときは、桶(バケット)に地点を分類する古典的なやり方が、環境によっては速く出やすい、という対比を見られます。
地図のイメージ(裏で何が起きているか)
画面の格子は、細い近道のつながりに加えて、横や縦に少し飛ぶ「幹線」のようなつながりも持つ人工の道路網です。同じ「頂点数」を選べば、同じ迷路の形になります(試し直しやすいよう、ランダムは毎回ぶれないように決め打ちされています)。
各リンクには、距離・所要時間・渋滞・運転のしづらさ・天気・積載の余裕などがランダムで付き、それらを係数付きで足し合わせて、一本の整数のコストにまとめています。渋滞や悪天候の項が効きやすいので、「遠くても楽な道」と「近くてもしんどい道」が分かれやすい設定です。
「比較する」を押すと
選んだ頂点数の地図を用意したあと、5 通りの計算方法それぞれを何度か走らせ、平均の計算時間(ミリ秒)を棒グラフにします。ゾーンを変えて「ゾーンを反映して再計測」すると、コストやステップ、速さがどう変わったかが差分パネルにまとまり、下には再計測の履歴が溜まります。頂点数の上限はおおよそ 300 万までです(大きいほど重くなります)。
ゾーン(赤=避けたい・緑=通りたい)
地図上でドラッグすると矩形のゾーンが置けます。赤(避ける)は該当辺の重みに +500、緑(通りたい)は −220 が加わる設定です(いずれも通行禁止ではなく偏好)。まわり道の方がトータルで安ければ、避けゾーンを横切るルートも選ばれます。ゾーンのドラッグは頂点数が 5,000 を超えるときだけ有効です(5,001 頂点以上。それ以下ではゾーン行が出ず操作できません)。種類は画面上の切り替えから選び、「ゾーンを反映して再計測」で地図を作り直してから、もう一度比較します。
5 つの計算の名前と違い(用語)
| 画面上の名前 | ユーザー目線でのイメージ |
|---|---|
| Dijkstra(ヒープ) | 非負のコストなら正しい答えが出る、いちばん定番のやり方。地図上の青い経路の基準にもなります。 |
| A*(ヒューリスティック) | ゴールの方角を見積もって探索を絞るやり方。条件が合えば答えは定番と同じになります。 |
| 双方向 Dijkstra | 出発とゴールの両方から同時に広げて、途中でつなげるイメージ。一本のルートを求める向きです。 |
| Bucket (Dial) | コストが整数にまとまっているとき向け。桶に地点を分けて進める古典的手法で、棒グラフでは速く出やすいことがあります。 |
| 実験・4 分岐ヒープ Dijkstra | 中身は定番に近いが、並べ替えの内部の形を変えた比較用。速さは PC や地図の大きさで変わります。 |
画面の用語(図4を読むとき)
| 表示 | 意味 |
|---|---|
| ms(棒・メトリクス) | 各手法を 3 回計測した計算時間の平均(ブラウザ内の処理時間。移動時間ではない)。 |
| コスト/合成重み | 終点までの経路上の辺の重み w の合計(ゾーン適用後)。 |
| ステップ数 | 経路上の辺の本数。 |
| 出発・到着 | 常に地点 0からいちばん大きい番号の地点(n−1)へ。 |
| 整合性パネル | 各手法の到達可否・コスト・ステップ・Dijkstra との差。 |
| 要因の表 | 各手法が自分の経路について距離・時間・渋滞などを積み上げたもの(経路が違えば行ごとに数値も変わる)。 |
| 合成重みの内訳バー | Dijkstra の経路を前提にした比率。各辺は floor 済みの w なので、バーの近似と総コストがすこしズレることがある(パネル下の注記どおり)。 |
| 再計測パネル・差分表 | ゾーン反映の前後で、コスト・ms・ステップがどう変わったか。 |
| 再計測履歴 | ゾーン操作ごとのスナップショット一覧。 |
| 概略地図とゾーン | 5,000 を超えると概略キャンバス+ゾーン。それ以下は網の目に近い全頂点描画が中心。 |
整合性パネルで手法ごとのコストが食い違う場合、拡張側の説明では整数化・双方向の打ち切り・A* のヒューリスティックなどが原因として挙げられています。同じコストでも経路の形が違うことはあり、そのとき要因の表は手法ごとに読み分けてください。
新しい研究との関係(ざっくり)
長いあいだ、「最短経路を速く求めるには並べ替えのような処理が要る」と考えられてきました。一方で、コストがきちんと整数にまとまる世界では、桶(バケット)に地点を分ける古典的なやり方が、定番と対照的な速さの出方を見せます。この拡張の Bucket (Dial) は、その系統を体感で比べるための一枚です。
2025 年に arXiv で紹介された Breaking the Sorting Barrier for Directed Single-Source Shortest Paths は、もっと難しい設定で「並べ替えの壁」を緩める理論の一例です。この拡張がその論文そのものを再現しているわけではありません。あくまで、ニュースで聞く「最短経路の新しい話」と、手元の棒グラフをざっくり結びつけるための入口だと捉えてください。
現実の配達・物量とどうつなぐか
地点は交差点やエリアのイメージ、線は移動のつながり、一本化されたコストは「今日はこれを優先して通りたい」度合いのようなものです。ゾーンは本番のジオフェンスのように硬い禁止ではなく、コストをまとめて上げ下げするやわらかい偏好として読むと分かりやすいです。実務の時間窓付き配車や在庫まで扱うわけではありませんが、ルートを数値で語る練習として触れる価値があります。
Artist's Perspective
貧乏すぎるくたびれたおっさんですが、何か社会の役に立てればとおもい、作成してみようとしたら、ほんとうにめんどい、、、というか、さらにくたびれた、、、、で、かなりはまったという、、、
さて、貧乏すぎるくたびれたおっさん的には、最近、セブンイレブンの キャンペーンが 鬼得のキャンペーンばかりで、要チェックな毎日になっております。さて、お金がない中、どれだけお得なことをするのか、、、そればかり考える日々。。。
拡張は無料でお使いいただけます。寄付は任意です。開発の継続と改善のため、応援していただけるとうれしいです。
データソース・参考リンク
拡張で比較している手法に対応する、代表的な原著・公式 DOIと実装の入口です。厳密な定義・主張は各リンク先の本文でご確認ください。
Dijkstra(ヒープ)・Bucket (Dial)・双方向探索・A*・d 分岐ヒープによる優先キュー・記事で触れる研究の順のイメージです。第 5 手法は実装独自性が大きいため、検証手順はリポジトリを参照してください。
-
📄
Dijkstra(単一始点・非負辺重みの古典)
E. W. Dijkstra (1959), "A note on two problems in connexion with graphs", Numerische Mathematik 1, 269–271 — DOI 10.1007/BF01386390 -
📄
Bucket (Dial)(非負整数重み・バケットキュー)
R. B. Dial (1969), "Algorithm 360: Shortest-path forest with topological ordering", Communications of the ACM 12(11), 632 — DOI 10.1145/363260.363269 -
📄
双方向最短経路(二点間を両端から広げる考え方)
T. A. J. Nicholson (1966), "Finding the shortest route between two points in a network", The Computer Journal 9(3), 275–280 — DOI 10.1093/comjnl/9.3.275 -
📄
A*(ヒューリスティック付き最短路探索)
P. E. Hart, N. J. Nilsson, B. Raphael (1968), «A Formal Basis for the Heuristic Determination of Minimum Cost Paths», IEEE Trans. Systems Science and Cybernetics 4(2), 100–107 — DOI 10.1109/TSSC.1968.300136 -
📄
二分ヒープ(Dijkstra の優先キュー実装の古典)
J. W. J. Williams (1964), "Algorithm 232: Heapsort", Communications of the ACM 7(6), 347–348 — DOI 10.1145/364520.364964 -
📄
d 分岐ヒープ・更新付き優先キュー(最短路評価との関連)
D. B. Johnson (1975), «Priority queues with update and finding minimum spanning trees», Information Processing Letters 4(3), 53–58 — DOI 10.1016/0020-0190(75)90001-0 -
📄
有向 SSSP と「並べ替えの壁」(記事内の研究文脈)
R. Duan, Y. Mao, «Breaking the Sorting Barrier for Directed Single-Source Shortest Paths», arXiv:2504.17033(プレプリント) -
🔗
本拡張の実装・検証手順(一次ソース)
GitHub: y-kobayashi/antigravity-sssp-ext(アルゴリズムコード・npm run verify:experimentalなど)