Astar open 배열에 관하여 질문있습니다.
항상 좋은 강의 잘 듣고 있습니다.
다름이 아니라 Astar 알고리즘에 대해서 복습하던 중 궁금한 점이 생겨 질문드리게 되었습니다.
Astar 알고리즘에서 open 배열과 우선순위 큐를 사용하셨는데, 우선순위 큐를 사용하면 open 배열 없이도 구현할 수 있지 않나요?
조금 코드를 변형시켜 open 배열 없이
다음과 같이 구현해 보았습니다.
open배열을 사용하는것에 대한 장점이 따로 있을까요?
void AStar()
{
// U L D R UL DL DR UR
int[] deltaY = new int[] { -1, 0, 1, 0, -1, 1, 1, -1 };
int[] deltaX = new int[] { 0, -1, 0, 1, -1, -1, 1, 1 };
int[] cost = new int[] { 10, 10, 10, 10, 14, 14, 14, 14 };
bool[,] closed = new bool[_board.Size,_board.Size];
// 삭제
//int[,] open = new int[_board.Size, _board.Size]; // OpenList
//for (int y = 0; y < _board.Size; y++)
// for (int x = 0; x < _board.Size; x++)
// open[y, x] = Int32.MaxValue;
Pos[,] parent = new Pos[_board.Size, _board.Size];
PriorityQueue<PQNode> pq = new PriorityQueue<PQNode>();
//open[PosY, PosX] = 10 * (Math.Abs(_board.DestY - PosY) + Math.Abs(_board.DestX - PosX));
//PQNode에 parent 추가
pq.Push(new PQNode() { F = 10 * (Math.Abs(_board.DestY - PosY) + Math.Abs(_board.DestX - PosX)), G = 0, Y = PosY, X = PosX, parent= new Pos(PosY, PosX)});
while (pq.Count > 0)
{
PQNode node = pq.Pop();
if (closed[node.Y, node.X])
continue;
closed[node.Y, node.X] = true;
//추가
parent[node.Y, node.X] = node.parent;
if (node.Y == _board.DestY && node.X == _board.DestX)
break;
for (int i = 0; i < deltaY.Length; i++)
{
int nextY = node.Y + deltaY[i];
int nextX = node.X + deltaX[i];
if (nextY < 0 || nextY >= _board.Size || nextX < 0 || nextX >= _board.Size)
continue;
if (_board.Tile[nextY, nextX] == Board.TileType.Wall)
continue;
if (closed[nextY, nextX])
continue;
int g = node.G + cost[i];
int h = 10 * (Math.Abs(_board.DestY - nextY) + Math.Abs(_board.DestX - nextX));
//삭제
//if (open[nextY, nextX] < g + h)
// continue;
//삭제
//open[nextY, nextX] = g + h;
pq.Push(new PQNode() { F = g + h, G = g, Y = nextY, X = nextX, parent = new Pos(node.Y, node.X) }); //parent 추가
}
}
CalcPathFromParent(parent);
}
읽어주셔서 감사합니다.
답변 1
1
네 예리하게 분석하셨는데 PriorityQueue가 openList를 겸하게 할 수도 있습니다.
로직이 미세하게 달라지는데 결과적으로는 어차피
closed 배열을 확인하니 중복해서 같은 점을 2번 체크하진 않긴 합니다.
경우에 따라 PQ에 넣기 전에 open 배열을 먼저
체크해서 걸러주는 것이 성능에 유리할 수도 있긴 합니다.
게임개발에서 주로 어느부분에 알고리즘들이 쓰이는지 궁금합니다
0
201
2
글꼴 바꿔도 자간이 좁아 찌그러져보이시는 분들
0
98
1
NullReferenceException 예외) 같은 실수하시는분 계실까봐 남겨요
0
81
1
parent를 Pos타입으로 만든 이유
0
81
1
콘솔창에 격자가 안나옴 미로 생성 X
0
145
1
격자 생성 안됨 무한루프
0
119
1
BFS 질문
0
149
2
격자 무한 출력
0
176
2
A* 의 PriorityQueue 관련 질문입니다
0
161
2
vscode에서 원그리기
0
186
1
환결설정 강의 원 그리기
0
130
1
15-17분
0
93
1
3:16초에 근데 이렇게 해가지고 부분에 "{}"를 만들어서 자식 node들을 생성하던데 왜 중괄호로 감싸게 만드는 건가요?
0
145
2
동적 배열 관련 질문입니다!
0
215
1
Big-o 표기법에서 시간 복잡도
0
171
1
7:40에서 언급하신 색상이 날아가는 문제 이해를 못하겠습니다
0
156
1
트리구현연습 강의 질문있어요
0
148
1
창은 뜨는데 맵이 나타나지 않아요.
0
184
1
Ctrl F5 하면 나오는 창은 어디서 설정할까요??
0
284
1
void CalcPathFromParent(Pos[,] parent)에 대해서
0
207
2
NullReferenceException예외가 발생했을때 어떻게 해야하나요?
0
234
1
[해결] 환경설정 강의에서 원이 이상하게 그려지는 문제
3
322
2
오른손 법칙에서 플레이어 점이 안 움직입니다
0
257
2
맵 만들기 오류
0
184
1





