|
0 / 0 / 0
Регистрация: 17.11.2021
Сообщений: 9
|
|
Кратчайший путь по графу17.11.2021, 12:29. Показов 6939. Ответов 17
Есть граф, все вершины соединены между собой, известны расстояния между каждой парой вершин. Также известна начальная вершина и конечная.
Нужно перейти от начальной до конечной вершины, посетив все остальные, при этом пройтись по кратчайшему пути. Помогите, пжлст, подобрать нужный алгоритм. А ещё лучше написать код с этим алгоритмом на Python, либо словесно детально описать его.
0
|
|
| 17.11.2021, 12:29 | |
|
Ответы с готовыми решениями:
17
Найти кратчайший путь
|
|
0 / 0 / 0
Регистрация: 17.11.2021
Сообщений: 9
|
|
| 17.11.2021, 13:36 [ТС] | |
|
Там не совсем граф. Координатная плоскость, даны координаты всех точек + координаты начальной и конечной, нужно пройти из начала в конец через все точки. Для проекта нужно, сформулированного задания нет. Расстояния между точками я могу найти и занести в матрицу, а что с этим всем дальше делать не понимаю.
0
|
|
|
0 / 0 / 0
Регистрация: 17.11.2021
Сообщений: 9
|
|
| 17.11.2021, 20:19 [ТС] | |
|
Это не всегда кратчайший путь, приведу пример: Начало 71;36, конец 8;18. Нужно посетить точки 12:45 и 79;90.
Если посещать ближайшие, то выйдет путь начало (71;36) > 12;45 > 79;90 > конец (8;18) А кратчайший путь будет путь начало (71;36) > 79;90 > 12;45 > конец (8;18) Потому и ищу алгоритм для нахождения кратчайшего пути :/
0
|
|
|
0 / 0 / 0
Регистрация: 17.11.2021
Сообщений: 9
|
|
| 17.11.2021, 22:46 [ТС] | |
|
Ошибочка вышла... Тогда за место 79, 90 возьмём 100,100
Как мне кажется, ближайший путь нужно искать исходя из того, что сначала нужно посетить все точки за начальной (отдаляясь от начальной и от конечной, причём до начальной расстояние меньше, чем до конечной). После пройтись по всем точкам между начальной и конечной. А далее пройтись по всем точкам за конечной и прийти в конечную. Но я не знаю по какому принципу посещать эти три группы точек так, чтобы в итоге получился кратчайший путь. Может быть всё-таки есть какой-нибудь подходящий алгоритм для графов?)
0
|
|
|
Супер-модератор
|
|
| 18.11.2021, 09:59 | |
|
Здесь действительно полный граф. Каждая вершина соединена с каждой. Искать кратчайший путь из A в Б можно алгоритмом Форда-Беллмана или Дейкстры. Но эти алгоритмы ищут кратчайший путь, который не обязан включать все вершины. Боюсь, что здесь - только прямой перебор (а это O(n!)). Cколько точек, кстати?
0
|
|
|
0 / 0 / 0
Регистрация: 17.11.2021
Сообщений: 9
|
|
| 18.11.2021, 15:52 [ТС] | |
|
Нет точного кол-ва, думаю, не более 100, а скорее и нескольких десятков хватит.
0
|
|
|
0 / 0 / 0
Регистрация: 17.11.2021
Сообщений: 9
|
||||||
| 18.11.2021, 17:19 [ТС] | ||||||
|
Ну, значит обойдусь парой десятков. У меня нет внешних ограничений, делаю скорее для себя.
Пытаюсь решить перебором так, как умею, но ничего не выходит.
При 71 36 8 18 2 12 45 100 100 выдаёт 0, 1, 1 Почему-то хочет одну из точек посетить два раза.. Добавлено через 1 минуту Да и вообще там ответ должен быть 1 0 Добавлено через 3 минуты Добавив между 73 и 74 строкой pro = [], кажется.. Заработало верно ![]() Добавлено через 38 секунд Не знаю, правда, как насчёт производительности всего этого безобразия Добавлено через 11 минут Всё равно неверно работает( 94 58 30 0 3 56 13 41 48 41 45 Выдаёт 0,1,2, но как минимум один путь меньше есть: 120 Добавлено через 22 минуты Там из-за вложенности функций значение переменных меняется сразу везде((
0
|
||||||
|
0 / 0 / 0
Регистрация: 17.11.2021
Сообщений: 9
|
|
| 19.11.2021, 13:06 [ТС] | |
|
А по времени примерно сколько? И как всё-таки реализовать?
0
|
|
|
0 / 0 / 0
Регистрация: 17.11.2021
Сообщений: 9
|
|||||||||||
| 20.11.2021, 23:55 [ТС] | |||||||||||
|
Всё пытаюсь решить прямым перебором, но возникла проблема. Решаю рекурсией, при переходе из функции в функцию с глобальным pro_mn творится что-то непонятное, он меняется вместе с локальным pro, как исправить? Не пойму, что с ним не так.
(def funk) Нужно сохранять pro_mn
Более актуальный код:
0
|
|||||||||||
|
1956 / 874 / 352
Регистрация: 05.09.2021
Сообщений: 1,387
|
|
| 21.11.2021, 00:45 | |
|
TangerineLeaf, Судя по описанию, ваша задача называется "задачей коммивояжёра". Можете погуглить, есть различные варианты ее решения. На сколько я помню, однозначно точное решение у этой задачи есть, только методом перебора, но оно крайне неэффективно по времени. Но есть и эффективные методы, которые дают результат с приемлемой точностью.
0
|
|
|
Супер-модератор
|
|
| 21.11.2021, 07:52 | |
Сообщение было отмечено TangerineLeaf как решение
Решение
anton78spb, Да это задача коммивояжера по полному графу. Поэтому бэктрекинг здесь выродится в полный перебор. О чем я и писал
1
|
|
|
1956 / 874 / 352
Регистрация: 05.09.2021
Сообщений: 1,387
|
|
| 21.11.2021, 10:11 | |
|
Catstail, Именно так. И сложность полного перебора там вроде O(n!).
0
|
|
| 21.11.2021, 10:11 | |
|
Помогаю со студенческими работами здесь
18
Найти кратчайший путь между точками Найти самый кратчайший путь к вершине графа Кратчайший путь в графе Вычислить кратчайший путь Найти кратчайший путь по страницам википедии Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y
Z4Tv2zpXVVo
https:/ / github. com/ shumilovas/ med2. git
|
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа.
В качестве фильтра для отбора справочника служит группа номенклатуры.
Отбор по наименованию группы. . .
|
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
|
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс.
Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
|
|
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа.
В качестве фильтра для отбора служит значение перечислений.
/ / Событие "НачалоВыбора" реквизита на форме. . .
|
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
|
Оттенки серого
Argus19 18.03.2026
Оттенки серого
Нашёл в интернете 3 прекрасных модуля:
Модуль класса открытия диалога открытия/ сохранения файла на Win32 API;
Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
|
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-rectangles-sdl3-c. zip
finish-rectangles-sdl3-cpp. zip
|