Алгоритм, чтобы найти, что большинство эффективных перемещений прибывает в данную точку

(Это не точно проблема, которую я имею, но это изоморфно, и я думаю, что это объяснение будет самым легким для других понять.)

Предположим, что у меня есть ряд точек в 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).

Обновите w/Принятое Решение

Я принял решение, очень похожее на то, отмеченное ниже, как "принято". Я выполняю итерации по всем точкам и векторам и создаю список всех достижимых точек с маршрутами для достижения их. Я преобразовываю этот список в хеш <dest, p+vectors>, выбирая самый короткий набор векторов для каждого пункта назначения. (Существует также определенная оптимизация для размера хэша, который не релевантен здесь.) Последующие dest поиски происходят в постоянное время.

8
задан JSBձոգչ 25 January 2010 в 21:57
поделиться