Однажды мне было дано задание написать программу для равномерного заполнения прямоугольной области "волнистой линией" - изогнутой линией, которая не пересекается. Моей первой попыткой было сгенерировать случайные точки внутри прямоугольника и попытаться найти их обход (не обязательно самый короткий). К сожалению, этот подход просто не сработал, и я отказался от него.
В конце концов я решил проблему:
Мой успешный метод не был связан с TSP, но для любопытных я суммирую его:
Начните с одного отрезка. Теперь цикл: если строка «слишком длинная», разделите ее на две части. Перемещайте каждую точку немного случайно, но заставляйте точки отталкивать друг друга. Завершите цикл, когда будет достигнут небольшой прогресс. Есть детали, но, надеюсь, вы поняли.
Конечно, это дает угловой путь (что было бы приемлемо), но углы легко превратить в гладкие дуги.
И да, я сохранил код.