Оптимизация последовательности точек

В задачах, связанных с картографией и маршрутизацией в HERE Maps API, последовательность точек определяет не только визуальное представление маршрута, но и итоговую эффективность вычислений, стоимость запроса к маршрутизатору и качество полученного пути. При работе с большими наборами координат (доставка, трекинг, мобильные сенсоры, геоаналитика) порядок точек становится критическим фактором.

Набор точек без оптимизации часто отражает фактический порядок поступления данных: время фиксации GPS, порядок загрузки из базы, случайная сортировка. Такой порядок редко совпадает с географически рациональным маршрутом, что приводит к:

  • избыточной длине пути
  • росту времени расчёта маршрута
  • увеличению количества поворотов и манёвров
  • перегрузке Routing API запросами
  • снижению качества ETA (Estimated Time of Arrival)

Оптимизация последовательности точек направлена на перестройку входного набора координат в структуру, минимизирующую целевую функцию: расстояние, время или стоимость перемещения.


Модель представления точек и граф маршрутизации

В рамках API HERE каждая точка маршрута рассматривается как вершина графа:

  • узел графа: координаты {lat, lng}
  • ребро графа: возможный маршрут между точками
  • вес ребра: расстояние, время или комбинированная метрика

Базовая модель:

[ G = (V, E)]

где:

  • ( V ) — множество точек
  • ( E ) — возможные переходы между ними

В реальных сценариях используется не полносвязный граф, а динамически вычисляемые ребра через Routing API или Matrix Routing API.


Типовые постановки задачи оптимизации порядка

Задача коммивояжёра (TSP)

Классическая формализация:

  • есть стартовая точка
  • необходимо посетить все точки ровно один раз
  • минимизировать суммарный путь

[ {i=1}^{n-1} d(p_i, p{i+1})]

В контексте HERE Maps API задача решается либо приближённо, либо через специализированные сервисы оптимизации маршрутов.


Многомаршрутная оптимизация (VRP)

Расширение TSP:

  • несколько транспортных средств
  • ограничения по грузу, времени, окнам доставки
  • распределение точек между маршрутами

Локальная оптимизация траектории

Используется при обработке GPS-треков:

  • удаление шумов
  • упорядочивание точек по времени и геометрии
  • сглаживание траектории

Базовые стратегии оптимизации порядка точек

Жадный алгоритм ближайшего соседа

Один из самых простых подходов:

  1. выбрать стартовую точку
  2. на каждом шаге переходить в ближайшую непосещённую точку
  3. повторять до завершения

Пример реализации с использованием JavaScript и Matrix Routing API:

const points = [
  { lat: 52.5200, lng: 13.4050 },
  { lat: 52.5206, lng: 13.4098 },
  { lat: 52.5155, lng: 13.3777 }
];

async function calculateMatrix(points) {
  const response = await fetch("https://matrix.router.hereapi.com/v8/matrix", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      "Authorization": `Bearer YOUR_API_KEY`
    },
    body: JSON.stringify({
      origins: points,
      destinations: points,
      regionDefinition: { type: "world" },
      routingMode: "fast",
      transportMode: "car"
    })
  });

  return response.json();
}

После получения матрицы расстояний применяется жадный выбор следующего узла:

function nearestNeighbor(matrix, startIndex) {
  const n = matrix.length;
  const visited = new Array(n).fill(false);
  const order = [startIndex];
  visited[startIndex] = true;

  for (let i = 0; i < n - 1; i++) {
    const last = order[order.length - 1];
    let next = -1;
    let best = Infinity;

    for (let j = 0; j < n; j++) {
      if (!visited[j] && matrix[last][j] < best) {
        best = matrix[last][j];
        next = j;
      }
    }

    visited[next] = true;
    order.push(next);
  }

  return order;
}

Оптимизация через перестановки (2-opt)

Алгоритм улучшения маршрута:

  • берётся текущий маршрут
  • выбираются два ребра
  • происходит их замена для уменьшения длины пути

[ (a, b), (c, d) (a, c), (b, d)]

Применение:

function twoOpt(route, dist) {
  let improved = true;

  while (improved) {
    improved = false;

    for (let i = 1; i < route.length - 2; i++) {
      for (let j = i + 1; j < route.length - 1; j++) {

        const a = route[i - 1];
        const b = route[i];
        const c = route[j];
        const d = route[j + 1];

        const current = dist[a][b] + dist[c][d];
        const swapped = dist[a][c] + dist[b][d];

        if (swapped < current) {
          route.splice(i, j - i + 1, ...route.slice(i, j + 1).reverse());
          improved = true;
        }
      }
    }
  }

  return route;
}

Использование Routing API для перестроения порядка

В HERE Maps API можно делегировать оптимизацию серверной части Routing API v8.

Пример запроса с оптимизацией waypoint’ов:

const url = "https://router.hereapi.com/v8/routes";

const params = new URLSearchParams({
  transportMode: "car",
  origin: "52.5200,13.4050",
  destination: "52.5300,13.3900",
  return: "polyline,summary",
  via: "52.5250,13.4100;52.5220,13.3950"
});

fetch(`${url}?${params.toString()}`, {
  headers: {
    "Authorization": "Bearer YOUR_API_KEY"
  }
});

Хотя Routing API сам по себе не выполняет полноценную перестановку множества точек, он используется как базовый инструмент оценки стоимости маршрута между перестановками.


Матрица расстояний как основа перестановки

Matrix Routing API позволяет получить попарные расстояния между всеми точками, что формирует основу для дальнейших алгоритмов оптимизации.

Пусть имеется набор точек:

[ P = {p_1, p_2, …, p_n}]

Матрица расстояний:

[ D[i][j] = cost(p_i p_j)]

Свойства:

  • асимметрия (дорога A→B ≠ B→A)
  • зависимость от транспорта
  • влияние дорожной сети

Кластеризация перед оптимизацией

При большом количестве точек (100+) прямая оптимизация становится вычислительно дорогой. Используется предварительная кластеризация:

Географическая кластеризация

  • k-means по координатам
  • grid-based partitioning
  • DBSCAN для плотных областей

После кластеризации:

  1. оптимизируется порядок кластеров
  2. внутри каждого кластера оптимизируется локальный маршрут

Минимизация пересечений и геометрическая коррекция

Неоптимальные маршруты часто содержат пересечения линий на карте. Их устранение повышает качество маршрута.

Критерии улучшения:

  • уменьшение числа пересечений
  • сокращение “петель”
  • повышение монотонности движения

Методы:

  • 2-opt
  • 3-opt (расширение перестановок)
  • эвристика углового отклонения

Учёт временных окон и ограничений

В реальных задачах оптимизация последовательности точек должна учитывать ограничения:

  • временные окна доставки
  • приоритеты точек
  • ограничения по пробегу
  • обязательные точки

Это приводит к модифицированной функции стоимости:

[ C = d + t + p]

где:

  • ( d ) — расстояние
  • ( t ) — время
  • ( p ) — штраф за нарушение ограничений

Использование Tour Planning API

Для сложных сценариев логистики в экосистеме HERE Maps API применяется специализированный сервис оптимизации маршрутов (Tour Planning API):

  • автоматическое распределение точек
  • глобальная оптимизация порядка
  • учёт ограничений транспорта
  • поддержка множественных депо

JavaScript-логика обычно строится вокруг:

  1. передачи списка stop points
  2. получения оптимизированных tours
  3. визуализации результата через HERE Maps JS SDK

Интеграция оптимизированного порядка в визуализацию карты

После вычисления порядка точки передаются в Polyline и Marker объекты.

const lineString = new H.geo.LineString();

optimizedRoute.forEach(point => {
  lineString.pushPoint(point);
});

const routeLine = new H.map.Polyline(lineString, {
  style: { strokeColor: 'blue', lineWidth: 4 }
});

map.addObject(routeLine);

Отображение порядка критически важно для:

  • валидации алгоритма
  • анализа аномалий маршрута
  • сравнения различных стратегий оптимизации

Сравнение стратегий оптимизации

Жадный алгоритм

  • быстрый
  • нестабильный результат
  • локально оптимальный

2-opt

  • значительно улучшает маршрут
  • средняя сложность
  • требует стартового решения

Серверная оптимизация (HERE APIs)

  • учитывает дорожную сеть
  • масштабируемость
  • поддержка ограничений

Масштабирование вычислений

При росте числа точек ключевым становится:

  • сокращение числа вызовов API
  • кэширование матриц расстояний
  • батчинг запросов
  • предобработка координат

Часто используется гибрид:

  1. локальная оптимизация (JS)
  2. глобальная оптимизация (сервер)
  3. финальное улучшение (2-opt)

Особенности работы с реальной дорожной сетью

Геометрическая близость точек не равна транспортной близости. В HERE Maps API учитываются:

  • односторонние дороги
  • пробки
  • ограничения скорости
  • дорожные события

Это приводит к необходимости использовать именно routing-based distance, а не Haversine формулу.


Практическая схема оптимизации последовательности

Типовой pipeline:

  1. загрузка точек
  2. фильтрация шумов
  3. построение матрицы расстояний
  4. первичная сортировка (nearest neighbor)
  5. улучшение (2-opt)
  6. серверная коррекция (опционально)
  7. визуализация результата

Такая многоуровневая схема обеспечивает баланс между скоростью и качеством маршрута в рамках HERE Maps API.