Учитывая изображение и набор меток, прикрепленных к определенным точкам на изображении, я ищу алгоритм для выкладки меток по сторонам изображения с определенными ограничениями (примерно одинаковое количество меток на каждой стороне, метки примерно равноудалены, линии, соединяющие метки с соответствующими точками без пересечения линий).
Теперь приблизительное решение обычно можно найти довольно наивно, упорядочив метки по координате Y (точки, на которую они ссылаются), как в этом примере (только доказательство концепции, пожалуйста, игнорируйте точность или иные данные!).
Теперь, чтобы удовлетворить условию отсутствия пересечений, возникли некоторые идеи, которые пришли мне в голову:
- используйте генетический алгоритм, чтобы найти упорядочение меток без кроссоверов;
- использовать другой метод (например, алгоритм динамического программирования) для поиска такого упорядочения;
- используйте один из вышеперечисленных алгоритмов, позволяющий изменять интервалы, а также порядок, находить решение, которое минимизирует количество пересечений и варьирование от четного интервала;
- возможно, есть критерии, которые я могу использовать для грубого поиска через все возможные упорядочивания меток в определенных критериях (не переупорядочивайте две метки, если их расстояние больше X);
- Если все остальное не удается, попробуйте миллионы случайных упорядочений/смещений и возьмите тот, который дает минимальное изменение пересечений/интервалов. (Преимущество: прямое программирование и, вероятно, найдет достаточно хорошее решение, небольшой недостаток, хотя и не шоу-стоппер: возможно, он не сможет запустить его на лету во время приложения, чтобы пользователь мог изменить макет/размер изображения. )
Прежде чем я приступлю к одному из них, я просто приветствую некоторых других людей: кто-то еще сталкивается с подобной проблемой и имеет любую информацию, сообщающую об успехах/неудачах любого из вышеуказанных методов или если они имеют лучшее/более простое решение, которое не происходит со мной? Спасибо за ваш вклад!