Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Discrete report

Avatar for Quentin Quentin
May 04, 2018
120

Discrete report

Avatar for Quentin

Quentin

May 04, 2018

Transcript

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

    потока находят нетривиальное применение во многих областях. Роутинг пакетов в компьютерных сетях Логистика (контейнерные перевозки, погрузка грузовых судов, etc) Управление водными ресурсами Составление национальной энергетической политики 1
  2. Формальная постановка задачи Граф - это набор (V , E)

    вершин V и ребер E, то есть соединений между парами вершин. В ориентированном графе у каждого ребра есть направление. Во взвешенном графе каждому ребру приписано некторое число, называемое весом. Путь в графе - это последовательность вершин, в которой каждая вершина соединена со следующей ребром. 2
  3. Формальная постановка задачи Определим сеть как взвешенный ориентированный граф G

    = (V , E), где V - множество вершин, а E - ребер, и каждому ребру приписана неотрицательная пропускная способность и неотрицательная величина потока, не превышающая пропускную способность. В сети выделены две вершины - источник и сток, такие, что любая другая вершина лежит на пути из источника в сток. При этом сумма потоков в любую вершину, кроме источника и стока, равна сумме потоков из нее. 3
  4. Формальная постановка задачи Определение задачи: минимизировать общую стоимость потока a(u,

    v) ⋅ f(u, v) Где f(u, v) - поток из u в v, а a(u, v) - вес ребра из u в v при заданном потоке d таком, что f(u, v) = d (u,v)∈E ∑ (u,v)∈E ∑ 4
  5. Формальная постановка задачи Для поиска потока минимальной стоимости описано много

    алгоритмов Алгоритм Описание Out-of-kilter Поиск и сокращение дефектных ребер Симплекс-метод Симплекс-метод на сетях Сокращение циклов Поиск и сокращение отрицательных циклов в остаточной сети Модификации алгоритма Форда-Фалкерсона Поиск наименее затратного пути для потока 5
  6. Формальная постановка задачи Мы остановились на алгоритме сокращения циклов, так

    как он легко реализуем и хорошо поддается функциональной декомпозиции. Остаточная сеть - граф G = (V , E ), где E - множество ребер, где каждому ребру (u, v) ∈ E соответствует два ребра: (u, v) с пропускной способностью, равной разности пропускной способности (u, v) и потока в нем и ребро (v, u) с пропускной способностью, равной величине потока в (u, v) f f f ′ ′ 6
  7. Формальная постановка задачи С помощью алгоритма Эдмондса-Карпа проталкиваем необходимое количество

    потока Находим в остаточной сети отрицательные циклы Проталкиваем по ним поток в обратном направлении ??? PROFIT!!! 7
  8. Формальная постановка задачи Алгоритм Эдмондса-Карпа: Пока в остаточной сети есть

    путь из истока в сток Найти путь из истока в сток в остаточной сети поиском в ширину Протолкнуть по нему максимально возможный поток 8
  9. Пример кода: алгоритм Эдмондса- Карпа fun fill(desiredFlow: Double): Boolean {

    var remainingFlow = desiredFlow var path = this.bfs() while(path != null && remainingFlow >= 1e-100) { val pushableFlow = min(path.capacity, remainingFlow) path.pushFlow(pushableFlow) remainingFlow -= pushableFlow path = this.bfs() } return remainingFlow <= 1e-100 } 9
  10. Формальная постановка задачи Если удалось протолкнуть требуемую величину потока, используем

    алгоритм Беллмана-Форда, чтобы найти в остаточной сети отрицательные циклы. Инициализируем массив расстояний до каждой вершины +∞ ∣V ∣ − 1 раз обходим все дуги Если сумма длины дуги и расстояния до начала дуги меньше, чем предыдущее значение в массиве, обновляем его в массиве ("релаксируем") Если на ∣V ∣ итерации удалось релаксировать какое-то расстояние, в графе есть отрицательный цикл. 10
  11. Структуры данных и асимптотика Для представления графа в памяти используются

    списки смежности, так как связность сетей обычно мала Программа написана в объектно-ориентированной парадигме Основа программы - класс Graph , хранящий список вершин и рёбер для удобства итерации и поддерживающий некоторые дополнительные методы Ребра представлены классом Edge , в котором хранятся ссылки на начальную и конечную вершины и информация о пропускной способности, потоке и весе ребра Вершины представлены классом Node , в котором хранится список ссылок на входящие и исходящие ребра 11
  12. Структуры данных и асимптотика Класс Graph реализует метод fill(flow: Double)

    , использующий алгоритм Эдмондса-Карпа для проталкивания потока. Алгоритм Эдмондса-Карпа работает за O(∣V ∣ ∣E∣) и для решения данной задачи выполняется один раз Класс Graph также реализует метод optimizeFlow() , использующий алгоритм Беллмана-Форда для поиска отрицательных циклов в остаточной сети. Асимптотика алгоритма Беллмана-Форда - O(∣V ∣∣E∣) Асимптотика количества циклов в сети с нецелыми значениями веса и пропускной способности плохо поддаётся оценке, однако точно принадлежит O(2 27∣E∣) 2 1 12
  13. 13