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

САКОД – 2 курс весна 2021 – 6.2 занятие

САКОД – 2 курс весна 2021 – 6.2 занятие

F21d69109b1c03921abf7d12f0fb6654?s=128

ТиМПИ

March 30, 2021
Tweet

Transcript

  1. Алгоритмы нахождения на графах кратчайших путей 30 марта 2021 aok@dscs.pro,

    mva@dscs.pro Анастасия Олеговна Хлобыстова, Максим Викторович Абрамов
  2. 2/13 • Картографические сервисы • Недетерминированная машина • Приложения социальных

    сетей • Телефонная сеть • Протоколы маршрутизации • Программа полетов • Роботизированные системы • И др. А зачем?
  3. 3/13 Постановка задачи

  4. 4/13 const int INF = 1e+9; vector<pair<int,int>> g[LIM]; // в

    g[u]: dist(u,v), вершина v void shortcut(int u) { fill(dist, dist + n, INF); dist[u] = 0; p[u] = u; queue<int> q; q.push(u); while (!q.empty()) { u = q.front(); q.pop(); for (int i = 0; i < (int) g[u].size(); i++) { int v = g[u][i].second, len = g[u][i].first; if (dist[v] > dist[u] + len) { p[v] = u; dist[v] = dist[u] + len; q.push(v); } } } } Поиск кратчайших путей
  5. 5/13 const int INF = 1e+9; vector<pair<int,int>> g[LIM]; void shortcut(int

    u) { fill(dist, dist + n, INF); dist[u] = 0; p[u] = u; queue<int> q; q.push(u); while (!q.empty()) { u = q.front(); q.pop(); for (int i = 0; i < (int) g[u].size(); i++) { int v = g[u][i].second, len = g[u][i].first; if (dist[v] > dist[u] + len) { p[v] = u; dist[v] = dist[u] + len; q.push(v); } } } } const int INF = 1e+9; vector<pair<int,int>> g[LIM]; bool inque[LIM]; void shortcut(int u) { fill(dist, dist + n, INF); dist[u] = 0; p[u] = u; queue<int> q; q.push(u); inque[u] = true; while (!q.empty()) { u = q.front(); q.pop(); inque[u] = false; for (int i = 0; i < (int) g[u].size(); i++) { int v = g[u][i].second, len = g[u][i].first; if (dist[v] > dist[u] + len) { p[v] = u; dist[v] = dist[u] + len; if (!inque[v]) { q.push(v); inque[v] = true; } }}}} Поиск кратчайших путей
  6. 6/13 void dijkstra(int u1) { fill(dist, dist + n, INF);

    dist[u1] = 0; p[u1] = u1; priority_queue<pair<int,int>,vector<pair<int,int>>, greater<pair<int,int>>> q; q.push(make_pair(0, u1)); while (!q.empty()) { pair<int, int> u = q.top(); q.pop(); if (u.first > dist[u.second]) continue; for (int i = 0; i < (int) g[u.second].size(); i++) { int v = g[u.second][i].second, len = g[u.second][i].first; if (dist[v] > dist[u.second] + len) { p[v] = u.second; dist[v] = dist[u.second] + len; q.push(make_pair(dist[v], v)); } } } } Будем уменьшать путь из той вершины, до которой он сейчас минимальный. Алгоритм Дейкстры
  7. 7/13 Примеры задания графа игровой карты для применения поиска пути

    алгоритму A* • эвристический подход к увеличению скорости алгоритма Дейкстры • алгоритм поиска по первому лучшему совпадению, но при выборе вершины учитывается весь пройденный до неё путь • f(x) = g(x) + h(x) A*
  8. 8/13 Сравнение алгоритмов

  9. 9/13 for (int i = 0; i < E; i++)

    { int u = graph->edge[i].src; int v = graph->edge[i].dest; int weight = graph->edge[i].weight; if (dist[u] != INT_MAX && dist[u] + weight < dist[v]) { printf("Граф содержит цикл отрицательного веса"); return; } } printArr(dist, V); return; } void BellmanFord(struct Graph* graph, int src) { int V = graph->V; int E = graph->E; int dist[V]; for (int i = 0; i < V; i++) dist[i] = INT_MAX; dist[src] = 0; for (int i = 1; i <= V - 1; i++) { for (int j = 0; j < E; j++) { int u = graph->edge[j].src; int v = graph->edge[j].dest; int weight = graph->edge[j].weight; if (dist[u] != INT_MAX && dist[u] + weight < dist[v]) dist[v] = dist[u] + weight; } } Алгоритм Форда-Беллмана
  10. 10/13 • Арбитражная торговля Ещё немного о применении USD EUR

    GBP CHF CAD USD 1 0.741 0.657 1.061 1.005 EUR 1.349 1 0.888 1.433 1.366 GBP 1.521 1.126 1 1.614 1.538 CHF 0.942 0.698 0.619 1 0.953 CAD 0.995 0.732 0.650 1.049 1
  11. 11/13 Как определить какой алгоритм применить?

  12. Дейкстр а A* Форд- Беллман 12/13

  13. Алгоритмы нахождения на графах кратчайших путей 30 марта 2021 aok@dscs.pro,

    mva@dscs.pro Анастасия Олеговна Хлобыстова, Максим Викторович Абрамов