Я написал реализацию алгоритма поиска A *. Проблема в том, что эвристика, которую я сейчас использую, работает точно на квадратных сетках. Поскольку моя карта изометрична, эвристика не учитывает фактический расположение карты и, следовательно, расстояние между ячейками.Точный A * поиск эвристический для изометрических карт?
Update: После обширного каротажа и анализа (читается как тратит много времени, пытаясь выяснить банальность), я пришел к выводу, что моя нынешняя эвристика работает довольно хорошо, но с одним небольшим исключением: конечный результат отменяется для real прямое и диагональное движение.
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