Производительность поиска A *, реализованного в Clojure

Я реализовал алгоритм поиска A * для поиска кратчайшего пути между двумя состояниями. Алгоритм использует хэш-карту для хранения наиболее известных расстояний для посещенных состояний. И одна хэш-карта для хранения дочерних и родительских отношений, необходимых для восстановления кратчайшего пути.

Здесь - это код. Реализация алгоритма является общей (состояния должны быть только "хешируемыми" и "сопоставимыми"), но в этом конкретном случае состояния представляют собой пары (векторы) целых чисел [xy] , и они представляют одну ячейку в заданной карта высот ( стоимость перехода на соседнюю ячейку зависит от разницы высот).

Вопрос в том, можно ли повысить производительность и как? Возможно, используя некоторые функции из 1.2 или будущих версий, изменив логику реализации алгоритма (например, использование другого способа хранения пути) или изменение представления состояния в данном конкретном случае?

Реализация Java выполняется мгновенно для , эта карта и реализация Clojure занимает около 40 секунд. Конечно, для этого есть несколько естественных и очевидных причин: динамическая типизация, постоянные структуры данных, ненужная (не) упаковка примитивных типов ...

Использование переходных процессов не имело большого значения.

6
задан JoeCamel 9 September 2010 в 07:38
поделиться