Главная Случайная страница


Полезное:

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


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Пример использования СТЕ для решения задачи Коммивояжера





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

385 420 470   375 335 305 320     240 205

Создадим таблицу и занесем данные:
CREATE TABLE TUR

(FROM_TOWN VARCHAR(32),

FROM_TOWN TO_TOWN MILES
PARIS NANTES  
PARIS CLERMONT-FERRAND  
PARIS LYON  
CLERMONT-FERRAND MONTPELLIER  
CLERMONT-FERRAND TOULOUSE  
LYON MONTPELLIER  
LYON MARSEILLE  
MONTPELLIER TOULOUSE  
MARSEILLE NICE  

TO_TOWN VARCHAR(32),

MILES INTEGER);

 

Возьмем в качестве начала рекурсии “Париж” и построим СТЕ


WITH

Результат  
TO-TOWN
PARIS
NANTES
CLERMONT-FERRAND
LYON
MONTPELLIER
MARSEILLE
NICE
TOULOUSE
MONTPELLIER
TOULOUSE
TOULOUSE

TUR_PARIS ([TO-TOWN])

AS

(SELECT DISTINCT FROM_TOWN

FROM TUR

WHER FROM_TOWN= 'PARIS'

UNION ALL

SELECT TO_TOWN

FROM TUR INNER JOIN TUR_PARIS

ON TUR_PARIS.[TO-TOWN] = TUR.FROM_TOWN

)

SELECT * FROM TUR_PARIS;

 

Как видно из результата запроса, существует три способа добраться до Тулузы. Отфильтруем пункт назначения.

WITH

Результат  
TO-TOWN
TOULOUSE
TOULOUSE
TOULOUSE

TUR_PARIS ([TO-TOWN])

AS

(SELECT DISTINCT FROM_TOWN

FROM TUR

WHER FROM_TOWN= 'PARIS'

UNION ALL

SELECT TO_TOWN

FROM TUR INNER JOIN TUR_PARIS

ON TUR_PARIS.[TO-TOWN] = TUR.FROM_TOWN

)

SELECT * FROM TUR_PARIS

WHERE [TO-TOWN] = 'TOULOUSE';

Мы можем уточнить этот запрос, подсчитав число шагов по каждому направлению, расстояния по различным направлениям и выведя списки городов, которые можно посетить, двигаясь по этим направлениям:

WITH

TUR_PARIS([TO-TOWN], STEPS, DISTANSE, WAY)

AS

(SELECT DISTINCT FROM_TOWN, 0, 0

,cast('PARIS' as VarChar(MAX))

FROM TUR

WHERE FROM_TOWN= 'PARIS'







Date: 2015-09-18; view: 371; Нарушение авторских прав



mydocx.ru - 2015-2024 year. (0.006 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию