С Новым годом! Форум программистов, компьютерный форум, киберфорум
Haskell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
1 / 1 / 0
Регистрация: 18.02.2015
Сообщений: 15

Задача коммивояжёра

26.02.2015, 20:34. Показов 2111. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер, имеется код, находящий решение незамкнутого варианта данной задачи методом ближайшего соседа, какие коррективы необходимо внести, чтобы получать решение ЗАМКНУТОЙ (т.е. конечная и исходная точка должны совпадать) ?
Haskell
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
import Data.List
import qualified Data.List.Key as K
 
dist :: (Int, Int) -> (Int, Int) -> Float
dist (x1, y1) (x2, y2) = sqrt (f (x1 - x2) ** 2 + f (y1 - y2) ** 2)
    where f = fromIntegral
 
cost :: [(Int, Int)] -> Float
cost xs = sum $ zipWith dist xs (tail xs ++ xs)
 
nearTour :: [(Int, Int)] -> [(Integer, (Int, Int))]
nearTour = f . zip [0..] where
    f [] = []
    f [x] = [x]
    f ((i,p):ps) = (i,p) : f (nxt : delete nxt ps) where
        nxt = K.minimum (dist p . snd) ps
 
main :: IO ()
main = do let praxisTour = nearTour
                [(139, 31),( 41,126),(108, 49),(112,193),(179,188),
                 (212, 24),(245, 50),(167,187),(159,236),(185, 78),
                 ( 27, 63),(101,188),(195,167),( 30, 10),(238,110),
                 (221, 60),( 27,231),(146, 67),(249,172),( 36, 71),
                 ( 37,203),(118, 38),(241,226),(197, 29),(220,186)]
          print (cost $ map snd praxisTour, praxisTour)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.02.2015, 20:34
Ответы с готовыми решениями:

Задача коммивояжёра
Необходимо переделать задачу коммивояжёра методом поиска в ширину. Есть поиск в глубину (defvar GRAPH (list (list (list 1 5) (list 5...

Задача коммивояжера.
Может у кого-то есть решение задачи Коммивояжера (нужно посетить все вершины графа и вернуться в исходную с минимальными затратами) на...

Составить запрос. Задача Коммивояжера
Помогите, пожалуйста составить запрос к программе... ...

10
Модератор
 Аватар для Curry
5153 / 3464 / 536
Регистрация: 01.06.2013
Сообщений: 7,523
Записей в блоге: 9
27.02.2015, 00:32
Ну, у Вас же не оптимальное решение, так просто добавить путь домой от последней точки. Т.е. заменить последнюю строку на
Haskell
1
2
          print (cost (map snd praxisTour) + dist (snd $ last praxisTour) (snd $ head praxisTour),
                praxisTour++[head praxisTour])
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38163 / 21098 / 4306
Регистрация: 12.02.2012
Сообщений: 34,686
Записей в блоге: 14
27.02.2015, 09:57
Я верно понял суть? Есть набор точек плоскости, заданных координатами. Нужно соединить их в цикл так, чтобы длина ребер была минимальной... Так?
0
Модератор
 Аватар для Curry
5153 / 3464 / 536
Регистрация: 01.06.2013
Сообщений: 7,523
Записей в блоге: 9
27.02.2015, 10:03
Цитата Сообщение от Catstail Посмотреть сообщение
Я верно понял суть?
Задача коммивояжёра
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38163 / 21098 / 4306
Регистрация: 12.02.2012
Сообщений: 34,686
Записей в блоге: 14
27.02.2015, 10:31
KolodeznyDiver, я знаю, что такое задача коммивояжера на графе. Здесь же другая постановка - любую точку можно соединить с любой. Так?
0
Модератор
 Аватар для Curry
5153 / 3464 / 536
Регистрация: 01.06.2013
Сообщений: 7,523
Записей в блоге: 9
27.02.2015, 10:44
Цитата Сообщение от Catstail Посмотреть сообщение
любую точку можно соединить с любой. Так?
Очевидно же. в 16-ой строчке перебираются все оставшиеся точки и выбирается ближайшая.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38163 / 21098 / 4306
Регистрация: 12.02.2012
Сообщений: 34,686
Записей в блоге: 14
27.02.2015, 11:36
Тогда думаю, что решение можно немного улучшить, если прогонять этот метод для разных начальных точек, а потом выбрать минимальную длину.

Добавлено через 4 минуты
Кроме того, можно и несколько ускорить вычисления, если не извлекать квадратный корень (для минимизации результата не важно, что минимизировать положительное или его квадрат).
0
Модератор
 Аватар для Curry
5153 / 3464 / 536
Регистрация: 01.06.2013
Сообщений: 7,523
Записей в блоге: 9
27.02.2015, 11:55
Цитата Сообщение от Catstail Посмотреть сообщение
Кроме того, можно и несколько ускорить вычисления, если не извлекать квадратный корень
Нужно предварительно рассчитать все сочетания расстояний между точками, хранить в массиве, а то (!!) долго. Полным перебором с отсечением по длине уже найденного варианта. Мне сейчас, увы, некогда.
0
1 / 1 / 0
Регистрация: 18.02.2015
Сообщений: 15
27.02.2015, 15:53  [ТС]
Да, действительно, алгоритм ближайшего соседа не гарантирует оптимальность решения, что-то к вечеру уже и не подумал просто соединить точки.
По этой же теме. В книге Rabhi, Lapalme "Algorithms: A Functional Programming Approach" приводится вот такой алгоритм решения:
Haskell
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
80
81
82
83
type Set = Int
 
emptySet :: Set
emptySet = 0
 
setEmpty n = n==0
 
fullSet :: Int -> Int
fullSet n | (n >= 0) && (n <= maxSet) = 2^(n+1)-2 -- element 0 is not there...
          | otherwise = error ("Fullset : illegal set = " ++ show n)
 
addSet i s = d'*e+m
    where (d,m) = divMod s e
          e  = 2^i
          d' = if odd d then d else d+1
 
delSet i s = d'*e+m
    where (d,m) = divMod s e
          e = 2^i
          d' = if odd d then d-1 else d
 
set2List s = s2l s 0
    where s2l 0 _             = []
          s2l n i | odd n     = i : s2l (n `div` 2) (i+1)
                  | otherwise = s2l (n `div` 2) (i+1)
 
maxSet :: Int
--maxSet = truncate (logBase 2 2147483647.0) - 1
maxSet = truncate (logBase 2 (fromInteger (maxBound::Int))) - 1
 
-- start of TSP
 
type TspCoord = (Int,Set)
type TspEntry = (Int,[Int])
 
compTsp :: Graph Int Int -> Int -> Table TspEntry TspCoord 
                         -> TspCoord -> TspEntry 
compTsp g n a (i,k) 
    | setEmpty k = (weight i n g,[i,n])
    | otherwise = minimum [ addFst (findTable a (j, delSet j k))
                                   (weight i j g)
                            | j <- set2List k]
    where addFst (c,p) w = (w+c,i:p)
 
bndsTsp :: Int -> ((Int,Set),(Int,Set))
bndsTsp n =  ((1,emptySet),(n,fullSet n))
 
tsp :: Graph Int Int -> (Int,[Int])
tsp g = findTable t (n,fullSet (n-1))
    where n = length (nodes g)
          t = dynamic (compTsp g n) (bndsTsp n)
 
-- examples of graphs 
 
dm :: Graph Int Int
dm = mkGraph True (1,6) [(i,j,(v1!!(i-1))!!(j-1)) |i<-[1..6],j<-[1..6]]
v1 :: [[Int]]
v1 = [[  0,  4,  1,  6,100,100],
      [  4,  0,  1,100,  5,100],
      [  1,  1,  0,100,  8,  2],
      [  6,100,100,  0,100,  2],
      [100,  5,  8,100,  0,  5],
      [100,100,  2,  2,  5,  0]]
 
-- "Computer Algorithms" by Sara Baase and Allen Van Gelder, Fig. 13.15
bvg :: Graph Int Int
bvg = mkGraph True (1,4) [(i,j,(w!!(i-1))!!(j-1)) |i<-[1..4],j<-[1..4]]
 
w :: [[Int]]
w = [[ 0,  20, 15, 35],
     [ 20,  0, 10, 25],
     [ 15,  10, 0, 12],
     [ 35,  25, 12, 0]]
 
{-
Examples of evaluations and results 
 
tsp dm
(20, [6, 4, 1, 3, 2, 5, 6])
 
tsp bvg
(72,[4,2,1,3,4])
-}
Проблема в изобилии ошибок, которые он выдаёт из-за отсутствующих импортов модулей, возможно ли добавить необходимые библиотеки (ибо я ещё не силён в них), дабы обзавестись ещё решением задачи в копилку алгоритмов)

Добавлено через 6 минут
Тогда думаю, что решение можно немного улучшить, если прогонять этот метод для разных начальных точек, а потом выбрать минимальную длину.
Насколько же затянется в таком случае работа алгоритма?)
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38163 / 21098 / 4306
Регистрация: 12.02.2012
Сообщений: 34,686
Записей в блоге: 14
27.02.2015, 15:59
Цитата Сообщение от bl1nd_cat Посмотреть сообщение
Насколько же затянется в таком случае работа алгоритма?)
- а вы как хотели? Эта задача проста только с виду!
0
Модератор
 Аватар для Curry
5153 / 3464 / 536
Регистрация: 01.06.2013
Сообщений: 7,523
Записей в блоге: 9
27.02.2015, 16:22
Цитата Сообщение от bl1nd_cat Посмотреть сообщение
Проблема в изобилии ошибок, которые он выдаёт из-за отсутствующих импортов модулей
Вы просто не все кусочки из книжки собрали. И Graph, и mkGraph и пр. в разделе 7.2 описаны.

Добавлено через 7 минут
Цитата Сообщение от bl1nd_cat Посмотреть сообщение
Насколько же затянется в таком случае работа алгоритма?)
Если на встроенных в Haskell списках - то долго. А если иcпользовать библиотечные контейнеры, то быстро.
Вот пример решения не Вашей задачи - там граф. Но у Вас даже проще, хоть и медленнее получится.
Предлагаю задачку - поиск оптимального маршрута
(Да, Ваша задача, конечно тоже к графу сводится, но есть ли смысл)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.02.2015, 16:22
Помогаю со студенческими работами здесь

Задача коммивояжёра на Visual Prolog 7.5
Здравствуйте, необходимо решить задачу коммивояжёра для заданного графа средствами Visual Prolog 7.5. Нашел вот такое решение, но...

Задача коммивояжёра с возвратом в "магазин"
Вроде и тема раскрытая (код можно найти, для этой задачи), но что-то я застрял на retract(oil(To,Y)), По условию задачи продавец...

Переделать решение задачи коммивояжера
По примерам с других форумов написал ... ну как написал, сплагиатил и разобрался в коде :) решение задачи коммивояжера. ; поиск дороги...

Реализовать алгоритм решения задачи коммивояжера
дали задание: Реализовать алгоритм решения задачи коммивояжера. честно говоря, даже не знаю с какой стороны подойти. Гамильтонов цикл?...

Задача коммивояжёра
Нужно решить задачу коммивояжера (найти самый дешевый маршрут). Собственно вопрос по условию: по условию маршрут нужно найти между...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru