Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
A_アルゴリズム高速化を目指して
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Takashi Makino
April 25, 2021
Programming
1.6k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
A_アルゴリズム高速化を目指して
Takashi Makino
April 25, 2021
More Decks by Takashi Makino
See All by Takashi Makino
あなたの知らないスクラムの世界
makky0620
0
120
Flutterでもテスト駆動したい
makky0620
0
390
Discord botにScrumの Discord botにScrumの手伝いをしてもらう手伝いをしてもらう
makky0620
0
430
Other Decks in Programming
See All in Programming
iOSDC2026登壇資料.pdf
riofujimon
0
110
AGENTS.md Is Not Enough:Build Skills, Don't Download Them
lx_t
0
110
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
260
20260914 AIエージェント時代のPlatform Engineering LLM基盤とプロダクトの責務境界線
kanfab1
5
1.5k
Omarchy Tokyo やると聞いて UMPC 買ってセットアップしてきた
mtsmfm
0
140
Intent as Code
shoppingjaws
6
940
RSSとCodexを使ってX投稿自動化してみた
ochtum
0
110
thread_parallel_with_free-threaded_Python_and_NumPy.pdf
riku_sakamoto
0
300
kubernetes コンポーネント開発入門 / 新卒N年目の勉強会&交流会!〜〇〇への誘い〜 #n_study
mazrean
0
220
AIとGame Jamで、ゲームを完成させた話
takahirosaeki
0
120
Streamlitで実現する自然言語データアプリ開発
ayumu_yamaguchi
0
190
思考垂れ流し開発 ~音声入力 × AIエージェント × 開発ハーネスによる試行錯誤~
npostring
0
1.1k
Featured
See All Featured
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1.2k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
310
It's Worth the Effort
3n
188
29k
Build your cross-platform service in a week with App Engine
jlugia
234
19k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
270
Code Review Best Practice
trishagee
74
20k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.4k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
730
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
430
Reality Check: Gamification 10 Years Later
codingconduct
0
2.3k
Marketing to machines
jonoalderson
1
5.8k
Transcript
A*アルゴリズム 高速化を目指して 牧野トミー孝史 2021/04/21@TechBash
高速化の前に理解しよう • 一般的な経路探索アルゴリズムに A*アルゴリズムがある • Wikipediaにこうしたら速くなるよと書いてある ◦ データ構造の工夫 ◦ ヒューリスティック関数の工夫
• そもそものアルゴリズムを自分で実装したことがない →しっかり理解したことをみんなに伝えてみよう!
どんな問題を解くのか StartからGoalまでの経路を求める! • ノード(青い点):81個 • エッジ(線):144本 Start Goal
どんな問題を解くのか StartからGoalまでの経路を求める! • ノード(青い点):81個 • エッジ(線):144本 Start Goal 赤い線っぽくなってく れたらいいな
A*の考え方 S G (0, 0) (100, 100) (50, 100) (0,
100) (50, 0) (90, 0) (0, 50) (50, 50) (100, 50) f(n) = g(n) + h(n) のf(n)が最小となる経路をたどっていく
A*の考え方 最小経路の時のコストをf(n)*と置くと ※nはノードを指している f(n)* = g(n)* + h(n)* g(n)*はスタートからノードnまでのコスト h(n)*はノードnからゴールまでのコスト
g(n)*とh(n)*はわからないため、推定値として計 算する必要がある。推定値 f(n)と置くと f(n) = g(n) + h(n) g(n)は通った時に算出すれば良いが、 h(n)はゴールに辿り着くまで不明である。 S G (0, 0) (100, 100) (50, 100) (0, 100) (50, 0) (90, 0) (0, 50) (50, 50) (100, 50)
A*の考え方 最小経路の時のコストをf(n)*と置くと ※nはノードを指している f(n)* = g(n)* + h(n)* g(n)*はスタートからノードnまでのコスト h(n)*はノードnからゴールまでのコスト
g(n)*とh(n)*はわからないため、推定値として計 算する必要がある。推定値 f(n)と置くと f(n) = g(n) + h(n) g(n)は通った時に算出すれば良いが、 h(n)はゴールに辿り着くまで不明である。 S G (0, 0) (100, 100) (50, 100) (0, 100) (50, 0) (90, 0) (0, 50) (50, 50) (100, 50) f(n)* = 50 + 50*3 = 200
(50, 50) A*の考え方 最小経路の時のコストをf(n)*と置くと ※nはノードを指している f(n)* = g(n)* + h(n)*
g(n)*はスタートからノードnまでのコスト h(n)*はノードnからゴールまでのコスト g(n)*とh(n)*はわからないため、推定値として計 算する必要がある。推定値 f(n)と置くと f(n) = g(n) + h(n) g(n)は通った時に算出すれば良いが、 h(n)はゴールに辿り着くまで不明である。 S G (0, 0) (100, 100) (50, 100) (0, 100) (50, 0) (90, 0) (0, 50) (100, 50) f(n) = 50 + ? = ??
(50, 50) A*の考え方 最小経路の時のコストをf(n)*と置くと ※nはノードを指している f(n)* = g(n)* + h(n)*
g(n)*はスタートからノードnまでのコスト h(n)*はノードnからゴールまでのコスト g(n)*とh(n)*はわからないため、推定値として計 算する必要がある。推定値 f(n)と置くと f(n) = g(n) + h(n) g(n)は通った時に算出すれば良いが、 h(n)はゴールに辿り着くまで不明である。 S G (0, 0) (100, 100) (50, 100) (0, 100) (50, 0) (90, 0) (0, 50) (100, 50) h(n)にはヒューリスティックな関数を定 義する e.g. ユークリッド距離 マンハッタン距離 e.g. マンハッタン距離の時 h(n) = (100-50) + (100-0) h(n) = 150 f(n) = 50 + 150 = 200
コストを使ってどうやって経路探索するのか Wikipediaの実装をそのまま再現 事前準備・備考 • 優先度付きキューOPENとCLOSEを用意 • 優先度はf(n)の低い順 • h(n)はマンハッタン距離 S
G (0, 0) (100, 100) (50, 100) (0, 100) (50, 0) (90, 0) (0, 50) (50, 50) (100, 50)
OPEN:[11] CLOSE:[] TARGET: 説明 スタートのノードをOPENへ入れる (0, 0) (100, 100) (50,
100) (0, 100) (50, 0) (90, 0) (0, 50) (50, 50) (100, 50) 11 12 13 22 21 31 32 23 33
OPEN:[] CLOSE:[11] TARGET:11 説明 OPENから一つ取り出しCLOSEに加える (0, 0) (100, 100) (50,
100) (0, 100) (50, 0) (90, 0) (0, 50) (50, 50) (100, 50) 11 12 13 22 21 31 32 23 33
12 21 OPEN:[] CLOSE:[11] TARGET:11 説明 TARGETと隣接しているノードがOPENまたはCLOSE に含まれるか確認する (含まれなかった) (0,
0) (100, 100) (50, 100) (0, 100) (50, 0) (90, 0) (0, 50) (50, 50) (100, 50) 11 13 22 31 32 23 33
12 21 OPEN:[12(200), 21(200)] CLOSE:[11] TARGET:11 説明 TARGETと隣接しているノードのfn(n)を求めてOPEN に追加する f(12)
= 50 + 150 = 200 f(21) = 50 + 150 = 200 この時各ノードに親情報( 11から繋がっている)を付 与する ここまで1セット (0, 0) (100, 100) (50, 100) (0, 100) (50, 0) (90, 0) (0, 50) (50, 50) (100, 50) 11 13 22 31 32 23 33
OPEN:[21(200)] CLOSE:[11, 12(200)] TARGET:12(200) 説明 OPENから一つ取り出しCLOSEに加える (0, 0) (100, 100)
(50, 100) (0, 100) (50, 0) (90, 0) (0, 50) (50, 50) (100, 50) 11 12 13 22 21 31 32 23 33
13 22 OPEN:[21(200)] CLOSE:[11, 12(200)] TARGET:12(200) 説明 TARGETと隣接しているノードがOPENまたはCLOSE に含まれるか確認する (含まれなかった)
(0, 0) (100, 100) (50, 100) (0, 100) (50, 0) (90, 0) (0, 50) (50, 50) (100, 50) 11 12 21 31 32 23 33
13 22 OPEN:[21(200), 13(200), 22(200)] CLOSE:[11, 12(200)] TARGET:12(200) 説明 TARGETと隣接しているノードのfn(n)を求めてOPEN
に追加する f(13) = 100 + 100 = 200 f(22) = 100 + 100 = 200 この時各ノードに親情報を付与する (0, 0) (100, 100) (50, 100) (0, 100) (50, 0) (90, 0) (0, 50) (50, 50) (100, 50) 11 12 21 31 32 23 33
13 22 OPEN:[21(200), 13(200), 22(200)] CLOSE:[11, 12(200)] TARGET:12(200) 説明 TARGETと隣接しているノードのfn(n)を求めてOPEN
に追加する f(13) = 100 + 100 = 200 f(22) = 100 + 100 = 200 この時各ノードに親情報を付与する (0, 0) (100, 100) (50, 100) (0, 100) (50, 0) (90, 0) (0, 50) (50, 50) (100, 50) 11 12 21 31 32 23 33
OPEN:[13(200), 22(200)] CLOSE:[11, 12(200), 21(200)] TARGET:21(200) 説明 OPENから一つ取り出しCLOSEに加える (0, 0)
(100, 100) (50, 100) (0, 100) (50, 0) (90, 0) (0, 50) (50, 50) (100, 50) 11 12 13 22 21 31 32 23 33
22 31 OPEN:[13(200), 22(200)] CLOSE:[11, 12(200), 21(200)] TARGET:21(200) 説明 TARGETと隣接しているノードがOPENまたはCLOSE
に含まれるか確認する (22がOPENに含まれている) (0, 0) (100, 100) (50, 100) (0, 100) (50, 0) (90, 0) (0, 50) (50, 50) (100, 50) 11 12 13 21 32 23 33
22 31 OPEN:[13(200), 22(200), 31(200)] CLOSE:[11, 12(200), 21(200)] TARGET:21(200) 説明
TARGETと隣接しているノードのfn(n)を求めてOPEN に追加する f(31) = 90 + 110 = 200 f(22) = 100 + 100 = 200 もしf(22)が元のコストより低ければコストと親情報を 更新する この時各ノードに親情報を付与する (0, 0) (100, 100) (50, 100) (0, 100) (50, 0) (90, 0) (0, 50) (50, 50) (100, 50) 11 12 13 21 32 23 33
(0, 0) (100, 100) (50, 100) (0, 100) (50, 0)
(90, 0) (0, 50) (50, 50) (100, 50) 11 12 13 22 21 31 32 23 33 OPEN:[13(200), 22(200)] CLOSE:[11, 12(200), 21(200), 31(200)] TARGET:31(200) 説明 OPENから一つ取り出しCLOSEに加える (ちょっと恣意的に31を取り出しました)
32 22 31 OPEN:[13(200), 22(200)] CLOSE:[11, 12(200), 21(200), 31(200)] TARGET:31(200)
説明 TARGETと隣接しているノードがOPENまたはCLOSE に含まれるか確認する (含まれなかった) (0, 0) (100, 100) (50, 100) (0, 100) (50, 0) (90, 0) (0, 50) (50, 50) (100, 50) 11 12 13 21 23 33
32 22 31 OPEN:[13(200), 22(200), 32(200] CLOSE:[11, 12(200), 21(200), 31(200)]
TARGET:31(200) 説明 TARGETと隣接しているノードのfn(n)を求めてOPEN に追加する f(32) = 150 + 50 = 200 この時各ノードに親情報を付与する (0, 0) (100, 100) (50, 100) (0, 100) (50, 0) (90, 0) (0, 50) (50, 50) (100, 50) 11 12 13 21 23 33
(0, 0) (100, 100) (50, 100) (0, 100) (50, 0)
(90, 0) (0, 50) (50, 50) (100, 50) 11 12 13 22 21 31 32 23 33 OPEN:[13(200), 22(200)] CLOSE: [11, 12(200), 21(200), 31(200), 32(200)] TARGET:32(200) 説明 OPENから一つ取り出しCLOSEに加える (ちょっと恣意的に32を取り出しました)
22 33 (0, 0) (100, 100) (50, 100) (0, 100)
(50, 0) (90, 0) (0, 50) (50, 50) (100, 50) 11 12 13 21 31 32 23 OPEN:[13(200), 22(200)] CLOSE: [11, 12(200), 21(200), 31(200), 32(200)] TARGET:32(200) 説明 TARGETと隣接しているノードがOPENまたはCLOSE に含まれるか確認する (22がOPENに含まれる)
22 33 (0, 0) (100, 100) (50, 100) (0, 100)
(50, 0) (90, 0) (0, 50) (50, 50) (100, 50) 11 12 13 21 31 32 23 OPEN:[13(200), 22(200), 33(200)] CLOSE: [11, 12(200), 21(200), 31(200), 32(200)] TARGET:32(200) 説明 TARGETと隣接しているノードのfn(n)を求めてOPEN に追加する f(22) = 250 + 100 = 350 f(33) = 0+200 = 200 この時各ノードに親情報を付与する
(0, 0) (100, 100) (50, 100) (0, 100) (50, 0)
(90, 0) (0, 50) (50, 50) (100, 50) 11 12 13 22 21 31 32 23 33 OPEN:[13(200), 22(200), 33(200)] CLOSE: [11, 12(200), 21(200), 31(200), 32(200), 33(200] TARGET:33(200) 説明 OPENから一つ取り出しCLOSEに加える (ちょっと恣意的に33を取り出しました)
(0, 0) (100, 100) (50, 100) (0, 100) (50, 0)
(90, 0) (0, 50) (50, 50) (100, 50) 11 12 13 22 21 31 32 23 33 OPEN:[13(200), 22(200), 33(200)] CLOSE: [11, 12(200), 21(200), 31(200), 32(200), 33(200] TARGET:33(200) 説明 TARGETがGoalと等しいので終了
(0, 0) (100, 100) (50, 100) (0, 100) (50, 0)
(90, 0) (0, 50) (50, 50) (100, 50) 11 12 13 22 21 31 32 23 33 OPEN:[13(200), 22(200), 33(200)] CLOSE: [11, 12(200), 21(200), 31(200), 32(200), 33(200] TARGET:33(200) 説明 TARGETの親情報をたどっていけば 33->32->31->21->11 という経路となることがわかる
実際に解いてみると Start Goal • ノード(青い点):81個 • エッジ(線):144個 • 計算時間:0.00536s
こんな複雑な問題も解ける Start Goal • ノード(青い点):2401個 • エッジ(線):3984個 • 計算時間:3.24s(これじゃ遅い)
余談:ダイクストラ法って何? A*アルゴリズムの特殊版 ヒューリスティックな値が0として、スタートからノードnまでのコストのみで計算 f(n) = g(n) + h(n) h(n) =
0