powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Алгоритм Дейкстры на MS SQL Server
26 сообщений из 26, показаны все 2 страниц
Алгоритм Дейкстры на MS SQL Server
    #38969550
PG81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!
Необходимо сделать прокладку маршрута по складу.
Есть схема склада, есть ненаправленный граф обхода склада (более 20 тыс вершин)
Необходимо построить кратчайший маршрут между двумя произвольными вершинами склада.

В принципе алгоритм Дейкстры не сложный, но хотелось бы перед началом реализации, послушать мнения.
Наверняка кто-то делал подобное,
подскажите какие подводные камни?
как более эффективно реализовать на sql сервере на лету считать или заранее просчитать пути от каждой точки к каждой и хранить в БД?
Может еще чего полезного посоветуете.
...
Рейтинг: 0 / 0
Алгоритм Дейкстры на MS SQL Server
    #38969572
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. SQLCLR?
2. OrientDB?
...
Рейтинг: 0 / 0
Алгоритм Дейкстры на MS SQL Server
    #38969594
WarAnt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PG81,

Перемножаете все варианты и выбираете тот который нужно.
...
Рейтинг: 0 / 0
Алгоритм Дейкстры на MS SQL Server
    #38969599
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PG81более 20 тыс вершин

заранее просчитать пути от каждой точки к каждой и хранить в БД
400 млн. маршрутов? ну-ну...

PG81как более эффективно реализовать на sql сервере
А почему обязательно на SQL-сервере? задача-то больше подходит для решения на стороне клиента...
...
Рейтинг: 0 / 0
Алгоритм Дейкстры на MS SQL Server
    #38969618
PG81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,

Идея такая, что один раз рассчитать расстояния, и потом уже пользоваться только готовым результатом получая его из БД
...
Рейтинг: 0 / 0
Алгоритм Дейкстры на MS SQL Server
    #38969641
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если схема абсолютно статична - ну, наверное, это возможно. Алгоритмы получения всех путей в графе существуют, не вопрос... но представь, сколько оно молотить будет и сколько места зажрёт 400 кк маршрутов.
...
Рейтинг: 0 / 0
Алгоритм Дейкстры на MS SQL Server
    #38969649
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PG81,

Т.е. "проверить, нет ли готового расчета для конкретных точек, если есть - то взять его, если нет - то рассчитать и сохранить"?
Да, если стоимость путей считается редко - это, конечно, эффективнее, чем считать каждый раз заново.
...
Рейтинг: 0 / 0
Алгоритм Дейкстры на MS SQL Server
    #38969656
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
*меняется редко
...
Рейтинг: 0 / 0
Алгоритм Дейкстры на MS SQL Server
    #38969658
Wlr-l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Если схема абсолютно статична, то получение всех путей в графе это одноразовая задача, поэтому не важно, сколько оно молотить будет, да и сколько места зажрёт 400 кк маршрутов не столь важно. Зато последующие запросы будут выполняться практически мгновенно.
...
Рейтинг: 0 / 0
Алгоритм Дейкстры на MS SQL Server
    #38969665
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в принципе эффективность еще зависит от связности графа - чем больше ребер, тем выгоднее хранить предрасчет.
...
Рейтинг: 0 / 0
Алгоритм Дейкстры на MS SQL Server
    #38969772
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PG81 , покопавшись по сусекам, нашёл когда-то написанный волновой алгоритм поиска пути для MySQL. Правда, он решает чутка другую задачу - поиск самого дешёвого среди самых коротких.
Могу запостить, если нужен.
...
Рейтинг: 0 / 0
Алгоритм Дейкстры на MS SQL Server
    #38969792
PG81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,

Ну запости, я против не буду)) мне любопытно
Я как сделаю первый вариант тоже выложу, на критику
...
Рейтинг: 0 / 0
Алгоритм Дейкстры на MS SQL Server
    #38969793
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотрел - для твоей задачи он даже проще, надо несколько инструкций удалить (сделал) и ничего не добавлять. Вот итог:

Код: 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.
CREATE PROCEDURE Wave (IN pFrom INT, IN pTo Int)
BEGIN
DECLARE MaxIterations INT DEFAULT 100;

DROP TEMPORARY TABLE IF EXISTS Routes;
CREATE TEMPORARY TABLE Routes(point INT, weight INT, route TEXT, PRIMARY KEY(point));
DROP TEMPORARY TABLE IF EXISTS Step;
CREATE TEMPORARY TABLE Step(point INT, weight INT, route TEXT);

INSERT INTO Routes(point, weight, route) VALUES (pFrom, 0, CAST(pFrom AS CHAR));

WHILE MaxIterations > 0 DO
  TRUNCATE Step;
  INSERT INTO Step (point, weight, route)
    SELECT Graph.point2, Routes.weight+Graph.weight, CONCAT(Routes.route, '/', CAST(Graph.point2 AS CHAR))
    FROM Routes, Graph
    WHERE Routes.point = Graph.point1;
  INSERT IGNORE INTO Routes (point, weight, route)
    SELECT point, weight, route FROM Step;
  UPDATE Routes, Step
    SET Routes.weight = Step.weight, Routes.route = Step.route
    WHERE Routes.point = Step.point AND Routes.weight > Step.weight;
  SET MaxIterations = MaxIterations - 1;
END WHILE;

SELECT weight, route
  FROM Routes
  WHERE point = pTo;

DROP TEMPORARY TABLE IF EXISTS Routes;
DROP TEMPORARY TABLE IF EXISTS Step;
END; @@


Исходные данные берутся из таблицы
Код: sql
1.
2.
3.
4.
5.
6.
CREATE TABLE Graph (
point1 INT NOT NULL, -- from
point2 INT NOT NULL, -- to
weight INT NOT NULL, -- cost
PRIMARY KEY (point1, point2)
);
...
Рейтинг: 0 / 0
Алгоритм Дейкстры на MS SQL Server
    #38969794
хмхмхм
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PG81Всем привет!
Необходимо сделать прокладку маршрута по складу.
Есть схема склада, есть ненаправленный граф обхода склада (более 20 тыс вершин)
Необходимо построить кратчайший маршрут между двумя произвольными вершинами склада.

В принципе алгоритм Дейкстры не сложный, но хотелось бы перед началом реализации, послушать мнения.
Наверняка кто-то делал подобное,
подскажите какие подводные камни?
как более эффективно реализовать на sql сервере на лету считать или заранее просчитать пути от каждой точки к каждой и хранить в БД?
Может еще чего полезного посоветуете.

Мне кажется:
1. Для счета налету лучше все-таки использовать приложение, т.к. сервер плохо работает с рекурсией. Ну или если очень-очень хочется, то на SQL 2014 использовать dll процедуры. Это как раз для извращений, когда хочется код на Net непременно запустить на SQL.
2. Если результаты статичны или добавляются время от времени новые узлы, то можно использовать хранение статичной информации и иногда её обновлять. Тогда тут простой вариант - таблица, где перечислены через разделитель узлы, начальная точка, конечная точка, вес и кол-во узлов. Из нее запрос будет мгновенным в случае создания индекса по двум узлам с include полями из select-а.
...
Рейтинг: 0 / 0
Алгоритм Дейкстры на MS SQL Server
    #38969797
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Из MySQL-специфичного тут только INSERT IGNORE - это вставка в таблицу, когда вставляются только записи, не нарушающие условий уникальности, вне зависимости от наличия в наборе записей, нарушающих ограничения (такие записи игнорируются, причём разные игнорируемые записи могут нарушать требования разных индексов).
...
Рейтинг: 0 / 0
Алгоритм Дейкстры на MS SQL Server
    #38969799
PG81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кот Матроскин,

по идее граф будет меняться редко, ну раз в мес или реже.
и связей достаточно много, кусок схемы на рисунке
...
Рейтинг: 0 / 0
Алгоритм Дейкстры на MS SQL Server
    #38970038
PG81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
придумал, рекурсивную функцию
оказалось уровень вложенности не должен превышать 32(((
Как то нужно от нее теперь избавится блин
...
Рейтинг: 0 / 0
Алгоритм Дейкстры на MS SQL Server
    #38970052
VRafael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PG81, привет!

Я как-раз в прошлом году работал над такой задачей. Также граф с плечами/маршрутами, расчет пути алгоритмом Дейкстры.
Когда сильно увеличился поток отправлений все уперлось в расчет маршрутов, т.к. для каждого отправления был постоянный перерасчет. Пока пробовали разные варианты оптимизации (которые, если честно, не сильно помогли), я продавил вариант с кэширование. На разработку с тестированием ушло всего несколько дней, т.к. ничего сложного в нем нет. Зато после этого как рукой сняло

Как сделано:
Весь кэш сбрасывается при вводе и выводе маршрутов в действие
Желательно минимизировать частоту таких операций, или группировать их в пакеты.

Наполнение кэша по мере необходимости
Ищем путь для отправления в кэше, если нет - рассчитываем и записывам туда (перед добавлением учтите, что другая тразнакция может делать в этот момент тоже самое!). Этот подход позволяет распределить нагрузку равномерно, в отличие от полного пересчета всех путей после сброса кэша.

Проверил, на текущий момент

1593 точки

5221 маршрута

6542 плеча
В принципе немного, но если пересчитывать маршрут десятки (если не сотни) тысяч раз в день, то лишняя нагрузка будет ощутима!
...
Рейтинг: 0 / 0
Алгоритм Дейкстры на MS SQL Server
    #38970057
churupaha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PG81,

вот тут вам дали годный совет

AkinaА почему обязательно на SQL-сервере? задача-то больше подходит для решения на стороне клиента...

оффтоп может натолкнет на мыслиесли и нтересно для анализа сетей у Oracle сначала было PL/SQL API в рамках Oracle Topology Network, а потом они алгоритмы, связанные с анализом сети вынесли в java class'ы для сервера приложения. и на момент 11 g там было два API PL/SQL и Java. Причем для Java API они сделали специальный партишнинг сети (графа) в базе и куски сети хранят в блобах. Java' итератор когда пробегает по сети подкачивает эти блобы и есть кеширование там и т. п.. также можно зарегистрировать своего "визитора" и обрабатывать OnEdge/OnVertex и т. п..

тынц
тынц
...
Рейтинг: 0 / 0
Алгоритм Дейкстры на MS SQL Server
    #38970060
VRafael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PG81,

Только сейчас увидел что ты из Твери.. Не из Интернет-Решений случайно?
...
Рейтинг: 0 / 0
Алгоритм Дейкстры на MS SQL Server
    #38970069
VRafael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PG81,

На скуле желательно такое пилить на свежем In-Memory OLTP (Hekaton) если версия позволяет (SQL Server 2014 Enterprise).
...
Рейтинг: 0 / 0
Алгоритм Дейкстры на MS SQL Server
    #39039514
Ага
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Топикстартеру - удалость решить задачу?
Встала похожая задача, только усложненная поиском оптимальной с точки зрения расстояния ячейки для размещения и всякими нюансами вроде включения в расчет костов на разворот техники при смене направления движения, стоимости подъема на уровень и повышенной стоимости прохода через определенные зоны склада (перемещение в другой блок склада штрафуется)
...
Рейтинг: 0 / 0
Алгоритм Дейкстры на MS SQL Server
    #39039665
Ага
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Похоже ТС все решил почитает на лаврах :).
По сабжу:
Считать маршрут от каждой ячейки к каждой на складе с количеством ячеек более 100 тысяч смысла не имеет, тем более для включения пробега и трудоемкости операций как одного из коэффициентов целевой функции размещения.
Надо упрощать
В итоге весь склад разбил на области, включая z координату, определил смежный области, весь пол просчитал алгоритмом распространения волны, включив дополнительную стоимость прохода дефицитных областей (переходы, лифты) и количество разворотов техники в расчет. Алгоритм неидеален, из-за отсечения маршрутов с бОльшей стоимостью на каждому этапе отсекает потенциально более дешевые по разворотам маршруты, но для моих целей вполне достаточен. Оптимальный маршрут из области в область всегда, исключение - перемещение в соседний проход при наличии дорожек сверху и снизу.
В конечном варианте стоимость перемещения топология ячеек внутри области накладывается на стоимость перемещений между областями и выбирается наилучший вариант.
...
Рейтинг: 0 / 0
Алгоритм Дейкстры на MS SQL Server
    #39068894
PG81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ага,

Если есть вопросы задавай, чуть позже расскажу как сам сделал.
...
Рейтинг: 0 / 0
Алгоритм Дейкстры на MS SQL Server
    #39069101
Дейкстра1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На оптимальность не претендую, получилось что-то вроде такого:

Таблица и заполнение:
Код: 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.
CREATE TABLE [dbo].[links](
	[link_id] [int] IDENTITY(1,1) NOT NULL,
	[node1_id] [int] NOT NULL,
	[node2_id] [int] NOT NULL,
	[weight] [int] NULL,
	[id_min]  AS (case when [node1_id]<[node2_id] then [node1_id] else [node2_id] end),
	[id_max]  AS (case when [node1_id]>[node2_id] then [node1_id] else [node2_id] end),
	[descr] [nvarchar](max) NULL,
PRIMARY KEY CLUSTERED 
(
	[link_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
UNIQUE NONCLUSTERED 
(
	[id_min] ASC,
	[id_max] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]


insert into dbo.links
		 (node1_id, node2_id, weight, descr)
SELECT * 
FROM (
VALUES 
(1,6,14,NULL),
(1,3,9,NULL),
(1,2,7,NULL),
(6,5,9,NULL),
(6,3,2,NULL),
(3,4,11,NULL),
(3,2,10,NULL),
(2,4,15,NULL),
(4,5,6,NULL)) AS vtable 
([node1_id],[node2_id],[weight],[descr])



Поиск:
Код: 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.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
declare
   @step_id int = 2
  ,@max_recurtion int = 10
  ,@first_node int = 1
  ,@last_node int = 5


declare	@t table (
	deep int
   ,node1_id int
   ,node2_id int
   ,[root] nvarchar(max)
   ,[weight] int
   ,first_node int
   ,last_node as (case when charindex(',', [root]) > 0
					   then cast(substring(reverse([root]), 0, charindex(',', [root])) as integer)
					   else 0
				  end)
   )

insert	 into @t
		 (
		  deep
		 ,node1_id
		 ,node2_id
		 ,[root]
		 ,[weight]
		 ,first_node
		 )
		 select
			1
		   ,node1_id
		   ,node2_id
		   ,cast(node1_id as nvarchar(8)) + ',' + cast(node2_id as nvarchar(8))
		   ,l.[weight]
		   ,l.node1_id
		 from
			links l


while @step_id < @max_recurtion 
   begin 

	  insert   into @t
			   (
				deep
			   ,node1_id
			   ,node2_id
			   ,[root]
			   ,[weight]
			   ,first_node
			   )
			   select
				  @step_id
				 ,t.node2_id
				 ,l.node2_id
				 ,t.[root] + ',' + cast(l.node2_id as nvarchar(8))
				 ,t.[weight] + l.[weight]
				 ,t.first_node
			   from
				  @t t
				  inner join links l
					 on t.node2_id = l.node1_id
						and l.node2_id <> t.node1_id
			   where
				  t.deep = @step_id - 1

	  if @@rowcount = 0 
		 break;

	  set @step_id = @step_id + 1
   end

select
   *
from
   @t t
where t.first_node = @first_node and t.last_node = @last_node
or t.first_node = @last_node and  t.last_node = @first_node
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Алгоритм Дейкстры на MS SQL Server
    #39894988
HAL39
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А кому-то еще интересен алгоритм, реализованный на MS SQL?
...
Рейтинг: 0 / 0
26 сообщений из 26, показаны все 2 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Алгоритм Дейкстры на MS SQL Server
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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