Итак, я искал объяснение улучшения с двумя вариантами решения проблемы коммивояжера, и я понял его суть, но я не понимаю одной вещи.
Я понимаю, что ЕСЛИ два края сгенерированного пути пересекаются друг с другом, я могу просто переключить две точки, и они больше не будут пересекаться. ОДНАКО - я не понимаю, как я могу определить, пересекаются ли два ребра.
Чтобы прояснить мой вопрос, вот что я сделал до сих пор: (я делал это на java)
- У меня есть объект под названием
Point
, который представляет город с координатами x и y. - У меня есть
PointSet
, в котором есть наборPoints
, содержащихся вList
. - У меня есть метод для
PointSet
, называемыйcomputeByNN()
, который довольно быстро упорядочивает PointSet с помощью алгоритма ближайшего соседа.
Итак, теперь у меня есть отсортированный PointSet (не оптимальный, но все же короткий), и я хочу сделать для него 2 варианта. Однако я не знаю, с чего начать. Должен ли я проверять каждый сегмент линии, чтобы увидеть, пересекаются ли они, и если да, то поменять местами две точки? Я чувствую, что это противоречит цели эвристики и становится своего рода решением грубой силы. Есть ли эффективный способ определить, пересекаются ли два сегмента маршрута?
Я аплодирую, если мой вопрос не ясен. Попробую отредактировать, чтобы было понятнее, если кому-нибудь понадобится.
O(n²)
. Совершенно разумное время работы при аппроксимации NP-полной задачи (которая, очевидно, не имеет известного точного решения за полиномиальное время). - person Paul   schedule 06.09.2013