(Это не совсем та проблема, которая у меня есть, но она изоморфна, и я думаю, что это объяснение будет легче понять другим.)
Предположим, что у меня есть множество точек в n -мерном пространстве. Используя 3 измерения, например:
A : [1,2,3]
B : [4,5,6]
C : [7,8,9]
У меня также есть набор векторов, которые описывают возможные движения в этом пространстве:
V1 : [+1,0,-1]
V2 : [+2,0,0]
Теперь, учитывая точку dest , мне нужно найти начальную точку p и набор векторов движений , которые приведут меня к dest самым эффективным способом. Эффективность определяется как «наименьшее количество ходов», а не обязательно «наименьшее линейное расстояние»: допустимо выбрать p , что дальше от dest , чем другие кандидаты, если набор ходов такой что вы можете добраться туда за меньшее количество ходов. Векторы в движениях должны быть строгим подмножеством доступных векторов; вы не можете использовать один и тот же вектор более одного раза, если только он не появится более одного раза во входном наборе.
Мой вход содержит ~ 100 начальных точек и, возможно, ~ 10 векторов, а мое число измерений ~ 20. Начальные точки и доступные векторы будут фиксироваться на протяжении всего жизненного цикла приложения, но я буду искать пути для множества различных dest точек. Я хочу оптимизировать скорость, а не память. Приемлемо, что алгоритм потерпит неудачу (не найти возможных путей к dest ).
Обновление с принятым решением
Я принял решение, очень похожее на помеченное ниже как «принятое». Я перебираю все точки и векторы и строю список всех достижимых точек с маршрутами их достижения. Я преобразую этот список в хеш <<em> dest , p + vectors >, выбирая кратчайший набор векторов для каждой точки назначения. (Также есть небольшая оптимизация для размера хеша, которая здесь не актуальна.) Последующие dest поиски происходят в постоянное время.