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

Веб приложение по планированию маршрутов.
_________________________________________________
Отображение
_________________________________________________
Для отображения элементов интерфейса используется фреймворк 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.