Найти Гамильтонову цепь в непрерывном графе - Prolog
Формулировка задачи:
Найти Гамильтонов цепи в непрерывном графе
Решение задачи: «Найти Гамильтонову цепь в непрерывном графе»
textual
Листинг программы
гамильтонова_цепь(Граф, Путь) :- число_вершин(Граф, N), вершина(Граф, Начальная_вершина), гамильтонова_цепь_рекурсивно(Граф, N, 1, [Начальная_вершина], Путь). гамильтонова_цепь_рекурсивно(_, N, N, Путь, Путь) :- !. гамильтонова_цепь_рекурсивно(Граф, N, K, Текущий_путь, Путь) :- Текущий_путь = [Текущая_вершина|Хвост], ребро(Граф, Текущая_вершина, Новая_вершина), not(member(Новая_вершина, Текущий_путь)), K1 is K + 1, гамильтонова_цепь_рекурсивно(Граф, N, K1, [Новая_вершина | Текущий_путь], Путь). гамильтонов_цикл(Граф, Путь) :- число_вершин(Граф, N), вершина(Граф, Начальная_вершина), !, %% <- для гамильтонова цикла неважно, с какой вершины его начинать гамильтонов_цикл_рекурсивно(Граф, Начальная_вершина, N, 1, [Начальная_вершина], Путь). гамильтонов_цикл_рекурсивно(Граф, Начальная_вершина, N, N, Путь, Путь) :- !, ребро(Граф, Текущая_вершина, Начальная_вершина). гамильтонов_цикл_рекурсивно(Граф, Начальная_вершина, N, K, Текущий_путь, Путь) :- Текущий_путь = [Текущая_вершина|Хвост], ребро(Граф, Текущая_вершина, Новая_вершина), not(member(Новая_вершина, Текущий_путь)), K1 is K + 1, гамильтонов_цикл_рекурсивно(Граф, Начальная_вершина, N, K1, [Новая_вершина | Текущий_путь], Путь).
Объяснение кода листинга программы
- Гамильтонова цепь в непрерывном графе - это последовательность вершин, которую можно пройти таким образом, что для каждой вершины она содержит все смежные вершины (вершины, связанные с данной ребрами).
- В коде используется два метода: гамильтонова_цепь и гамильтонов_цикл.
- Метод гамильтонова_цепь используется для поиска Гамильтоновой цепи в непрерывном графе.
- Метод гамильтонов_цикл используется для поиска Гамильтонова цикла в непрерывном графе.
- В методе гамильтонова_цепь_рекурсивно происходит рекурсивный вызов метода для каждой вершины, которую нужно посетить.
- В методе гамильтонов_цикл_рекурсивно происходит рекурсивный вызов метода для каждой вершины, которую нужно посетить.
- В обоих методах используется базовый случай, когда количество вершин равно количеству ребер в цикле.
- В обоих методах используется условие, чтобы проверить, является ли текущая вершина ребра частью текущего пути.
- Если текущая вершина является ребра, то происходит рекурсивный вызов метода с новым хвостом и новым количеством ребер.
- Если текущая вершина является вершиной, то происходит рекурсивный вызов метода с новым хвостом и без изменения количества ребер.
- Для гамильтонова цикла неважно, с какой вершины начинать, поэтому используется оператор
!
. - В обоих методах используется стек для хранения вершин, которые нужно посетить.
- В обоих методах используется список для хранения пути.
- Количество ребер в цикле не должно превышать количество вершин в графе.
- Для гамильтонова цикла необходимо, чтобы начальная вершина была связана с каждой другой вершиной.
- В обоих методах используется рекурсия для обхода всех вершин графа.
- В обоих методах используется условие, чтобы проверить, является ли текущая вершина ребра частью текущего пути.
- Если текущая вершина является ребра, то происходит рекурсивный вызов метода с новым хвостом и новым количеством ребер.
- Если текущая вершина является вершиной, то происходит рекурсивный вызов метода с новым хвостом и без изменения количества ребер.
- В обоих методах используется стек для хранения вершин, которые нужно посетить.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д