Клуб API Карт

Построение оптимального маршрута

Пост в архиве.

Задача такая: имеется массив адресов (размер массива может быть разным), надо отобразить на карте маршрут (более-менее) оптимального проезда по этим адресам. Возможно ли такое реализовать?
По идее, для этого нужно в цикле создавать YMaps.Router с двумя адресами, брать их протяженности, а дальше сравнивать...
Пробовал делать примерно так:

for (var i=0; i<adresses.length; i++) {

    var distances = new Array(

    for (var j=i+1; j<adresses.length; j++) {

        if (i!=j) {

            var routerTemp = new YMaps.Router(

                [adresses[i], adresses[j]],[]

                                 

            distances[j-1] = routerTemp.getDistance(        

        }

    }

}

Однако в этом случае элементы массива distances получаются unassigned. Я так понял, это потому, что getDistance можно делать только в YMaps.Events.observe для соответствующего маршрутизатора. Но как это сделать, когда колличество маршрутизаторов может быть разным? Посоветуйте, пожалуйста, как лучше всего сделать в таком случае.

2 комментария
Sergey Konstantinov
28 января 2016, 05:14

Ваш код не работает, потому что Router отвечает асинхронно - вам нужно дождаться события Success и только тогда брать getDistance и слать следующий запрос.

А вообще, Ваша задача известна как "Задача коммивояжера".

Спасибо за ответ!

Подскажите пожалуйста, как правильно организовать обработчики событий Success для нескольких динамически созданых роутеров, чтобы можно получить getDistance каждого их них.

Пробую так, не получается, все равно все значения distances получаются unasigned:

var distances = new Array() ;

function calculate(i,r) {

                distances[i] = r.getDistance() ;

}

function makeRoute() {

for (var i=0; i

    for (var j=i+1; j

        if (i!=j) {

            var routerTemp[i] = new YMaps.Router(

                [adresses[i], adresses[j]],[]

           ) ;                      

            events[i] = YMaps.Events.observe(routerTemp[i], routerTemp[i].Events.Success, calculate(i, routerTemp[i])) ;

}   }   }