Я разрабатываю программное обеспечение, которое соединяет объекты с проводами. Эта проводка имеет правило, что эти провода не могут проходить на других объектах, и диагональное перемещение не принимается. Эффективный алгоритм поиска пути, избегающий zigzag's
Все кратчайшие пути алгоритмы, которые я знаю (A *, Дейкстра и т.д.) найти этот тип путей:
Я не хочу ненужных зигзагов во втором скриншоте. Как достичь этой цели?
Примечание: Любой, кто хочет попробовать алгоритмы, может использовать приложение this.
Другое примечание: Это точная ситуация, в которой я не хочу. Он находит путь зигзага вместо того, чтобы «идти вправо, пока вы не достигнете позиции х цели, идите вверх, пока не достигнете позиции y цели», которая имеет одинаковую стоимость с зигзагообразным.
Я знаю, что A * всегда найдет эти шаблоны зигзага из-за эвристики, которую он использует, но способ справиться с этим - установить эвристику в сторону горизонтальных/вертикальных движений по диагонали. Я не видел вашего алгоритма для этого, но его не должно быть сложно реализовать. Это также может работать для Dijkstra, потому что оба алгоритма работают почти одинаково. – smac89
Возможно, вам удастся избежать этого с L1 (abs [x + y]) вместо L2 (sqrt [x² + y²]) в качестве эвристики. Если вы не можете шагнуть по диагонали, в любом случае это лучший эвристический подход. Но это всего лишь взломать, и работает ли он, зависит от того, как узлы выходят из очереди. –
@larsmans, что вы подразумеваете под L1, L2? – Alper