Веб приложение по планированию маршрутов.

_________________________________________________

Отображение
_________________________________________________

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