|
0 / 0 / 0
Регистрация: 17.11.2021
Сообщений: 9
|
|
Кратчайший путь по графу17.11.2021, 12:29. Показов 6947. Ответов 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
Найти кратчайший путь между точками Найти самый кратчайший путь к вершине графа Кратчайший путь в графе Вычислить кратчайший путь Найти кратчайший путь по страницам википедии Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
|
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений.
9TO2GP2bpX4
a42b81fb172ffc12ca589c7898261ccb/
https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/
Слева синяя линия -. . .
|
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. .
Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
|
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-text-sdl3-c. zip
finish-text-sdl3-cpp. zip
|
|
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
|
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo
Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло.
Но на выплатах по больничным это. . .
|
Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
|
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y
Z4Tv2zpXVVo
https:/ / github. com/ shumilovas/ med2. git
|