Найти Гамильтонову цепь в непрерывном графе - 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, [Новая_вершина | Текущий_путь], Путь).

Объяснение кода листинга программы

  1. Гамильтонова цепь в непрерывном графе - это последовательность вершин, которую можно пройти таким образом, что для каждой вершины она содержит все смежные вершины (вершины, связанные с данной ребрами).
  2. В коде используется два метода: гамильтонова_цепь и гамильтонов_цикл.
  3. Метод гамильтонова_цепь используется для поиска Гамильтоновой цепи в непрерывном графе.
  4. Метод гамильтонов_цикл используется для поиска Гамильтонова цикла в непрерывном графе.
  5. В методе гамильтонова_цепь_рекурсивно происходит рекурсивный вызов метода для каждой вершины, которую нужно посетить.
  6. В методе гамильтонов_цикл_рекурсивно происходит рекурсивный вызов метода для каждой вершины, которую нужно посетить.
  7. В обоих методах используется базовый случай, когда количество вершин равно количеству ребер в цикле.
  8. В обоих методах используется условие, чтобы проверить, является ли текущая вершина ребра частью текущего пути.
  9. Если текущая вершина является ребра, то происходит рекурсивный вызов метода с новым хвостом и новым количеством ребер.
  10. Если текущая вершина является вершиной, то происходит рекурсивный вызов метода с новым хвостом и без изменения количества ребер.
  11. Для гамильтонова цикла неважно, с какой вершины начинать, поэтому используется оператор !.
  12. В обоих методах используется стек для хранения вершин, которые нужно посетить.
  13. В обоих методах используется список для хранения пути.
  14. Количество ребер в цикле не должно превышать количество вершин в графе.
  15. Для гамильтонова цикла необходимо, чтобы начальная вершина была связана с каждой другой вершиной.
  16. В обоих методах используется рекурсия для обхода всех вершин графа.
  17. В обоих методах используется условие, чтобы проверить, является ли текущая вершина ребра частью текущего пути.
  18. Если текущая вершина является ребра, то происходит рекурсивный вызов метода с новым хвостом и новым количеством ребер.
  19. Если текущая вершина является вершиной, то происходит рекурсивный вызов метода с новым хвостом и без изменения количества ребер.
  20. В обоих методах используется стек для хранения вершин, которые нужно посетить.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.778 из 5
Похожие ответы