окт.2017. кратчайший путь от каждого к каждому узлу….

Алгоритм Дейкстры 1959 года — самый известный, а может быть, и самый быстрый; позвольте мне представить еще один алгоритм.

2 вида проблем.

пусть это будет ориентированный граф, ребра которого оценены.

первая задача: найдите кратчайшее расстояние от узла A до узла B. Answer=9
Алгоритм Роя относится к этому типу.

еще одна проблема: дайте мне кратчайший путь от узла А к узлу Б.
Ответ=А-У-В-В-Б. Алгоритм Дейкстры относится к этому типу.
Конечно, знание A-U-V-W-B позволяет рассчитать точное значение расстояния путем сложения значений ребер AU, UV, VW и WB.

Алгоритм Роя, 1959 г., для каждого кратчайшего расстояния (задача первого рода).

Впервые я прочитал объяснение Роя — Рой, Бернар (1959). Transitivité et connexité. К. Р. акад. науч. Париж. 249: 216–218, всего 3 страницы — я был полностью сбит с толку. Так что не бойтесь, время на вашей стороне. Я даю вам расшифровку этого алгоритма в псевдо-Python-коде.

Довольно просто, не так ли?
Строки 0–20 являются инициализациями.
* несуществующие изгороди обнуляются до «бесконечности»
* главная диагональ обнуляется, потому что расстояние между i и i равно нулю.

строка 21 — это начало алгоритма Роя. Этот алгоритм представляет собой простой цикл с индексом «i».

Строки 24–37 являются «i-преобразованием» матрицы dist. Объяснение «i-преобразования» дано ниже.

Математика расстояний.

Этот алгоритм работает по 8 правилам:

мы манипулируем набором чисел с характеристиками:
*законом сложения
**с нейтральным элементом (нулем),
**ассоциативно слева и справа,
*отношение порядка
** ноль меньше любого числа
** бесконечность является поглощающим элементом, больше любого другого числа
** бесконечность+бесконечность=бесконечность
** бесконечность+ноль=бесконечность
** бесконечность+x=бесконечность
* треугольное неравенство dist(hi)+dist(ik)≥dist(hk)

«Я-трансформация» Роя, определение.

Пусть A — матрица расстояний ориентированного графа.

Пусть я вершина.

«I-преобразование» Роя, называемое TI, представляет собой преобразование матрицы A, например:

B — матрица той же размерности, что и A.
TI( A )=B
Bhk = Ahk, если Ahi+Aik≤Ahk
иначе: Bhk = Ahi+Aik
A small визуализация:

Если набор вершин равен {h, i, j, k, l,…. w,x,y,z}
набор преобразований {TH,TI,…..TW,TX,TY,TZ}, конечно.
Вы можете комбинировать преобразования, например
TZ( TW ( A )) = новая матрица.

«Я-преобразования» Роя, всего 2 свойства.

  1. I-преобразование является идемпотентным,то есть
    ( TI )² = (TI)
    посмотрите на алгоритм:
    «# начало алгоритма
    для i в вершинах:
    ….# начало I-преобразования *******
    …. etc….»
    Вы видите только один цикл «для i в вершинах:», потому что нет необходимости делать еще раз то же самое преобразование с тем же «i»
  2. комбинация двух преобразований является коммутативной,
    TZ( TW ( A )) = TW( TZ ( A )),
  3. поэтому в псевдокоде меня не волнует порядок «i s» в списке «вершин». Следовательно, строка 3 «vertices = (из input_matrix, извлечь список вершин)» достаточно неточна, чтобы можно было построить неупорядоченный список вершин.
    примечание: демонстрация Роя этой коммутативности коротка, но очень сложна, я не буду ее объяснять. в этом посте.
  4. * бонус. Хитроумный трюк: я всегда работаю с одной и той же матрицей dist, меняя только одну ячейку внутри тройного цикла i h k, потому что промежуточные состояния dist не сохраняются. Это не уловка Роя!
  5. * бонус. И последний фокус: обратите внимание на 3 цикла с упорядоченными индексами i,h,k.
    это не h,i,k! «i» — это индекс I-преобразования, .
    «h» и «k» — просто исчерпывающий перечень пар узлов внутри области действия одного I-преобразования.

Связность графа, кратчайшее расстояние, кратчайший путь.

Простое соединение.

Чтобы быть правдой, позвольте мне сказать, что статья Роя 1959 года
Рой, Бернар (1959). Transitivité et connexité. К. Р. акад. науч. Paris — речь шла только о связности в графе, матрица A состоит только из 0/1,

Aij = 0 означает, что i и j не связаны
Aij = 1 означает, что между i и j существует хотя бы один путь,
1 — нейтральный элемент, 0 — поглощающий элемент,
и 0+1=0; 1+1=1; 1+0=0; 0+0=0, конечно.
Бернар Рой — французский математик, см. https://fr.wikipedia.org/wiki/Bernard_Roy

Кратчайшие расстояния.

Приведенная выше псевдопрограмма вычисляет только матрицу расстояний, а не описание путей. Она относится к первому типу проблем. Некоторые называют его алгоритмом Флойда-Уоршалла, 1962 г., см. https://en.wikipedia.org/wiki/Floyd%E2%80%93Warshall_algorithm.

Мне больше нравится «алгоритм Роя-Флойда-Уоршалла».

Сложность этого алгоритма равна n**3 из-за тройного цикла i,h,k; n — количество вершин.

Кратчайшие пути.

Это второй тип проблем. Если вам нужен не только массив кратчайших расстояний, но и описание путей, вы можете воспользоваться техникой реконструкции пути, описанной в
https://en.wikipedia.org/ wiki/Floyd%E2%80%93Warshall_algorithm

Отличие от алгоритма Джикстры только в точке «h» отправления. Раньше Джикстра работал с одним узлом отправления.
Таким образом, алгоритм Роя-Флойда-Уоршалла равен n алгоритмам Джикстры.

Дальнейшие алгоритмы.

Понятия

  • И-Трансформации
  • и тройной петли Роя
  • может использоваться для вычисления многих других вещей в графе, например, компонентов соединения, даже самых длинных путей! С множеством адаптаций, но это уже другая история.