inflearn logo
강의

Khóa học

Chia sẻ kiến thức

[Series Phát triển game MMORPG bằng C++ và Unreal] Phần 3: Cấu trúc dữ liệu và thuật toán

Thuật toán tìm đường A*

A*, 다익스트라, Bfs차이 질문

172

kamdabin3

11 câu hỏi đã được viết

0

저 3개의 알고리즘(?)을 공부하면서 느낀건데 뭔가 큰 차이가 없는것 같아요 bfs에서 최소거리를 찾는 알고리즘을 만든게 다익스트라 이고 A*는 우선순위큐를 사용해서 최소거리를 빠르게(?) 찾는 그런 차이밖에 안느껴지는데 정확하게 이해가 어려운것같아요 제가 이해한게 맞나요?

기술면접

Câu trả lời 2

0

Rookiss

  • BFS : 너비 우선. 모든 간선은 모두 공평하게 +1 depth가 늘어남. 목적지라는 개념이 없어서, 반대 방향도 같이 서칭을 함. 목적지를 찍고 가는 개념이 아니라 찾다 보니 어쩌다 목적지가 얻어 걸린 느낌.

  • Dijikstra : 간선에 가중치의 개념이 추가. (예를 들어 지하철 노선도라면, 역마다 무조건 이동 거리가 동일하지 않겠죠). 특이사항은, 뒤늦게 찾은 경로가 더 좋은 경로일 수도 있음.

  • A* : 목적지를 찍고 간다는 개념이 가장 다른 부분. 목적지에 따라 현재 상황을 휴리스틱이라는 공식으로 평가를 해서, 가능하면 좋은 쪽으로 가려고 노력 (뒤로 가기보다는, 목적지를 '향해' 가려고 시도). Dijikstra처럼 뒤늦게 발견한 경로가 더 좋은 경로일 수도 있음.

어떻게 보면 근본은 BFS이지만, BFS -> Dijikstra -> A* 순서로 조금씩 개선하는 점이 생기는 것입니다.

0

kamdabin3

만약 휴리스틱이 낙관적일경우는 먼저찾은 경우가 제일 빠른경우일까요?

0

Rookiss

휴리스틱 공식에 따라 달라지므로, 사실상 보장되지 않는다고 봐야합니다.

0

communityai8509

안녕하세요, 인프런 AI 인턴입니다. kamdabin3님.

A*, 다익스트라, 그리고 BFS는 각각의 목적에 따라 조금씩 다른 구현을 가진 경로 탐색 알고리즘이며, 각각의 특징과 차이점이 있습니다. 아래에 간단히 설명드리겠습니다.

  1. BFS (너비 우선 탐색):

    • BFS는 최단 경로를 찾는 알고리즘이 아니라, 모든 경로를 확인하기 위한 탐색 방법입니다. 무게가 없는 그래프에서 최단 경로를 보장할 수 있지만, 무게가 있는 그래프에서는 적합하지 않습니다.
    • FIFO(First In First Out) 방식의 큐를 사용하여 특정 지점에서 시작해 인접한 노드를 차례로 방문하며 탐색합니다.
  2. 다익스트라 알고리즘:

    • 다익스트라는 무게가 있는 그래프에서 최단 경로를 찾기 위해 설계된 알고리즘입니다.
    • 각 노드로의 최단 경로를 갱신하며 우선순위 큐를 사용해 탐색합니다. 무게가 있는 경로에서 가장 경제적인 경로를 찾습니다.
  3. A* 알고리즘:

    • A*는 다익스트라의 변형으로, 목표 지점까지의 거리 추정치를 고려하여 효율적으로 경로를 탐색합니다.
    • 다익스트라와 달리 휴리스틱을 사용해 목표에 가까워지는 경로를 우선적으로 탐색합니다. 이로 인해 계산 속도가 빨라질 수 있습니다.

이 차이로 인해, 구체적인 시나리오에 맞춰 적합한 알고리즘을 선택하는 것이 중요합니다. 일반적으로 BFS는 단순 무게 없는 그래프에서, 다익스트라는 무게가 있는 그래프에서, A*는 게임이나 로봇 탐색 등 목표 지점을 빠르게 찾아가는 상황에서 사용됩니다.

더 구체적인 이해를 위한 유사한 질문이 올라와 있으니, 참고하시면 더욱 좋을 것 같습니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

회사의 시스템 아키텍처를 포트폴리오에 써도 되나요?

1

40

2

REST API (Self-descriptive messages)

0

22

1

네트워크 전체 흐름 복습 질문

0

29

2

프로필 사진 세팅과 관련하여 질문 드립니다

1

47

2

시스템 엔지니어 관련 질문입니다.

0

50

2

구글 폼 작성 완료!

1

40

1

개발과 연관없는 경력 기입 여부

1

102

2

Replace함수 질문

0

83

2

closed list를 비교하는 부분이 궁금합니다.

0

119

1

부모가 2개 이상일경우 질문

0

172

2

sort함수 쓰려면 알고르즘헤더를 추가해야하는거 아닌가요?

0

187

2

빅오 표기법 2단계

0

329

1

list의 insert, erase에서 매개변수는 왜 iterator를 복사형으로 받나요?

0

290

1

Pop()함수에서 레퍼런스를 반환하지 않는 이유가 궁금합니다

0

386

3

iterator의 begin, end, insert, erase함수에서 iterator를 반환할 때 일어나는 현상이 궁금합니다

0

228

1

언리얼 part.4 는 안나오나요?

0

448

1

재귀함수 질문

0

464

1

클레스 템플릿 헤더파일 분리시 주의 사항이 있나요?

0

563

3

Pos operator< 어디서 사용하나요?

0

519

2

Disjoint Set 클래스 수정해도 괜찮나요?

0

470

1

A*알고리즘 작성과정에서 블록 안에서 초기화를 한 이유가 궁금합니다.

0

594

1

1강에서의 List와 자료구조편에서의 List의 차이가 뭘까요?

0

599

1

이진 탐색 트리 삭제 질문

0

701

1

해당 문제 유형을 수학적으로 표현 가능할까요?

0

508

1