You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

68 lines
6.6 KiB

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

Веб приложение по планированию маршрутов.
_________________________________________________
Отображение
_________________________________________________
Для отображения элементов интерфейса используется фреймворк devextreme, в частности используются следующие элементы:
- карта
https://js.devexpress.com/jQuery/Demos/WidgetsGallery/Demo/Map/ProvidersAndTypes/MaterialBlueLight/
- кнопка
https://js.devexpress.com/jQuery/Demos/WidgetsGallery/Demo/Button/PredefinedTypes/MaterialBlueLight/
- списки
https://js.devexpress.com/jQuery/Demos/WidgetsGallery/Demo/List/ListSelection/MaterialBlueLight/
- выпадающий список
https://js.devexpress.com/jQuery/Demos/WidgetsGallery/Demo/DropDownButton/Overview/MaterialBlueLight/
Для указанных элементов и сайта используются стили из этого же фреймворка: dx.material.blue.dark.compact.css
Также из сторонних библиотек используется jquery, для обращения к элементам страницы, и создания новых элементов.
Собственные стили находятся в файле css/styles.css.
Данные по точкам доступным для посещения хранятся в файле js/data.js
_________________________________________________
Логика работы
_________________________________________________
Все функции находятся в файле js/index.js
При входе на страницу отобажается карта со всеми доступными для расчета порядка посещения точками.
Пользователь, в первую очередь, выбирает регион посещения, из списка под картой.
При выборе региона будут отображены точки для посещения в данном регионе в виде списка с возможности выбирать элемента,
а карта отобразит только точки выбранного региона.
На следующем шаге пользователь отбирает интересующие точки в списке, при выборе будет формироваться новый список в правой части страницы,
который содержит выбранные элементы.
По окончании отбора точек, пользователь нажимает кнопку Рассчитать маршрут. После чего под кнопкой отобразится найденный маршрут с относительно оптимальной длиной пути.
Маршрут отображается в виде списка точек посещения, между которыми отображается расстояние. В конце списка отображается общая длина маршрута.
_________________________________________________
Алгоритм построения маршрута
_________________________________________________
Для расчета расстояния между точек, используется метод calculateDistance из библиотеки
https://github.com/chrisveness/geodesy
Которая позволяет определить дистанцию между двумя точками заданными координатами в виде широты и долготы.
Для построения оптимального маршрута используется следующий подход:
1. Если точек три или меньше, выводятся в порядке заданном пользователем (старт, промежуточная точка, окончание маршрута)
2. Если точек больше трех, то используется метод stochasticPathFind:
2.1 Вычисляется количество комбинаций точек, как факториал общего количества точек за минусом двух (начало и окончание маршрута)
2.2 Если количество комбинаций превышает допустимое (300.000), то используется максимально допустимое количество комбинаций
2.3 Перебираются возможные комбинации, каждая новая комбинация формируется случайным перемешиванием точек маршрута, кроме начальной и конечной
2.4 Для каждой комбинации вычисляется общая длина пути, если найденная длина меньше предыдущей минимальной, запоминается длина маршрута и комбинация
2.5 Метод возвращает маршрут с минимальной найденной длиной пути.
Для точек количеством менее 10, будут перебраны все доступные комбинации (10 - 2)! < 300.000, для 11 будут перебраны почти все комбинации (11 - 2)! = 362 880
Для большего числа точек будет выбран лучший из перебранных маршрутов, но не лучший из всех возможных.
Данный подход был выбран после попыток использовать построение Гамильтонова пути (https://ru.wikipedia.org/wiki/%D0%93%D0%B0%D0%BC%D0%B8%D0%BB%D1%8C%D1%82%D0%BE%D0%BD%D0%BE%D0%B2_%D0%B3%D1%80%D0%B0%D1%84)
и нескольких других алгоритмов на графах. Попытки использовать данные алгоритмы показали что для большого числа точек (>9), временные затраты на поиск и нагрузка на браузер, процессор и память, превышают разумные границы. Вследствие чего было принято решение использовать простой перебор, и ограничить количество анализируемых маршрутов в 300.000 комбинаций.

Powered by TurnKey Linux.