|
|
|
MySQL Графы, Поиск крочайшего пути
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. помогите со скриптом. мой не работает. Нужно найти кратчайший путь графа к промеру ответ: A -> B -> C -> D : 10; P.S. В базе данных 25 тысяч строк. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2015, 16:16:07 |
|
||
|
MySQL Графы, Поиск крочайшего пути
|
|||
|---|---|---|---|
|
#18+
makklovskiyпомогите со скриптом. мой не работает.Не работают - негры в Африке. Скрипт же либо вызывает ошибку (какую?), либо даёт данные, не совпадающие с ожидаемыми. Разбираться же в том, что тут наверчено, без вменяемых пояснений, чисто влом... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2015, 16:25:17 |
|
||
|
MySQL Графы, Поиск крочайшего пути
|
|||
|---|---|---|---|
|
#18+
так суть метода в чём. найти кратчайший путь от Т1 до Т2. ну дык лекго. в таблицу временную (t1, t_current, path(text like 't1->ta->tb->...->tcurrent') тогда первый шаг, заполнить туда список точке, куда можно попасть из т1, занеся вкачестве карент точку назначения, и в путь только имя точки назначения. если ещо не достигнута точка Т2, обновить таблицу к временной, дорисовать возможные переходы из карент, кудато, обновляя карент и путь если ещо не достигнута... и так в цикле. если граф не однонаправленный, то дабы мы за зря не бегали туда сюда, проверять что в пути...чтобы отсеять повторные посещения точек ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2015, 16:44:46 |
|
||
|
MySQL Графы, Поиск крочайшего пути
|
|||
|---|---|---|---|
|
#18+
alex564657498765453, так я это понимаю, но из-за плохого знания mysql не магу написать. я как собака павлова, всё понимаю, но сказать не могу) Помогите с кодом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2015, 19:44:03 |
|
||
|
MySQL Графы, Поиск крочайшего пути
|
|||
|---|---|---|---|
|
#18+
makklovskiy, задача совсем не для СУБД. тем более не для mySQL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2015, 20:00:20 |
|
||
|
MySQL Графы, Поиск крочайшего пути
|
|||
|---|---|---|---|
|
#18+
makklovskiy, Задача решается "волновым алгоритмом", ежели интересно - смотрите методики алгоритмов разводки печатных плат... есть спец. проги. Думаю можно решить и силами скуля, но вопрос сложнее чем описанный и решенный тут в факе по деревьям. Думаю, что стоит денег и не маленьких. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2015, 07:16:57 |
|
||
|
MySQL Графы, Поиск крочайшего пути
|
|||
|---|---|---|---|
|
#18+
Arhat109, ясно всё. с вами любители денег и не маленьких, всё решатся нам намного проще и решение есть в интернете. Кому интересно гугл вам в помощь "волновым алгоритмом MySQL". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2015, 11:43:20 |
|
||
|
MySQL Графы, Поиск крочайшего пути
|
|||
|---|---|---|---|
|
#18+
Алгоритм Дейкстры намного лучше, выбрал его. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2015, 14:39:35 |
|
||
|
MySQL Графы, Поиск крочайшего пути
|
|||
|---|---|---|---|
|
#18+
makklovskiyalex564657498765453, так я это понимаю, но из-за плохого знания mysql не магу написать. я как собака павлова, всё понимаю, но сказать не могу) Помогите с кодом. MasterZivmakklovskiy, задача совсем не для СУБД. тем более не для mySQL. makklovskiyАлгоритм Дейкстры намного лучше, выбрал его. мдя... называется - смотрю в книгу вижу фигу. вариант в лоб решения подобной задачи, не что иное как реализация того же подхода что и в алгоритме Дейкстры. берём первой точку начальную. пририсовываем соседей ставя им вкачестве длинны пути к ним- :) длинну пути таки к ним. потом расматриваем соседей соседей...только в дейкстры это пошагово, мы джоином сразу махом все...точно также ища минимальное... ну тоесть если у нас граф B / \ А D \ / C то при дейкстры, мы расмотрим А, потом Б/С (одну из них) потом как пить дать лоху понятно, что вторую, и последней D, один раз в Д запишем вместо бесконечности число, второй раз если число меньше чем записсаное, перезапишем иначе оставим. для табличного лобового варианта. запишем в таблицу fromaroads(current, length, path) value (A, 0, '') потом левым джоином получится выборка дописываемая в fromaroads, и в итоге (A, 0, '') (C, Lac, "C") (B, Lab, "B") потом выборка даст две возможные записи для дозаписи (D, Lac+Lcd, "CD") (B, LaB+Lbd, "BD") первичным ключом конечно же надо делать первую колонку в этой таблице, и дозапись делать по принципу. on duplicate key update и брать новое если там длинна меньше или оставлять старое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2015, 13:09:03 |
|
||
|
MySQL Графы, Поиск крочайшего пути
|
|||
|---|---|---|---|
|
#18+
@b задаем начало @f задаем конец в алгоритме много недостатков, но здесь реализована идея что если на каждом узле будем искать кратчайший граф то добьемся минимум общей длины если конечно в тупик не упремся Код: sql 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2015, 14:56:29 |
|
||
|
MySQL Графы, Поиск крочайшего пути
|
|||
|---|---|---|---|
|
#18+
bochkov@b задаем начало @f задаем конец в алгоритме много недостатков, но здесь реализована идея что если на каждом узле будем искать кратчайший граф то добьемся минимум общей длины если конечно в тупик не упремся Код: sql 1. 2. 3. 4. 5. 6. 7. 8. и это работает?... жаль базы нету проверить работу запроса. просто странным кажеться то что мы делаем дважды выборку из таблицы рёбер, тоесть сложность В, но на вики список алгоритмов, и ни в одном нету сложности такой, все сложнее начиная от НлогН и вплоть до Н*Н хотя может я чтото не так думаю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2015, 16:58:57 |
|
||
|
MySQL Графы, Поиск крочайшего пути
|
|||
|---|---|---|---|
|
#18+
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET NAMES utf8 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; -- Дамп структуры для таблица tt.edges CREATE TABLE IF NOT EXISTS `edges` ( `id` int(11) NOT NULL AUTO_INCREMENT, `node1` char(2) NOT NULL DEFAULT '0', `node2` char(2) NOT NULL DEFAULT '0', `weight` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=22 DEFAULT CHARSET=utf8; -- Дамп данных таблицы tt.edges: 22 rows /*!40000 ALTER TABLE `edges` DISABLE KEYS */; INSERT INTO `edges` (`id`, `node1`, `node2`, `weight`) VALUES (1, 'A', 'C', 0), (2, 'A', 'F', 3), (3, 'A', 'H', 4), (4, 'C', 'B', 2), (5, 'C', 'F', 2), (6, 'C', 'K', 13), (7, 'B', 'E', 2), (8, 'B', 'G', 7), (9, 'B', 'H', 5), (10, 'B', 'D', 3), (11, 'D', 'E', 0), (12, 'D', 'J', 3), (13, 'E', 'C', 1), (14, 'E', 'F', 2), (15, 'F', 'I', 2), (16, 'F', 'H', 1), (17, 'G', 'K', 1), (18, 'H', 'I', 1), (19, 'H', 'K', 1), (20, 'H', 'J', 1), (21, 'I', 'D', 1), (22, 'A', 'D', 1); /*!40000 ALTER TABLE `edges` ENABLE KEYS */; /*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */; /*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; кто хочет позапускать чтото. так вот, поповоду интересного метода с запросами с переменными с подвыпендрёжем. цикл понятное дело не фиксируется, и гуляем по циклу на графе токо так. но.суть метода берём точку один, берём ребро с минимальной длинной из этой точки, потом берём ребро минимальной длинны из второй точки.... и пошло поехало. (22, 'A', 'D', 1); кратчайший но из А кратчайший в С - 0, из С кратчайший в Б -2, из Б в Е (хотя из Б есть в Д) вообщем алгоритм реализовует идею жадного алгоритма... пытаеться абы счас хапнуть лучше... это евристика не дающая гарантированного результата. точку (22, 'A', 'D', 1); я спецом доставил, чтоб убедиться, что алгоритм обманется и пойдёт изначально в неверную сторону. НО Бочков высказал интересную идею. действительно, число шагов кратчайшего пути из Х в У не может быть больше числа строк в таблице ребёр (это очевидно, иначе получится что мы дважды идём по какомуто ребру, что лишенно смысла для кратчайшего пути) тоесть взяв внешний селект у бочкова как способ, совершить в цикле нужную операцию, без всяких временых таблиц и циклов в коде явных, можно решить более красиво задачу. надо бы подумать... может кто возмётся??? ЗЫ Бочков, ты почаще отвечай, а то как пропал кудато, так и скучно сразу на форуме по мусклу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2015, 17:37:38 |
|
||
|
MySQL Графы, Поиск крочайшего пути
|
|||
|---|---|---|---|
|
#18+
bochkov, :) А теперь, добавьте в исходный набор ветку {A,D,9} и посмотрите что у вас получится. Автору: пасибки, моя наводка вам помогла, это уже хорошо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2015, 17:43:56 |
|
||
|
MySQL Графы, Поиск крочайшего пути
|
|||
|---|---|---|---|
|
#18+
alex564657498765453, Кстати, ещё бывает не равноценные пути A->B и B->A :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2015, 17:46:48 |
|
||
|
MySQL Графы, Поиск крочайшего пути
|
|||
|---|---|---|---|
|
#18+
Arhat109, ну я двунаправленных ребёр не брал, хотя с точки зрения поиска оптимального пути, что наличие циклов, что двунаправленные ребра одно и тоже:) и отрицательных весов не брал. ну не усложнял ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2015, 17:56:18 |
|
||
|
MySQL Графы, Поиск крочайшего пути
|
|||
|---|---|---|---|
|
#18+
Arhat109bochkov, :) А теперь, добавьте в исходный набор ветку {A,D,9} и посмотрите что у вас получится. Автору: пасибки, моя наводка вам помогла, это уже хорошо. вообще ничего не изменилось, после добавления этого ребра.!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2015, 17:58:06 |
|
||
|
MySQL Графы, Поиск крочайшего пути
|
|||
|---|---|---|---|
|
#18+
Arhat109, Кстати это на разу не волновой алгоритм. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2015, 18:05:30 |
|
||
|
MySQL Графы, Поиск крочайшего пути
|
|||
|---|---|---|---|
|
#18+
alex564657498765453, Угу. А в указанном графе этот путь оптимальный из A в D :) 1) A,C,5 + C,D,7 = 12 2) A,B,1 + B,C,2 + C,D,7 = 10 3+) A,D,9 = 9, но он будет отсечен на первом шаге. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2015, 18:08:47 |
|
||
|
MySQL Графы, Поиск крочайшего пути
|
|||
|---|---|---|---|
|
#18+
alex564657498765453, Это к исходному посту с набором вершин, не к вашему... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2015, 18:09:39 |
|
||
|
MySQL Графы, Поиск крочайшего пути
|
|||
|---|---|---|---|
|
#18+
Arhat109bochkov, :) А теперь, добавьте в исходный набор ветку {A,D,9} и посмотрите что у вас получится. Автору: пасибки, моя наводка вам помогла, это уже хорошо. это да тогда маленько исправим Код: sql 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2015, 23:17:52 |
|
||
|
MySQL Графы, Поиск крочайшего пути
|
|||
|---|---|---|---|
|
#18+
bochkov, :) А что принципиально изменилось? :) Если интересно - пишите на мыло, оно в профиле. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2015, 06:47:23 |
|
||
|
MySQL Графы, Поиск крочайшего пути
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. Arhat109, ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2015, 08:04:40 |
|
||
|
MySQL Графы, Поиск крочайшего пути
|
|||
|---|---|---|---|
|
#18+
Arhat109alex564657498765453, Это к исходному посту с набором вершин, не к вашему... а к моему абсолютно аналогично... :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2015, 08:29:00 |
|
||
|
MySQL Графы, Поиск крочайшего пути
|
|||
|---|---|---|---|
|
#18+
bochkov Код: sql 1. Arhat109, так вотпрос был, что принципиально изменилось? расмотри вариант графа, от А к Z идут две паралельные дороги A->b1->b2->b3->...->b1,000,000->B A->c1->c2->c3->...->c1,000,000->B на первой дороге все шаги длиной ноль, только 999000ый шаг длиной в 10 миллиардов. а на второй дороге, все шаги длиной в 10000, кроме 500000ой(длинна 9999) - итого общая длина 10млрд-1 как твой алгоритм найдёт, что вторая дорога короче? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2015, 08:34:46 |
|
||
|
MySQL Графы, Поиск крочайшего пути
|
|||
|---|---|---|---|
|
#18+
bochkov, я знаю ты у нас мастер писать джоин с переменными, смотри туда. если число робёр Н, то сложность алгоритма должна быть порядка Н*Н или в оптимизированом виде Н*лог(Н)- согласно википедии. отсюда вывод, если сложность твоего алгоритма порядка Н, ну или 2Н, 3Н ...то он точно не решает задачу, ибо насколько я понял из поначитанного, это доказано что сложность О(Н) быть не может у решения этой задачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2015, 08:39:00 |
|
||
|
|

start [/forum/topic.php?fid=47&startmsg=38881981&tid=1833537]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
48ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
34ms |
get tp. blocked users: |
1ms |
| others: | 203ms |
| total: | 315ms |

| 0 / 0 |
