나는 A * 검색 알고리즘의 구현을 작성했다. 문제는 내가 현재 사용하고있는 휴리스틱은 정사각형 그리드에서만 정확하게 작동한다는 것입니다. 내지도가 등각 투영이므로, 휴리스틱은 실제로 지도의 레이아웃을 고려하지 않으므로 셀 사이의 거리가됩니다.아이소 메트릭 맵을위한 정확한 A * 검색 휴리스틱?
업데이트 : 광범위한 로깅 및 분석 후은 (시간의 지출을 많이는 진부함을 알아 내려고 노력으로 읽기), 내 현재 발견 한 작은 제외하고는 아주 잘 작동 결론에 도달 한 다음 실제 직선 및 대각선 이동의 경우 최종 결과가 반전됩니다.
inline int Pathfinder::calculateDistanceEstimate(const CellCoord& coord) const
{
int diagonal = std::min(abs(coord.x-goal->position.x), abs(coord.y-goal->position.y));
int straight = (abs(coord.x-goal->position.x) + abs(coord.y-goal->position.y));
return 14 * diagonal + 10 * (straight - 2 * diagonal);
}
이 정말 아이소지도 대각선 움직임보다 sqrt(2)
배 비용 직선 이동이, 하나의 대각선의 저로 계산되는 것을 의미한다. 문제는 현재의 휴리스틱을 수정하여 등각 투영 레이아웃에 대한 정확한 결과를 얻을 수있는 방법은 무엇입니까? 단순히 diagonal
을 straight
으로 바꾸거나 그 반대의 경우는 이 아니며이 작동합니다. 정사각형 격자로 등각 투영 좌표로 변환 될 것이다 시도
당신은 휴리스틱을 복구하려고합니다. 휴리스틱과 관련된 코드를 게시 할 수 있습니까? 아니면 솔루션을 결정할 수있는 충분한 코드? – CoderTao
휴리스틱 스 ... 픽셀 기반입니까? 맨하탄 거리는 정사각형 격자지도에서 일반적이며 등각 투영으로 쉽게 변환 할 수 있어야합니다. 어쨌든 정사각형 매트릭스에지도를 저장하는 것이 좋습니다. 그럼에도 불구하고 현재의 휴리스틱이 어떻게 작동하는지,지도를 내부적으로 표현하는 방법에 대한 힌트를 게시하면 매우 유용 할 것입니다. 내 생각에 CoderTao는 자신의 대답에서 올바른 생각을 가지고 있지만, 나는 그의 제안이 완전한 다시 쓰기를 요구하는 이유에 관해서도 혼란 스럽다. – agorenst
내 휴리스틱은 픽셀 기반이 아니며 맵이 정사각형 매트릭스에 저장되지 않으므로 다시 작성됩니다. 지도는 정사각형 행렬에 저장됩니다 (예 : 다이아몬드 모양. 지도는 직사각형으로 투영됩니다. – Electro