powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / MySQL Графы, Поиск крочайшего пути
26 сообщений из 26, показаны все 2 страниц
MySQL Графы, Поиск крочайшего пути
    #38881981
makklovskiy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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.
/* Создаем таблицы */
create table GRAPH_NODES
(
  NAME      VARCHAR(5)       not null
);
alter table GRAPH_NODES add constraint GRAPH_PK primary key (NAME);
create table GRAPH_EDGES
(
  NODE1     VARCHAR(5)       not null,
  NODE2     VARCHAR(5)       not null,
  WEIGHT    DECIMAL(10,0)    not null
);
alter table GRAPH_EDGES add constraint GRAPH_EDGES_NODE1_FK foreign key (NODE1) references GRAPH_NODES (NAME);
alter table GRAPH_EDGES add constraint GRAPH_EDGES_NODE2_FK foreign key (NODE2) references GRAPH_NODES (NAME);
alter table GRAPH_EDGES add constraint GRAPH_EDGES_CIRCLE check (node1 <> node2);
create table DEXTRA
(
  NODE      VARCHAR(5)       not null,
  WEIGHT    DECIMAL(18,0)    not null
);
alter table DEXTRA add constraint DEXTRA_PK primary key (NODE);
alter table DEXTRA add constraint DEXTRA_NODE_FK foreign key (NODE) references GRAPH_NODES (NAME);
/* Заполняем таблицы */
insert into GRAPH_NODES (NAME) values ('A');
insert into GRAPH_NODES (NAME) values ('B');
insert into GRAPH_NODES (NAME) values ('C');
insert into GRAPH_NODES (NAME) values ('D');
insert into GRAPH_NODES (NAME) values ('E');
insert into GRAPH_NODES (NAME) values ('F');
insert into GRAPH_EDGES (NODE1 , NODE2 , WEIGHT) values ('A' , 'B' , 1);
insert into GRAPH_EDGES (NODE1 , NODE2 , WEIGHT) values ('A' , 'C' , 5);
insert into GRAPH_EDGES (NODE1 , NODE2 , WEIGHT) values ('B' , 'C' , 2);
insert into GRAPH_EDGES (NODE1 , NODE2 , WEIGHT) values ('C' , 'D' , 7);
insert into GRAPH_EDGES (NODE1 , NODE2 , WEIGHT) values ('C' , 'E' , 9);
insert into GRAPH_EDGES (NODE1 , NODE2 , WEIGHT) values ('D' , 'E' , 3);
insert into GRAPH_EDGES (NODE1 , NODE2 , WEIGHT) values ('D' , 'F' , 5);
insert into GRAPH_EDGES (NODE1 , NODE2 , WEIGHT) values ('E' , 'F' , 5);
commit;
/* Подготоваливаем таблицу DEXTRA */
delete from DEXTRA;
insert into DEXTRA select NAME NODE, 9999999999 WEIGHT from GRAPH_NODES;
commit;
/* Подготоваливаем начальную точку */
update DEXTRA set WEIGHT = 0 where NODE = 'A';
/* Заполняем таблицу DEXTRA (я это делал процедурой) */
DECLARE VARIABLE RESULT INTEGER;
DECLARE VARIABLE NODE_NAME VARCHAR(5);
DECLARE VARIABLE NODE_WEIGHT DECIMAL(10,0);
begin
  RESULT = 1;
  while RESULT > 0 do
  begin
    RESULT = 0;
    for select T3.NODE2 NODE, (T3.WEIGHT + T2.WEIGHT) WEIGHT
        from DEXTRA T1, DEXTRA T2, GRAPH_EDGES T3
        where T1.NODE = T3.NODE2 and T2.NODE = T3.NODE1 and T1.WEIGHT > (T3.WEIGHT + T2.WEIGHT)
        into :NODE_NAME , :NODE_WEIGHT do
    begin
      update DEXTRA set WEIGHT = :NODE_WEIGHT where NODE = :NODE_NAME;
      RESULT = RESULT + 1;
    end
  end
end




помогите со скриптом. мой не работает.
Нужно найти кратчайший путь графа к промеру ответ: A -> B -> C -> D : 10;
P.S. В базе данных 25 тысяч строк.
...
Рейтинг: 0 / 0
MySQL Графы, Поиск крочайшего пути
    #38882002
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makklovskiyпомогите со скриптом. мой не работает.Не работают - негры в Африке. Скрипт же либо вызывает ошибку (какую?), либо даёт данные, не совпадающие с ожидаемыми.

Разбираться же в том, что тут наверчено, без вменяемых пояснений, чисто влом...
...
Рейтинг: 0 / 0
MySQL Графы, Поиск крочайшего пути
    #38882022
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так суть метода в чём. найти кратчайший путь от Т1 до Т2.

ну дык лекго.
в таблицу временную
(t1, t_current, path(text like 't1->ta->tb->...->tcurrent')

тогда первый шаг, заполнить туда

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

если ещо не достигнута точка Т2, обновить таблицу

к временной, дорисовать возможные переходы из карент, кудато, обновляя карент и путь

если ещо не достигнута... и так в цикле.

если граф не однонаправленный, то дабы мы за зря не бегали туда сюда, проверять что в пути...чтобы отсеять повторные посещения точек
...
Рейтинг: 0 / 0
MySQL Графы, Поиск крочайшего пути
    #38882191
makklovskiy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alex564657498765453, так я это понимаю, но из-за плохого знания mysql не магу написать.
я как собака павлова, всё понимаю, но сказать не могу)
Помогите с кодом.
...
Рейтинг: 0 / 0
MySQL Графы, Поиск крочайшего пути
    #38882195
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makklovskiy,

задача совсем не для СУБД.
тем более не для mySQL.
...
Рейтинг: 0 / 0
MySQL Графы, Поиск крочайшего пути
    #38882400
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makklovskiy,

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

Думаю, что стоит денег и не маленьких. :)
...
Рейтинг: 0 / 0
MySQL Графы, Поиск крочайшего пути
    #38882668
makklovskiy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arhat109, ясно всё. с вами любители денег и не маленьких, всё решатся нам намного проще и решение есть в интернете. Кому интересно гугл вам в помощь "волновым алгоритмом MySQL".
...
Рейтинг: 0 / 0
MySQL Графы, Поиск крочайшего пути
    #38882915
makklovskiy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алгоритм Дейкстры намного лучше, выбрал его.
...
Рейтинг: 0 / 0
MySQL Графы, Поиск крочайшего пути
    #38883893
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 и брать новое если там длинна меньше или оставлять старое.
...
Рейтинг: 0 / 0
MySQL Графы, Поиск крочайшего пути
    #38884024
bochkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
@b задаем начало
@f задаем конец
в алгоритме много недостатков,
но здесь реализована идея
что если на каждом узле будем искать кратчайший граф
то добьемся минимум общей длины
если конечно в тупик не упремся

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SET @b='A';
SET @f='D';
SET @mustgoon=1;
SELECT (SELECT CONCAT_WS(':',@node1:=NODE1,@node2:=@b:=NODE2,@w:=WEIGHT) FROM GRAPH_EDGES WHERE NODE1=@b ORDER BY WEIGHT ASC LIMIT 1),
@node1 as NODE1,@node2 as NODE2,@w as WEIGHT,@mustgoon:=NOT(@f=@node2)
FROM 
GRAPH_EDGES tmp
WHERE @mustgoon;
...
Рейтинг: 0 / 0
MySQL Графы, Поиск крочайшего пути
    #38884241
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bochkov@b задаем начало
@f задаем конец
в алгоритме много недостатков,
но здесь реализована идея
что если на каждом узле будем искать кратчайший граф
то добьемся минимум общей длины
если конечно в тупик не упремся

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SET @b='A';
SET @f='D';
SET @mustgoon=1;
SELECT (SELECT CONCAT_WS(':',@node1:=NODE1,@node2:=@b:=NODE2,@w:=WEIGHT) FROM GRAPH_EDGES WHERE NODE1=@b ORDER BY WEIGHT ASC LIMIT 1),
@node1 as NODE1,@node2 as NODE2,@w as WEIGHT,@mustgoon:=NOT(@f=@node2)
FROM 
GRAPH_EDGES tmp
WHERE @mustgoon;



и это работает?... жаль базы нету проверить работу запроса. просто странным кажеться то что
мы делаем дважды выборку из таблицы рёбер, тоесть сложность В, но на вики список алгоритмов, и ни в одном нету сложности такой, все сложнее начиная от НлогН и вплоть до Н*Н

хотя может я чтото не так думаю
...
Рейтинг: 0 / 0
MySQL Графы, Поиск крочайшего пути
    #38884289
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник

/*!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); я спецом доставил, чтоб убедиться, что алгоритм обманется и пойдёт изначально в неверную сторону.


НО Бочков высказал интересную идею. действительно, число шагов кратчайшего пути из Х в У не может быть больше числа строк в таблице ребёр (это очевидно, иначе получится что мы дважды идём по какомуто ребру, что лишенно смысла для кратчайшего пути)

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

надо бы подумать... может кто возмётся???

ЗЫ
Бочков, ты почаще отвечай, а то как пропал кудато, так и скучно сразу на форуме по мусклу.
...
Рейтинг: 0 / 0
MySQL Графы, Поиск крочайшего пути
    #38884294
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bochkov,

:) А теперь, добавьте в исходный набор ветку {A,D,9} и посмотрите что у вас получится.

Автору: пасибки, моя наводка вам помогла, это уже хорошо.
...
Рейтинг: 0 / 0
MySQL Графы, Поиск крочайшего пути
    #38884300
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453,

Кстати, ещё бывает не равноценные пути A->B и B->A :)
...
Рейтинг: 0 / 0
MySQL Графы, Поиск крочайшего пути
    #38884307
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109,

ну я двунаправленных ребёр не брал, хотя с точки зрения поиска оптимального пути, что наличие циклов, что двунаправленные ребра одно и тоже:) и отрицательных весов не брал.

ну не усложнял
...
Рейтинг: 0 / 0
MySQL Графы, Поиск крочайшего пути
    #38884313
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109bochkov,

:) А теперь, добавьте в исходный набор ветку {A,D,9} и посмотрите что у вас получится.

Автору: пасибки, моя наводка вам помогла, это уже хорошо.

вообще ничего не изменилось, после добавления этого ребра.!!!
...
Рейтинг: 0 / 0
MySQL Графы, Поиск крочайшего пути
    #38884317
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109,

Кстати это на разу не волновой алгоритм. :)
...
Рейтинг: 0 / 0
MySQL Графы, Поиск крочайшего пути
    #38884323
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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, но он будет отсечен на первом шаге.

:)
...
Рейтинг: 0 / 0
MySQL Графы, Поиск крочайшего пути
    #38884324
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453,

Это к исходному посту с набором вершин, не к вашему...
...
Рейтинг: 0 / 0
MySQL Графы, Поиск крочайшего пути
    #38884508
bochkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109bochkov,

:) А теперь, добавьте в исходный набор ветку {A,D,9} и посмотрите что у вас получится.

Автору: пасибки, моя наводка вам помогла, это уже хорошо.
это да
тогда маленько исправим
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SET @b='A';
SET @f='D';
SET @mustgoon=1;
SELECT (SELECT CONCAT_WS(':',@node1:=NODE1,@node2:=@b:=NODE2,@w:=WEIGHT) FROM GRAPH_EDGES WHERE NODE1=@b ORDER BY NODE2=@f DESC, WEIGHT ASC LIMIT 1),
@node1 as NODE1,@node2 as NODE2,@w as WEIGHT,@mustgoon:=NOT(@f=@node2)
FROM 
GRAPH_EDGES tmp
WHERE @mustgoon;
...
Рейтинг: 0 / 0
MySQL Графы, Поиск крочайшего пути
    #38884605
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bochkov,

:) А что принципиально изменилось? :)

Если интересно - пишите на мыло, оно в профиле.
...
Рейтинг: 0 / 0
MySQL Графы, Поиск крочайшего пути
    #38884620
bochkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
ORDER BY NODE2=@f DESC, WEIGHT ASC

Arhat109,
...
Рейтинг: 0 / 0
MySQL Графы, Поиск крочайшего пути
    #38884629
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109alex564657498765453,

Это к исходному посту с набором вершин, не к вашему...

а к моему абсолютно аналогично... :)
...
Рейтинг: 0 / 0
MySQL Графы, Поиск крочайшего пути
    #38884634
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bochkov
Код: sql
1.
ORDER BY NODE2=@f DESC, WEIGHT ASC

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

как твой алгоритм найдёт, что вторая дорога короче?
...
Рейтинг: 0 / 0
MySQL Графы, Поиск крочайшего пути
    #38884635
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bochkov,

я знаю ты у нас мастер писать джоин с переменными, смотри туда.
если число робёр Н, то сложность алгоритма должна быть порядка Н*Н или в оптимизированом виде Н*лог(Н)- согласно википедии.

отсюда вывод, если сложность твоего алгоритма порядка Н, ну или 2Н, 3Н ...то он точно не решает задачу, ибо насколько я понял из поначитанного, это доказано что сложность О(Н) быть не может у решения этой задачи.
...
Рейтинг: 0 / 0
MySQL Графы, Поиск крочайшего пути
    #38887040
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как понимаю, тема "загнулась" ... автор, хоть покаж чего получилось ... ;)
...
Рейтинг: 0 / 0
26 сообщений из 26, показаны все 2 страниц
Форумы / MySQL [игнор отключен] [закрыт для гостей] / MySQL Графы, Поиск крочайшего пути
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]