|
0 / 0 / 0
Регистрация: 14.04.2018
Сообщений: 1
|
|||||||||||
Что происходит в коде?14.04.2018, 17:05. Показов 2054. Ответов 5
Метки нет (Все метки)
Недавно начала изучать Haskell, и дошла до алгоритмов на графах. Идут очень тяжело. Нашла алгоритм Дейкстры, но не могу разобраться, что происходит в коде. А именно, не понятно, что передаётся в метод relax:
0
|
|||||||||||
| 14.04.2018, 17:05 | |
|
Ответы с готовыми решениями:
5
Объясните, что происходит в коде Объясните что происходит в коде Что происходит в этом коде? |
|
|
||||||||||||||||||||||||||||||||||||||||||||||
| 14.04.2018, 19:09 | ||||||||||||||||||||||||||||||||||||||||||||||
|
Ни одного комментария в коде. Такие люди не только сами страдают, но и другим способствуют.
Мне очень жалко своего потраченного времени, поэтому оставлю ответ ниже как есть с расшифровкой кода в самом низу, а Вам советую выкинуть этот код и найти нормальные примеры реализации алгоритма Дейкстры. Можете на этом форуме поискать, помнится мне, Catstail, KolodeznyDiver и прочие обсуждали различные реализации, которые написаны более понятно и прозрачно. Ладно, поехали:
Функция currDist проходится по списку visited слева направо и выбирает второй компонент u последней встречаемой пары вида (n, u), где n - аргумент функции. relax points visited для каждой тройки (x,y,z) из points сопоставляет (y, currDist x + z) и из этих значений собирает новый список той же длины, что points. Можно переписать в виде:
Переписанный и упрощенный вариант исходного кода
Теперь попытка угадать связь с предметной областью (теорией графов)
3
|
||||||||||||||||||||||||||||||||||||||||||||||
|
Супер-модератор
|
||||||||||||||||||||||||||||||||||||||||||||||
| 15.04.2018, 16:28 | ||||||||||||||||||||||||||||||||||||||||||||||
|
Дорогая Diana_Pos, вы неправильно ставите задачу. Изучать нужно либо алгоритм (реализацию на знакомом языке), либо язык (на примере знакомого алгоритма). Изучать незнакомый алгоритм на незнакомом языке крайне нерационально! Времени уйдет непропорционально много. Поэтому начнем с алгоритма Дейкстры. Этот алгоритм ищет кратчайшее расстояние от заданной вершины до всех остальных (в предположении, что в графе нет ребер отрицательного веса).
Пусть граф представлен матрицей смежности A, в которой элемент A[i,k] равен весу ребра i-k (если вершины i и k связаны) и бесконечности (если вершины не связаны). В качестве бесконечности можно взять достаточно большое число. Пусть массив Di содержит расстояния от заданной вершины i до всех остальных, взятое из матрицы смежности. Первоначально присваиваем всем элементам массива Di[k] значения A[i,k]; Элементу Di[i] присваиваем значение 0. Обозначим через T совокупность вершин графа без вершины i. Выполняем, пока T не пусто, следующие действия: - ищем в T вершину u, для которой величина Di[u] минимальна; - исключаем u из T; - для всех оставшихся вершин w из T вычисляем Di[w]=min(Di[w],Di[u]+A[u,w]) Теперь попробуем реализовать это в Haskell. В качестве базовой структуры данных будем использовать списки целых. Начнем с матрицы смежности:
входящие в t:
Далее нужно выполнить пересчет списка D:
Теперь можно организовать сам алгоритм Дейкстры:
2
|
||||||||||||||||||||||||||||||||||||||||||||||
|
Модератор
|
||||||||||||||||
| 17.04.2018, 21:58 | ||||||||||||||||
|
Мой вариант
Кликните здесь для просмотра всего текста
Граф задаётся списком рёбер, как в исходной задаче. Однако, граф не ориентированный. Для ориентированного нужно сделать некоторые упрощения. Вместо безликих кортежей используются записи. Используются вложенные функции с замыканиями. Изменение списков, в основном, вынесено в функции vxUpdate, vxRemove, grRemove. Это могло бы упростить переход от списков к другим контейнерам. Разумеется, никаких магических чисел означающих особые случаи. Для Haskell можно было бы использовать ADT, например Maybe, но и он не потребовался. Для функции dijkstra напрашивается применение монады Writer для накопления результата - списка просмотренных вершин. Подключаю пакет mtl (можно и transformers), добавляю
Кликните здесь для просмотра всего текста
2
|
||||||||||||||||
|
0 / 0 / 0
Регистрация: 02.01.2017
Сообщений: 17
|
|
| 13.11.2018, 17:22 | |
|
Добрый день,
Я новичек. Разбираю алгоритм Декстры на Вашем примере. Что-то не получается скомпилировать Ваш представленный код... Я про пример уважаемого Catstail. Добавлено через 8 минут parse error (possibly incorrect indentation or mismatched brackets) | 11 | startD :: [[Int]] -> [Int] -> [Int] | ^ Добавлено через 5 часов 4 минуты Проблема была в моем редакторе. Интересно как адаптировать данный код под поиск кратчайшего пути к определенной вершине.
0
|
|
| 13.11.2018, 17:22 | |
|
Помогаю со студенческими работами здесь
6
Объяснить, что происходит в коде Что происходит в коде в целом? Объяснить, что происходит в коде Rvalue reference. Что происходит в коде? Что происходит в переменных b и у в приведенном коде Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем.
. . .
|
|
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
|
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
|
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|