Какой узел выбрать в качестве начального для алгоритма ближайшего соседа

http://en.wikipedia.org/wiki/Nearest_neighbour_algorithm

Я использую алгоритм ближайшего соседа для решения задачи коммивояжера. Это очень быстро, но не точно. Я где-то читал о двух улучшениях, которые я мог бы сделать. Первый - вместо того, чтобы начинать с одной случайной точки, запустить алгоритм ближайшего соседа, начиная с каждого узла. (Так, если есть N узлов, ближайший сосед запускается N раз) Затем сравните и выберите маршрут с наименьшим общим расстоянием. Это будет намного точнее. Но это слишком медленно.

Другой метод - вместо случайного выбора начального узла выберите специальный. Затем по-прежнему запускайте ближайшего соседа только один раз, чтобы получить результат. Это будет не так точно, как описанный выше метод, но определенно намного быстрее, поскольку алгоритм запускается только один раз, как и раньше. Но, к сожалению, я не мог вспомнить, где я читал эту статью и критерии выбора этого начального узла.

Я предполагаю, что я должен получить общее расстояние между каждым узлом и другими узлами, тогда узел, который имеет наибольшее значение, должен быть выбран в качестве начального узла. (По моим словам, это выбор узла, который «наиболее удален» от графа, при этом избегая выбора узла, который находится рядом с центром графа). Я думаю, что таким образом полученный мной маршрут должен быть достаточно близок к оптимальному кратчайшему маршруту.

Я правильно думаю?

Изменить: я имею дело с метрическим TSP с евклидовым расстоянием.


person Arch1tect    schedule 22.04.2013    source источник
comment
почему голосование против этого вопроса ...   -  person Arch1tect    schedule 22.04.2013
comment
Используете ли вы один из особых случаев TSP или просто таблицу расстояний?   -  person Nuclearman    schedule 23.04.2013
comment
@MC Метрическая TSP с евклидовым расстоянием ..   -  person Arch1tect    schedule 23.04.2013


Ответы (2)


Похоже, вам, вероятно, следует просто запустить алгоритм K-NN с несколькими начальными узлами, например O (log N), что будет стоить всего O (K * N * log (N)). Выберите лучший тур, а затем используйте эвристику его улучшения: 2 opt или 2.5 opt с ограничение на количество ходов или просто ограничение по времени.

Это должно обеспечить лучший баланс времени и точности, если, возможно, вы не начнете смотреть на k-opt или v -opt алгоритмы. Хотя, похоже, у тебя нет на них времени.

person Nuclearman    schedule 23.04.2013

Вы также можете кэшировать каждый раз, когда делаете ближайшего соседа. Еще лучше, если вы сделаете K ближайших соседей. Вот как это может работать:

  1. Для каждого узла найдите K ближайших соседей. Сохраните его в кеше.
  2. Всякий раз, когда вам нужно выполнить ближайшего соседа, сначала проверьте кеш. В противном случае выполнить ближайшего соседа и добавить его в кеш.
person ElKamina    schedule 22.04.2013