๐Ÿ‘จ๐Ÿป‍๐Ÿ’ป programming/โ—ฝ ์•Œ๊ณ ๋ฆฌ์ฆ˜

[Algorithm/Shortest Path] A* ์•Œ๊ณ ๋ฆฌ์ฆ˜ - ๊ตฌํ˜„C++

DoctorSunAhna 2022. 6. 20. 16:33
728x90

์Šคํ„ฐ๋””์—์„œ A* ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ•œ ๋ฒˆ ์ž‘์„ฑํ•ด๋ณด๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ ์ฝ˜์†”๋กœ ๋„์–ด๋ณด๊ณ .. ์œ ๋‹ˆํ‹ฐ๋กœ ์ ์šฉํ•ด๋ณด๊ธฐ๋กœ ํ•˜์˜€๋‹ค. ์œ ๋‹ˆํ‹ฐ๋กœ ์˜ฎ๊ธฐ๋Š” ์ž‘์—… ๋ฒŒ์จ๋ถ€ํ„ฐ ๊ฑฑ์ •์ด ๋œ๋‹ค. ์ผ๋‹จ A*์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋ญ”์ง€ ์ •๋ฆฌ๋ฅผ ํ•ด๋ณด์ž ..

A* ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ™•์žฅํ•˜์—ฌ ๋งŒ๋“ค์–ด์ง„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์ฃผ์–ด์ง„ ์ถœ๋ฐœ ๊ผญ์ง“์ ์—์„œ๋ถ€ํ„ฐ ๋ชฉํ‘œ ๊ผญ์ง“์ ๊นŒ์ง€ ๊ฐ€๋Š” ์ตœ๋‹จ๊ฒฝ๋กœ๋ฅผ ์ฐพ์•„๋‚ด๋Š” ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘ ํ•˜๋‚˜์ด๋‹ค. 

์ฃผ๋กœ ๊ฒŒ์ž„์—์„œ ๋ชฌ์Šคํ„ฐ๊ฐ€ ํ”Œ๋ ˆ์ด์–ด๋ฅผ ๋ชฉํ‘œ์ง€์ ์œผ๋กœ ์ด๋™ํ•˜๊ฑฐ๋‚˜  ์ž๋™ ์‚ฌ๋ƒฅ ๊ฒŒ์ž„์—์„œ ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ํƒ€๊ฒŸ(๋ชฌ์Šคํ„ฐ๋‚˜ ๋‹ค๋ฅธ PC)์„ ํ–ฅํ•ด ์ด๋™์‹œํ‚ฌ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. 

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜  A* ์•Œ๊ณ ๋ฆฌ์ฆ˜
๋ชฉํ‘œ์  ์‹œ์ž‘์  -> ๋‚˜๋จธ์ง€ ๋ชจ๋“  ์ •์ ๋“ค๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ์‹œ์ž‘์  -> ๋ชฉํ‘œ์ ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ 
์ฐจํ›„ ๊ฒฝ๋กœ ๋„์ถœ์„ ์œ„ํ•œ ํ•จ์ˆ˜
f(n)
ํ˜„์žฌ ๋…ธ๋“œ์—์„œ ๊ฐ€๊นŒ์šด ๋…ธ๋“œ๋ถ€ํ„ฐ ์ˆœ์ฐจ์ ์œผ๋กœ ๋ฐฉ๋ฌธ

f(n) = g(n) 
ํ˜„์žฌ ๋…ธ๋“œ์™€ ํœด๋ฆฌ์Šคํ‹ฑ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ ์ˆ˜๋ฅผ ๋งค๊ธฐ๊ณ  ๊ฐ€์žฅ ์ข‹์€(๊ฐ€์žฅ ๊ฐ€๊นŒ์šด) ์ ์ˆ˜ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธ

f(n) = g(n) + h(n) (* h(n)=0 ์ด๋ฉด, ๋‹ค์ต์ŠคํŠธ๋ผ)
์†๋„ ๋‹ค์ต์ŠคํŠธ๋ผ < A* 

 

A* ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฐฉ๋ฌธ ๋…ธ๋“œ ํƒ์ƒ‰ ๊ธฐ์ค€ ๊ณต์‹

$ f\big(n\big) = g\big(n\big)+h\big(n\big) $

- g(x): ์‹œ์ž‘ ๋…ธ๋“œ๋ถ€ํ„ฐ ํ˜„์žฌ ๋…ธ๋“œ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ(๋น„์šฉ)

- h(x)/heuristic : ํ˜„์žฌ ๋…ธ๋“œ์—์„œ ๋„์ฐฉ ๋…ธ๋“œ๊นŒ์ง€์˜ ์ถ”์ •๋œ ๋‚จ์€ ๊ฑฐ๋ฆฌ(๋น„์šฉ)

 

heuristic ํœด๋ฆฌ์Šคํ‹ฑ ์ค‘ ๋Œ€ํ‘œ์ ์ธ ํ•จ์ˆ˜ 

(1). ๋งจํ•ดํŠผ ๊ฑฐ๋ฆฌ(Manhattan Distance) ํ•จ์ˆ˜ : L1 Distance๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๊ณต์‹ 

2์ฐจ์› : |x1 - x2| + |y1 - y2|
3์ฐจ์›:  |x1 - x2| + |y1 - y2| + |z1 - z2| 

 

(2). ์œ ํด๋ฆฌ๋””์•ˆ ๊ฑฐ๋ฆฌ ํ•จ์ˆ˜(Euclidean Distance) : L2 Distance๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๊ณต์‹ (์•„๋ž˜ ์ฝ”๋“œ๋Š” ์œ ํด๋ฆฌ๋””์•ˆ ์‚ฌ์šฉ.)

2์ฐจ์›:  $$\sqrt{ \big(x2 - x1\big) ^{2}+ \big(y2-y1\big) ^{2}}$$
3์ฐจ์›:  $$\sqrt{ \big(x2 - x1\big) ^{2}+ \big(y2-y1\big) ^{2} + \big(z2-z1\big) ^{2}}$$

๊ทธ๋ฆผ์œผ๋กœ A*์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ๋ฆ„๋ณด๊ธฐ

1. P = ์‹œ์ž‘์ 
2. P์— f, g, h ํ• ๋‹น
3. Open ๋ฆฌ์ŠคํŠธ์— P ๋„ฃ๊ธฐ
4. B = Open ๋ฆฌ์ŠคํŠธ์—์„œ ๊ฐ€์žฅ ๋‚ฎ์€ f ๊ฐ’์„ ๊ฐ€์ง„ ๋…ธ๋“œ
    a. B๊ฐ€ ๋ชฉํ‘œ์ ์ด๋ฉด, ๊ฒฝ๋กœ ์™„์„ฑ
    b. Open ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋น„์—ˆ์œผ๋ฉด, ๋ชฉํ‘œ์ ๊นŒ์ง€ ๊ฒฝ๋กœ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์Œ
5. C = B์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ
    a. C์— f, g, h ๊ฐ’ ํ• ๋‹น
    b. Open/Close ๋ฆฌ์ŠคํŠธ์—์„œ C๊ฐ€ ์žˆ๋Š”์ง€ ์ฒดํฌ
        1. ์žˆ์œผ๋ฉด, ๋” ๋‚ฎ์€ f ๊ฐ’์œผ๋กœ ๊ฒฝ๋กœ ์—…๋ฐ์ดํŠธ
        2. ์—†์œผ๋ฉด, C๋ฅผ Open ๋ฆฌ์ŠคํŠธ์— ๋„ฃ๊ธฐ
    c. 5๋ฒˆ์œผ๋กœ ๋Œ์•„๊ฐ€์„œ B์— ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์ง„ํ–‰
6. 4๋ฒˆ์œผ๋กœ ๋Œ์•„๊ฐ

[pseudo ์ฝ”๋“œ ์ถœ์ฒ˜]
A* ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ตฌํ˜„ – ๊ฒŒ์ž„ ๊ฐœ๋ฐœ ๋ธ”๋กœ๊ทธ/์œ ๋‹ˆํ‹ฐ/์–ธ๋ฆฌ์–ผ/์Šคํ† ๋ฆฌ/ํŒ/ํ”„๋กœ๊ทธ๋ž˜๋ฐ (lunchballer.com)

[์™ผ์ชฝ]&nbsp; ๊ฐ ๋…ธ๋“œ๊ฐ„์˜ ๊ฑฐ๋ฆฌ (g(x)) ,&nbsp; [์˜ค๋ฅธ์ชฝ] ๋„์ฐฉ์ง€์ ๊นŒ์ง€์˜ ์ถ”์ •๊ฑฐ๋ฆฌ (h(x))
์‹œ์ž‘๋…ธ๋“œ : 7๋ฒˆ

- ์‹œ์ž‘ ๋…ธ๋“œ 7๋ฒˆ์„ close์— ๋‹ด๋Š”๋‹ค.
- 7๋ฒˆ๊ณผ ์—ฐ๊ฒฐ๋œ 6๋ฒˆ 5๋ฒˆ์„ open์— ๋‹ด๋Š”๋‹ค.
- ์ถ”์ •๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ 6๋ฒˆ ๋…ธ๋“œ๋ฅผ close์— ๋‹ด๋Š”๋‹ค.

 


- 6๋ฒˆ๊ณผ ์—ฐ๊ฒฐ๋œ 2๋ฒˆ 1๋ฒˆ์„ open์— ๋‹ด๋Š”๋‹ค.
- ์ถ”์ •๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ 2๋ฒˆ ๋…ธ๋“œ๋ฅผ close์— ๋‹ด๋Š”๋‹ค.

 

 

- 6๋ฒˆ๊ณผ ์—ฐ๊ฒฐ๋œ 2๋ฒˆ 1๋ฒˆ์„ open์— ๋‹ด๋Š”๋‹ค.
- ์ถ”์ •๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ 2๋ฒˆ ๋…ธ๋“œ๋ฅผ close์— ๋‹ด๋Š”๋‹ค.

 

 


๊ตฌํ˜„ (C++)

 

 

728x90