Змінюй хід війни! Допомагай ЗСУ!

Алгоритм дейкстры

🟡 13:10 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • 🟡 13:10 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #21
Написал парсер)))Парсит данные я их просто кеширую и все))Решение в лоб называется)))
 
  • 🟡 13:10 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #22
Зачем нужен именно дейкстры?
По мне так чересчур неэффективно, ну для малого количества вершин графа и звеньнев конечно покатит.



Нужна матрица с весами рёбер + алгоритм флойда, ИМХО. А строить эти деревья, эта рекурсия... не нужно. В итоге будет работать для расчёта всей матрицы (нахождения всех кратчайших расстояний в графе) быстрее чем алгоритм Дейкстры для пары вершин. И понятнее, головной боли с реализацией меньше, как по мне.



Подскажите как реализовать данный расчет расстояний?
Пример:
⚠ Тільки зареєстровані користувачі бачать весь контент та не бачать рекламу.

Я так понимаю у меня должно быть в БД город Харьков который соединяется со всеми маленькими (песочин,валки, и тд) и точно так же у Киева.
Ей богу не понимаю как должно быть все организовано в БД.
Подскажите структуру таблицы подходящую для этой задачи.
Похоже на алгоритм Дейкстры, но не в чистом виде - это было-бы слишком долго. Разве только каким-то образом задаётся направление (сужается область поиска), иначе - уже известные кратчайшие расстояния между вершинами (матрица кратчайших расстояний) + что-то вроде алгоритма Дейкстры. Т.е. поиск на уже рассчитаном заранее, что значительно сокращает время расчёта, иначе - слишком быстро.



Но может быть кто то это уже делал?
Или сколько будет такое стоить?
есть уже готовые проги, их много и они бесплатны, особенно те, которые пишут студенты, но нужно знать где искать.

Нужна реализация на php или всё равно?

Вот реализация алгоритма Дейкстры
⚠ Тільки зареєстровані користувачі бачать весь контент та не бачать рекламу.
но хоть убейте не пойму что она принимает. Вот база
⚠ Тільки зареєстровані користувачі бачать весь контент та не бачать рекламу.
Помогите связать это воедино, сколько будет стоить?. Данные у меня будет парсить парсер.
Я не силён ни в sql, ни в php, но каким образом эти два файла связаны друг с другом? В sql - просто создание таблиц баз данных, в php - используются массивы и переменные а не базы созданные с помощью sql.
 
Останнє редагування:
  • 🟡 13:10 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #23
Я имел ввиду структуру базы)))))Да нуно рнр)))Просто Я так понимаю что нужно каждый город окружать городами и так далее, и потом уже считать кратчайший путь методом рекурсии или волны или дейкстры)) Проблема в том что городов очень много, НО у меня есть уже парсер :) но проблема в том что я не вижу как это все связать. чтобы был такой же детальный просчет как и на вышеуказанном сайте:(((((((
 
  • 🟡 13:10 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #24
Пришел в голову вот такой вариант решения проблемы. Только нужны gps координаты городов. Берем все города вокруг Харькова. Смотрим по gps координатам какой из городов ближе к Киеву. Допустим это будет Полтава. Потом смотрим какие города есть вокруг Полтавы и какой из них ближе к Киеву. И т.д. Если попадем на город тупик или если мы начнем удаляться то надо будет вернуться на один город назад.

С таким алгоритмом невсегда будет кратчайший путь, но очень часто. Никто не запрещает запускать алгоритм не на самый ближайший город, а на несколько ближайших городов. Плюс этого алгоритма, что его легко понять на пальцах.
 
  • 🟡 13:10 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #25
Дейкстра реализуется почти всегда коряво и долго, т.к. там обязана быть рекурсия, в противном случае (без рекурсии) он может найти не кратчайший путь, а путь состоящий из цепочки самых коротких звеньев (зависит от самого графа) - это разные вещи.
Поэтому и говорю - копать в сторону алгоритма Флойда-Уоршелла, он позволяет расчитать матрицу кратчайших расстояний. Можете сразу записывать в некий массив и кратчайшие пути, но есть и обратный алгоритм, позволяющий найти пути по известной матрице кр. расстояний.
Учёт других параметров (кроме расстояний) должен быть реализован либо в процессе расчёта матрицы (тогда это уже будет не матрица кратчайших расстояний, а например матрица минимальных затрат времени или денег), но это усложняет задачу. Либо до расчёта матрицы (это проще), но тогда расстояния, время, деньги - всё нужно привести к одному показателю, к одной единице измерения. Ещё один нюанс, прохождение вершины графа тоже может иметь свою стоимость, вес (время например), тогда его плюсуют к стоимости примыкающего звена, но только с отдного конца. Случай когда стоимость прохода через вершину зависит от направления уже гораздо более сложный (невозможно слить вершину и звено) и возможно для него ещё нет однозначного решения.

вот завалялось
⚠ Тільки зареєстровані користувачі бачать весь контент та не бачать рекламу.
исходника нет так что не знаю что там за алгоритм, но выглядит феерично:D На Флойда вроде не похоже... Может пригодится. И подобных программок на просторах инета полно, с исходниками - надо искать.
На php вряд ли найдёте реализации, искать нужно Pascal/Delphi, C++, возможно даже Basic, а потом уже переводить. Что касается реализации на конкретном языке программирования - это уже совсем иной вопрос. Лучше пусть реализует программист со стажем и с мозгами (не быдлокодер), иначе - зависнете:D
Ещё раз: алоритм Флойда-Уоршелла без рекурсии. Не нужны те Дейкстры, рекурсия далеко не всегда ведет себя предсказуемо, обычно не предсказуемо и понять что там происходит очень сложно при масштабных расчётах, легче сразу себе пулю в лоб пустить, чем так страдать.:D



Пришел в голову вот такой вариант решения проблемы. Только нужны gps координаты городов. Берем все города вокруг Харькова. Смотрим по gps координатам какой из городов ближе к Киеву. Допустим это будет Полтава. Потом смотрим какие города есть вокруг Полтавы и какой из них ближе к Киеву. И т.д. Если попадем на город тупик или если мы начнем удаляться то надо будет вернуться на один город назад.
Это в общем-то и есть Дейкстра, только наоборот и работает с расстоянием по GPS, а не по трассам, может в лучшем случае, лишь сузить область поиска а не решить задачу. Для решеня к нему нужно добавить ещё и собственно поиск по трассе, по уже найденному предварительному пути (цепочке городов, без трасс). Но реализация...
 
Останнє редагування:
  • 🟡 13:10 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #26
Начал писать много умных слов и прикидывать таблички но наткнулся на такую штуку, так что кому-то повезло

⚠ Тільки зареєстровані користувачі бачать весь контент та не бачать рекламу.
 
  • 🟡 13:10 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #27
Но она же не считает промежуточные точки. А Пример:
⚠ Тільки зареєстровані користувачі бачать весь контент та не бачать рекламу.
 
  • 🟡 13:10 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #28
Кстати также советую использовать целочисленный тип данных для матрицы, числа с плавающей точкой при бльшом объёме данных будут считаться дольше. Потом перед выводом результатов можно будет перевести назад в дробное число.
 
  • 🟡 13:10 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #29
Смотрите данные хранятся в таком (Упростил слегка )виде:
Харьков -10 км(id_города)
Песочин - 13км (id_города
Коммунар - 35км (id_города
Харьков - 20км (id_города
Покотиловка - 11км (id_города
Мерефа - 5км (id_города
.....
Киев (Массив городов и нас.пунктах которые к нему примыкают например самый короткий Счастливое)
Теперь например если у меня есть такие данные можно загнать массив (Уточненный по области и стране) и просчитать по алгоритму самому удобному кратчайшее расстояние между городами, правильно?Если точка исключается из маршрута тогда берем следующее значение.
Или
Таблица №1
Харьков(Массив нас.пунктов примыкающих)
Таблица №2 (Имя нас.пункта - расстояние)
как лучше?
Вопрос номер 2:
Как узнать количество население в нас.пунктах, городах. Пока что вижу один вариант парсить википедию и вытаскивать значения типо -Харьков 1 452 228человек.
У кого какие идеи?
 
Останнє редагування:
  • 🟡 13:10 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #30
В чём главный недостаток алгоритма Дейкстры? Н а самом деле их несколько и нельзя однозначно сказать какой хуже остальных. Он ищет кратчайшее звено из примыкающих к рассматриваемой в данный момент времени вершине. Это может привести к тому, что в итоге он найдёт не кратчайший путь, а путь, состоящий из кратчайших звеньев сети (если неверно заданы определённые условия в алгоритме). Например есть "треугольник" АБВ, каждая вершина данного треугольника связана и с другими вершинами, то есть треугольник АБВ является частью некоего графа Д. Нам нужно найти кратчайший путь от одной из вершин графа до другой и мы используем алгоритм Дейкстры. Допустим на некотором этапе поиска мы попадаем в наш "бермудский" треугольник. Расстояния: А-Б=5, Б-В=6, А-В=10. Мы попали в вершину А. Что будет делать Дейкстра - выберет кратчайшее звено, т.е. А-Б, потом, попав в Б выберет Б-В (считаем что связь Б с другими вершинами заведомо больше). Итого 5+6=11, но А-В=10, значит Дейкстра выбрал не верный путь... С помощью той же рекурсии и дополнительных условий от этого можно избавиться, но каковой при этом будет "глубина" рекурсии и сколько при этом будет лишних действий... А значит, нужно ещё и сузить область поиска, если это возможно - короче городить и городить.
Однако, если всё-таки удастся правильно ограничить этот алгоритм, его преимущество в том, что не придётся расчитывать все кратчайшие расстояния (ну и пути если надо) во всей сети. Вместе с тем, не зная всех кратчайших нельзя точно сказать - а будет ли найденный путь действительно кратчайшим? Сложность алгоритма по-моему не фиксированна из-за рекурсий, чем больше граф, тем обычно больше сложность.

Как НУЖНО решать с моей точки зрения. Строим матрицу СМЕЖНОСТИ (не путать с матрицой инцидентности) для вершин графа (в гугл). Заполняем только расстояния между парами вершин, например расстояние Харьков-Дергачи, между этими 2-мя городами по трассе не должно быть других городов. Остальные клетки оставляем пустыми, или =0 или заведомо очень большое значение. При этом клетки главной диагонали все = 0, т.к. это расстояние Харьков-Харьков, например (ну вообще в данном предложении могут быть разные варианты значени 0, бесконечность, отрицательное число... зависит от модификации алгоритма). Матрица будет симметрична относительно этой диагонали, исключение - если в сети присутствуют звенья с односторонним движением (для междугородных трасс такого кажется не бывает, а вот внутри города - да). После чего решаем задачу по алгоритму Флойда (обрабатываем матрицу), тогда все кратчайшие расстояния будут связаны друг с другом математически и ошибки при правильной реализации быть не может да и путь или расстояние будет действительно кратчайшим. Проверял его в действии уже не один раз - работает быстро и правильно. Реализовать проще чем дейкстру, легче проверить, понятнее всё, есть итерации, но нет рекурсии, сложность алгоритма можно сказать фиксирована, кубическая. Расписать алгоритм флойда не могу т.к. не помню его в чистом виде (в гугл), я использую свою модификацию, которую не буду разглашать:D
Сложность лично я считаю по общему числу выполненных действий и по типу этих действий, операций, а не по количеству циклов, т.к. циклы, которые ничего не делают выполняются очень быстро. Удачи.

вот
⚠ Тільки зареєстровані користувачі бачать весь контент та не бачать рекламу.
достаточно внятно, всё довольно просто.
 
Останнє редагування:
  • 🟡 13:10 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #31
В чём главный недостаток алгоритма Дейкстры? Н а самом деле их несколько и нельзя однозначно сказать какой хуже остальных. Он ищет кратчайшее звено из примыкающих к рассматриваемой в данный момент времени вершине. Это может привести к тому, что в итоге он найдёт не кратчайший путь, а путь, состоящий из кратчайших звеньев сети (если неверно заданы определённые условия в алгоритме). Например есть "треугольник" АБВ, каждая вершина данного треугольника связана и с другими вершинами, то есть треугольник АБВ является частью некоего графа Д. Нам нужно найти кратчайший путь от одной из вершин графа до другой и мы используем алгоритм Дейкстры. Допустим на некотором этапе поиска мы попадаем в наш "бермудский" треугольник. Расстояния: А-Б=5, Б-В=6, А-В=10. Мы попали в вершину А. Что будет делать Дейкстра - выберет кратчайшее звено, т.е. А-Б, потом, попав в Б выберет Б-В (считаем что связь Б с другими вершинами заведомо больше). Итого 5+6=11, но А-В=10, значит Дейкстра выбрал не верный путь... С помощью той же рекурсии и дополнительных условий от этого можно избавиться, но каковой при этом будет "глубина" рекурсии и сколько при этом будет лишних действий... А значит, нужно ещё и сузить область поиска, если это возможно - короче городить и городить.
Однако, если всё-таки удастся правильно ограничить этот алгоритм, его преимущество в том, что не придётся расчитывать все кратчайшие расстояния (ну и пути если надо) во всей сети. Вместе с тем, не зная всех кратчайших нельзя точно сказать - а будет ли найденный путь действительно кратчайшим?

Как НУЖНО решать с моей точки зрения. Строим матрицу СМЕЖНОСТИ (не путать с матрицой инцидентности) для вершин графа (в гугл). Заполняем только расстояния между парами вершин, например расстояние Харьков-Дергачи, между этими 2-мя городами по трассе не должно быть других городов. Остальные клетки оставляем пустыми, или =0 или заведомо очень большое значение. При этом клетки главной диагонали все = 0, т.к. это расстояние Харьков-Харьков, например. Матрица будет симметрична относительно этой диагонали, исключение - если в сети присутствуют звенья с односторонним движением (для междугородных трасс такого кажется не бывает, а вот внутри города - да). После чего решаем задачу по алгоритму Флойда (обрабатываем матрицу), тогда все кратчайшие расстояния будут связаны друг с другом математически и ошибки при правильной реализации быть не может да и путь или расстояние будет действительно кратчайшим. Проверял его в действии уже не один раз - работает быстро и правильно. Реализовать проще чем дейкстру, легче проверить, понятнее всё, есть итерации, но нет рекурсии. Расписать алгоритм флойда не могу т.к. не помню его в чистом виде (в гугл), я использую свою модификацию, которую не буду разглашать:D
Удачи.

вот
⚠ Тільки зареєстровані користувачі бачать весь контент та не бачать рекламу.
достаточно внятно, всё довольно просто.
Ну а что можете сказать насчет этого:
Смотрите данные хранятся в таком (Упростил слегка )виде:
Харьков -10 км(id_города)
Песочин - 13км (id_города
Коммунар - 35км (id_города
Харьков - 20км (id_города
Покотиловка - 11км (id_города
Мерефа - 5км (id_города
.....
Киев (Массив городов и нас.пунктах которые к нему примыкают например самый короткий Счастливое)
Теперь например если у меня есть такие данные можно загнать массив (Уточненный по области и стране) и просчитать по алгоритму самому удобному кратчайшее расстояние между городами, правильно?Если точка исключается из маршрута тогда берем следующее значение.
Или
Таблица №1
Харьков(Массив нас.пунктов примыкающих)
Таблица №2 (Имя нас.пункта - расстояние)
как лучше?
Вопрос номер 2:
Как узнать количество население в нас.пунктах, городах. Пока что вижу один вариант парсить википедию и вытаскивать значения типо -Харьков 1 452 228человек.
У кого какие идеи?

По поводу форда вот нашел на хабре статью
⚠ Тільки зареєстровані користувачі бачать весь контент та не бачать рекламу.

Вот алгоритм на php
⚠ Тільки зареєстровані користувачі бачать весь контент та не бачать рекламу.
 
  • 🟡 13:10 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #32
у а что можете сказать насчет этого:
Смотрите данные хранятся в таком (Упростил слегка )виде:
Харьков -10 км(id_города)
Песочин - 13км (id_города
Коммунар - 35км (id_города
Харьков - 20км (id_города
Покотиловка - 11км (id_города
Мерефа - 5км (id_города
.....
Киев (Массив городов и нас.пунктах которые к нему примыкают например самый короткий Счастливое)
Теперь например если у меня есть такие данные можно загнать массив (Уточненный по области и стране) и просчитать по алгоритму самому удобному кратчайшее расстояние между городами, правильно?Если точка исключается из маршрута тогда берем следующее значение.
Или
Таблица №1
Харьков(Массив нас.пунктов примыкающих)
Таблица №2 (Имя нас.пункта - расстояние)
как лучше?
Вопрос номер 2:
Как узнать количество население в нас.пунктах, городах. Пока что вижу один вариант парсить википедию и вытаскивать значения типо -Харьков 1 452 228человек.
У кого какие идеи?
Я же написал, нужно строить матрицу смежности, здесь я её не вижу. Матрица смежности квадратная, и столбцы и строки - это ваши города, клетки - это расстояния между ними.

По поводу форда вот нашел на хабре статью
⚠ Тільки зареєстровані користувачі бачать весь контент та не бачать рекламу.

Вот алгоритм на php
⚠ Тільки зареєстровані користувачі бачать весь контент та не бачать рекламу.
так... я напишу псевдокод на паскале (мне так удобнее и быстрее), а вы уже переводите на какой вам захочется язык.
Упрощённый вариант работать не будет, нужны доп. условия, он нужен лишь для объяснения общей концепции. Ждите.
 
  • 🟡 13:10 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #33
Спасибо буду ждать.
 
  • 🟡 13:10 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #34
var
Matrix: array[1..100, 1..100] of integer //матрица смежности вершин графа 100х100 элементов
count: integer //счётчик, нужен для завершения бесконечного цикла.
.
.
.
.
{Будем считать что матрица уже заполнена известными расстояниями и переменная count
содержит их количество, остальные расстояния, которые нужно найти имеют значение 0}

begin

iter: //цикл, реализованный с помощью меток, означает итерации, можно заменить циклом While count<100*100-100. Просто так нужно было решать, здесь нет остального кода.
if count>=100*100-100 then //если рассчитаны все элементы матрицы
goto exit; //тогда выход из цикла (exit)
else
begin
for i:=1 to 100 do //собственно перебор элементов матрицы, вместе со следующей строчкой, i-строка j-столбец
for j:=1 to 100 do
if i<>j then //если не попали на диагональ, то...
if Matrix[i,j]>0 then //попали на непустой элемент матрицы
for k:=1 to 100 do //когда попали на непустой элемент, пытаемся найти второй непустой элемент, который в сумме с первым даст нам новый элемент (новое значение расстояния), при этом адрес заполняемого элемента будет i - строка, k - столбец
if i<>k then //если не попали на диагональ, то...
if Matrix[j,k]>0 then //попали на непустой элемент матрицы
if Matrix[i,k]=0 then //если по адресу [i,k], содержится пустой элемент то...
begin
Matrix[i,k]:=Matrix[i,j]+Matrix[j,k]; //записываем новый элемент матрицы
count:=count+1; //увеличиваем количество заполненных элементов матрицы на 1
end
else //иначе, если не [i,k]=0
if Matrix[i,k]>Matrix[i,j]+Matrix[j,k] then //если по адресу [i,k], содержится элемент, значение которогого больше чем сумма элементов по адресам [i,j] и [j,k], то...
Matrix[i,k]:=Matrix[i,j]+Matrix[j,k]; //переписываем элемент матрицы

end;
goto iter; //возврат к iter
exit: //выход из цикла
end.


Выдрал кусок из рабочей программы и добавил комментарии, это лишь общий вид, не факт что будет работать оторванное от остальной программы. Ввиду специфики решённой с помощью этого куска кода задачи, незаполненные элементы матрицы смежности имеют значения 0 а не бесконечность. Это добавляет несколько дополнительных действий, от них можно избавиться.

ТС, последняя таблица, что вы представили - это уже рассчитанная матрица кратчайших расстояний, в матрице смежности вершин заполнены не все элементы, незаполненные имеют расстояние равное либо 0 либо бесконечность, смотря как вы собираетесь решать задачу. Т.е. в матрицу смежности записываются лишь расстояния между СОСЕДНИМИ вершинами графа. Она является базовой для расчёта по алгоритму Флойда. Есть обратный алгоритм для нахождения пути по матрице кратчайших расстояний.

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

//когда попали на непустой элемент, пытаемся найти второй непустой элемент, который в сумме с первым даст нам новый элемент (новое значение расстояния), при этом адрес заполняемого элемента будет i - строка, k - столбец
это суть алгоритма, остальное - бутафория и зависит от реализации конкретной задачи конкретным программистом.

отвечаю на вопрос в личке
Вот граф:
⚠ Тільки зареєстровані користувачі бачать весь контент та не бачать рекламу.

Вот матрица смежности вершин для него
⚠ Тільки зареєстровані користувачі бачать весь контент та не бачать рекламу.

Вообще-то пишут в инете что что она бинарная, т.е. заполненные элементы=1, остальные=0. Так что возможно я не прав называя эту матрицу матрицей смежности. Но я понимаю так, может где-то в литературе читал - не везде одно и то же пишут. Но именно такая матрица, а не бинарная необходима для расчёта алгоритмом флойда.
всё что делает Флойд - это складывает элементы матрицы по определённому алгоритму. В итоге, каждый новый элемент является суммой неких двух уже заполненных ранее. Это то же самое, что найти сначала суммы всех звеньев имеющих общую вершину, затем из полученного складывать дальше, получая уже не 2-х звенные, а 3-х, 4-х звенные, потом 5-8 звенные и т.д., оставляя при этом лишь кратчайшие, а не все варианты.
 
Останнє редагування:
  • 🟡 13:10 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #35
А как мне тогда лучше хранить исходные данные для алгоритма:
Харьков -10 км(id_города)
Песочин - 13км (id_города
Коммунар - 35км (id_города
Харьков - 20км (id_города
Покотиловка - 11км (id_города
Мерефа - 5км (id_города
ИЛИ
Харьков(Массив нас.пунктов примыкающих)
Таблица №2 (Имя нас.пункта - расстояние)

Где быстрее будеТ?
 
  • 🟡 13:10 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #36
Смотрим на матрицу, видим заполненную клетку 1-2, переходим к строке 2 (по номеру 1-2), видим заполненную 2-3, смотрим на 1-3 (потому что 1-2 и 2-3), она не заполнена, значит [1,3]=[1,2]+[2,3]=9+14=23. И т.д., если попадаем на уже заполненную клетку (например 2-3 уже равно 40), то если значение в ней больше суммы - заменяем его, если меньше или равно - ничего не делаем. Примерно так работает алгоритм Флойда, могут быть разные модификации и условия задачи, поэтому отличается реализация.

Харьков -10 км(id_города)
Песочин - 13км (id_города
Коммунар - 35км (id_города
Харьков - 20км (id_города
Покотиловка - 11км (id_города
Мерефа - 5км (id_города
расстояние откуда куда?

Вы пытаетесь хранить данные в виде одномерного массива(строка), а нужен двумерный (матрица, таблица)

смотрим на матрицу
1 - Харьков
2 - Песочин
3 - Коммунар
.... и т.д.

Расстояния между ними в матрице (таблице)

А как мне тогда лучше хранить исходные данные для алгоритма:
не важно, главное чтобы перед расчётом всё было сведено к матрице.
 
  • 🟡 13:10 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #37
Ок, тогда сейчас попытаюсь упорядочить данные в БД, и получить двумерный массив.
Как будет готово отпишу :)
 
  • 🟡 13:10 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #38
В чём главный недостаток алгоритма Дейкстры? Н а самом деле их несколько и нельзя однозначно сказать какой хуже остальных. Он ищет кратчайшее звено из примыкающих к рассматриваемой в данный момент времени вершине. Это может привести к тому, что в итоге он найдёт не кратчайший путь, а путь, состоящий из кратчайших звеньев сети (если неверно заданы определённые условия в алгоритме). Например есть "треугольник" АБВ, каждая вершина данного треугольника связана и с другими вершинами, то есть треугольник АБВ является частью некоего графа Д. Нам нужно найти кратчайший путь от одной из вершин графа до другой и мы используем алгоритм Дейкстры. Допустим на некотором этапе поиска мы попадаем в наш "бермудский" треугольник. Расстояния: А-Б=5, Б-В=6, А-В=10. Мы попали в вершину А. Что будет делать Дейкстра - выберет кратчайшее звено, т.е. А-Б, потом, попав в Б выберет Б-В (считаем что связь Б с другими вершинами заведомо больше). Итого 5+6=11, но А-В=10, значит Дейкстра выбрал не верный путь... С помощью той же рекурсии и дополнительных условий от этого можно избавиться, но каковой при этом будет "глубина" рекурсии и сколько при этом будет лишних действий... А значит, нужно ещё и сузить область поиска, если это возможно - короче городить и городить.
Однако, если всё-таки удастся правильно ограничить этот алгоритм, его преимущество в том, что не придётся расчитывать все кратчайшие расстояния (ну и пути если надо) во всей сети. Вместе с тем, не зная всех кратчайших нельзя точно сказать - а будет ли найденный путь действительно кратчайшим? Сложность алгоритма по-моему не фиксированна из-за рекурсий, чем больше граф, тем обычно больше сложность.

ВЫ алгоритм поняли то? Ой как сомневаюсь... И Ваш пример тому пример.

Кстати, судя по вики сложность алгоритма Дейкстры O(n^2), сложность Флойда—Воршелла O(n^3).
Плюс второй решается на матрицах а значит не реализуем средствами чистого sql.
 
  • 🟡 13:10 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #39
ВЫ алгоритм поняли то? Ой как сомневаюсь... И Ваш пример тому пример.
упс, и правда ошибся. Я его просто забыл и ляпнул не подумав - бывает... Решил по памяти, а память подвела... Допустим оценка прохода в вершину А=7, тогда в Б=7+5=12 (из А), в В=12+6=18 (из Б), В=7+10=17 (из А), тогда алгоритм находит действительно кратчайший путь.

Кстати, судя по вики сложность алгоритма Дейкстры O(n^2)
но при реализации выходило что он работает медленнее, особенно при больших матрицах, как ни пытались его улучшить, а вот флойд заработал быстрее. Может просто корявая реализация.
Да и чем по-вашему алгоритм Флойда так сильно отличается от алгорима Дейкстры? По сути практически то же самое, только Флойд считается для всей матрицы и рассматривается на матрице а не на графе + можно сразу получить кратчайшие пути, состоящие из большого числа звеньев, а не прибавлять их по-одному. Суть та же самая. Почти все они работают на операции сложения и сравнения, разный подход к просмотру вершин графа.

сложность Флойда—Воршелла O(n^3).
Данная "сложность" основана лишь на количестве вложенных циклов, а это мягко говоря не соответсвует количеству реально выполненных действий (сравнение, сложение и т.п.) В итоге Дейкстра оказывается сложнее. Не забываем про рекурсию, не просто итерации, которые легко засунуть в цикл, а именно рекурсию с точки зрения языка программмирования - от неё сложно избавиться и это может привести к усложнению алгоритма. ИМХО

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

Если верить вашей википедии и не только ей алгоритм Флойда для ВСЕЙ матрицы Q(n^3), алгоритм Дейкстры Q(n^2) но по сути лишь для одной строки матрицы (все кратчайшие пути из зданной вершины), а значит это число ещё нужно умножить на количество вершин графа(добавить ещё один цикл), то есть для всей матрицы его сложность Q((n^2)*n)=Q(n^3). Количество РЕАЛЬНО выполненных действий может быть больше в Дейкстре чем во Флойде. НО опять же если нужно найти лишь один путь - вполне оправданно, и по идее должен быть лучше Флойда.

Ссылка из википедии, там есть исходник для Дейкстры на С++, если ТС всё же выберет этот метод
⚠ Тільки зареєстровані користувачі бачать весь контент та не бачать рекламу.
 
Останнє редагування:
Назад
Зверху Знизу