Я реализовал A * алгоритм поиска для поиска кратчайшего пути между двумя состояниями.Алгоритм использует хэш-карту для хранения наиболее известных расстояний для посещенных состояний.И одна хеш-карта для хранения дочерних и родительских отношений, необходимых для восстановления кратчайшего пути.
Здесь - код.Реализация алгоритма является общей (состояния должны быть только «хэшируемыми» и «сопоставимыми»), но в данном конкретном случае состояния являются парами (векторами) целых чисел [x y]
, и они представляют одну ячейку в данной карте высот (стоимость ) для перехода к соседней ячейке зависит от разницы высот).
Вопрос в том, можно ли улучшить производительность и как?Может быть, используя некоторые функции из 1.2 или более поздних версий, изменив логику реализации алгоритма (например, используя другой способ сохранения пути) или изменив представление состояния в этом конкретном случае?
Реализация Java запускается мгновенно для этой карты , а реализация Clojure занимает около 40 секунд.Конечно, для этого есть несколько естественных и очевидных причин: динамическая типизация, постоянные структуры данных, ненужный (не) бокс примитивных типов ...
Использование переходных процессов не имело большого значения.