Я застрял в течение последних 4 дней в алгоритме. Я работаю над игрой типа Mahjong Safari (http://www.pogo.com/games/mahjongsafari), и я хочу разработать путь между двумя плитами с наименьшим количеством фрагментов.Путь с наименьшими оборотами в алгоритме прямоугольной сетки
Я уже применил алгоритм A * с Manhattan Hueristic, но это порождает кратчайший путь с большим количеством поворотов. Нет необходимости в кратчайшем пути, мне нужен только путь с минимальными оборотами (желательно 2). Ниже приведена картинка из игры Mahjong Safari, которая генерирует путь между двумя плитами. Вы заметите, что путь от A до B и путь от B до A различны.
Пожалуйста, помогите мне, в любом коде или любого имени алгоритма или любой логики вы думаете, могли бы работать.
EDIT: Решение я применил для этого:
Я использовал подлинный A * алгоритм первой, чтобы найти кратчайший путь, и я использовал Манхэттен расстояние в качестве оценки эвристической цели. Для того, чтобы выправить путь больше, и выбирать путь с наименьшим числом витков, я использовал следующие тактику в каждой итерации:
Tile first = currentNode.parent;
Tile curr = currentNode;
Tile last = successorOfCurrentNode;
if (first != null)
{
if ((first.X == curr.X && first.Y != curr.Y) && (curr.Y == last.Y && curr.X != last.X))
{
// We got turn
currentNode.Cost += 10;
currentNode.calcuateTotalCost();
successorOfCurrentNode.Cost += 5;
successorOfCurrentNode.calcuateTotalCost();
}
else if ((first.X != curr.X && first.Y == curr.Y) && (curr.X == last.X && curr.Y != last.Y))
{
// We got turn
currentNode.Cost += 10;
currentNode.calcuateTotalCost();
successorOfCurrentNode.Cost += 5;
successorOfCurrentNode.calcuateTotalCost();
}
}
Это не вопрос программирования. Вероятно, вы должны опубликовать этот вопрос в [http://math.stackexchange.com/](http://math.stackexchange.com/) –
Вы можете попробовать добавить стоимость перевода к эвристике. Также см. [Этот пост] (http://stackoverflow.com/q/10329005/21727). – mbeckish
@mbeckish Вы правы насчет стоимости, я попробую. – GamyGuru