47866 (Определение связности графа на Лиспе)

2016-07-30СтудИзба

Описание файла

Документ из архива "Определение связности графа на Лиспе", который расположен в категории "". Всё это находится в предмете "информатика" из 1 семестр, которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "курсовые/домашние работы", в предмете "информатика, программирование" в общих файлах.

Онлайн просмотр документа "47866"

Текст из документа "47866"

РЕФЕРАТ

Пояснительная записка к курсовой работе содержит 16 страниц, 9 рисунков, 3 источника литературы, 2 приложения.

Темой работы является написание программы на XLisp, определяющей, является ли данный неориентированный граф связным.

Целью работы является приобретение навыков и методов программирования достаточно сложных задач на языках логического программирования, а также подготовка к выполнению дипломного проекта.

Ключевые слова: программа, алгоритм, поиск, вершина, ребро, граф, связанность, путь, список, функция.

СОДЕРЖАНИЕ

Введение

1 Анализ задачи

2 Обоснование выбора алгоритма и структур данных

3 Описание алгоритма

4 Обоснование набора тестов

Заключение

Список литературы

Приложение 1. Текст программы

Приложение 2. Результаты работы программы

ВВЕДЕНИЕ

Двоичные деревья играют весьма важную роль в теории информации.

Предположим, что определенное число сообщений требуется закодировать в виде конечных последовательностей различной длины, состоящих из нулей и единиц. Если вероятности кодовых слов заданы, то наилучшим считается код, в котором средняя длина слов минимальна по сравнению с прочими распределениями вероятности. Задачу о построении такого оптимального кода позволяет решить алгоритм Хаффмана.

Двоичные кодовые деревья допускают интерпретацию в рамках теории поиска. Каждой вершине при этом сопоставляется вопрос, ответить на который можно либо "да", либо "нет". Утвердительному и отрицательному ответу соответствуют два ребра, выходящие из вершины. "Опрос" завершается, когда удается установить то, что требовалось. Таким образом, если кому-то понадобится взять интервью у различных людей, и ответ на очередной вопрос будет зависеть от заранее неизвестного ответа на предыдущий вопрос, то план такого интервью можно представить в виде двоичного дерева.

Еще недавно одной из наиболее сложных и утомительных задач для радиолюбителей было конструирование печатных схем.

Печатной схемой называют пластинку из какого-либо диэлектрика, на которой в виде металлических полосок вытравлены дорожки. Пересекаться дорожки могут только в определенных точках, куда устанавливаются необходимые элементы (диоды, триоды, резисторы и другие), их пересечение в других местах вызовет замыкание электрической цепи.

В ходе решения этой задачи необходимо вычертить плоский граф, с вершинами в указанных точках.

Можно привести множество примеров, неопровержимо доказывающих практическую ценность теории графов.

Темой работы является написание программы на XLisp, определяющей, является ли данный неориентированный граф связным. Целью работы является приобретение навыков и методов программирования достаточно сложных задач на языках логического программирования, а также подготовка к выполнению дипломного проекта.

1 Анализ задачи

В данной работе необходимо написать программу на языке XLisp, определяющую, является ли данный неориентированный граф связным. Для этого необходимо запрограммировать предварительно предикат (path X Y), проверяющий, существует ли путь из вершины X в вершину Y.

Говорят, что задан неориентированный граф G, если заданы два множества:

- непустое множество V={v1,..., vn} - множество вершин графа;

- множество Q неупорядоченных пар (vi, vj), где vi, vj V. Это множество называется множеством рёбер графа. Очевидно, что (vi, vj) Q (vj, vi) Q, причем это одно и то же ребро.

Путем от vi до vj называется такая последовательность ребер графа, ведущая от vi к vj , в которой два соседних ребра имеют общую вершину и никакое ребро не встречается дважды.

Две вершины графа называются связными, если в графе существует путь с концами в этих вершинах, и несвязными в противном случае.

Граф называется связным, если любые две его вершины связны, и несвязным в противном случае.

2 Обоснование выбора алгоритма и структур данных

Для определения связности графа используется поиск пути от одной вершины к другой. Граф является связным, если все вершины связаны между собой. Можно утверждать, что граф является связным, если одну из вершин можно соединить со всеми другими путем. Алгоритм определения связности графа заключается в поиске пути от первой вершины ко всем остальным. Если все пути можно найти – значит граф связный.

Поиск пути от одной вершины к другой будет выполняться по алгоритму поиска в ширину. Схема алгоритма изображена на рисунке 2.1.

Рис.2.1 – Схема алгоритма поиска в ширину

Поиск вершин, смежных с новыми вершинами выполняется так:

а) Если список ребер пустой – выход.

б) Берется первое ребро в списке ребер.

в) Если одна из вершин ребра находится в списке новых вершин, а вторая не входит ни в список новых вершин, ни в список найденных вершин, то вершина добавляется в список смежных вершин.

г) Удалить из списка ребер первое ребро и перейти к пункту а.

Граф представляется двумя множествами (списками): списком вершин и списком ребер. Каждое ребро – это список из двух вершин. Данный выбор обосновывается тем, что списки являются основным способом представления множеств данных.

3 Описание алгоритма

Были разработаны следующие функции (текст программы приведен в приложении 1).

Функция smezver (x y snaid snov) – определяет, является ли вершина y смежной с одной из новых вершин (x – входит в список новых вершин, y – не входит в списки новых и найденных вершин).

Параметры:

- x - первая вершина ребра;

- y - вторая вершина ребра;

- snaid - список найденных вершин;

- snov - список новых вершин.

Функция smez (snaid snov sreb) - поиск смежных с новыми вершинами вершин.

Параметры:

- snaid - список найденных вершин;

- snov - список новых вершин;

- sreb - список ребер.

Функция shir(snaid snov y sreb) - поиск в ширину пути.

Параметры:

- snaid - список найденных вершин;

- snov - список новых найденных вершин;

- y - вершина для поиска;

- sreb - список ребер.

Функция path(x y sreb) – поиск пути от вершины x к вершине y.

Параметры:

- x - первая вершина;

- y - вторая вершина;

- sreb - список ребер.

Функция perebor(fver sver sreb) - перебор вершин и поиск пути от первой вершины ко всем остальным.

Параметры:

- fver - первая вершина;

- sver - список вершин:

- sreb - список ребер.

Функция svgraf(sver sreb) - определение связанности графа.

Параметры:

- sver - список вершин;

- sreb - список ребер.

4 Обоснование набора тестов

При тестировании используются следующие тесты:

Рис.4.1 – Тест 1. Связанный граф

Рис. 4.2 – Тест 2. Связанный граф

Рис. 4.3 – Тест 3. Несвязанный граф

Рис. 4.4 – Тест 4. Связанный граф

Рис. 4.5 – Тест 5. Несвязанный граф

Рис. 4.6 – Тест 6. Связанный граф

Рис. 4.7 – Тест 7. Несвязанный граф

Рис. 4.8 – Тест 8. Несвязанный граф

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

При тестировании все тесты были выполнены успешно. Результаты работы программы приведены в приложении 2.

ЗАКЛЮЧЕНИЕ

В данной работе написана программа на XLisp, определяющей, является ли данный неориентированный граф связным.

Все поставленные цели выполнены: приобретены навыки и методы программирования достаточно сложных задач на языках логического программирования, а также проведена подготовка к выполнению дипломного проекта.

Программа отлажена и протестирована.

СПИСОК ЛИТЕРАТУРЫ

1 Лутай В.Н. Программирование на языках Лисп и Пролог. ТРТУ,1998.

2 Филд А., Харрисон П. Функциональное программирование. - М.: Мир, 1993.

3 Уилсон Р. Введение в теоpию гpафов. - М.: Миp, 1977.

ПРИЛОЖЕНИЕ 1

Текст программы

; смежная вершина (первая вершина ребра, вторая вершина ребра,

; список найденных вершин, список новых вершин)

(defun smezver(x y snaid snov)

(cond

((not (member x snov)) nil) ;x не является новой вершиной

((member y snov) nil) ;y является новой вершиной

((member y snaid) nil) ;y является ранее найденной вершиной

(t t))) ;вершина является новой смежной вершиной

;поиск смежных вершин (список найденных вершин, список новых вершин, список ребер)

(defun smez(snaid snov sreb)

(cond

((null sreb) nil) ;конец поиска

((smezver (caar sreb) (cadar sreb) snaid snov) ;смежная вершина

(cons (cadar sreb) (smez snaid snov (cdr sreb)))) ;добавление в список

((smezver (cadar sreb) (caar sreb) snaid snov) ;смежная вершина

(cons (caar sreb) (smez snaid snov (cdr sreb)))) ;добавление в список

(t (smez snaid snov (cdr sreb))))) ;пропуск ребра

;поиск в ширину (список найденных вершин, список новых найденных вершин,

; вершина для поиска, список ребер)

(defun shir(snaid snov y sreb)

(cond

((null snov) nil) ;не найдено ни одной новой вершины

((member y snov) t) ;вершина найдена

(t (shir (append snaid snov) (smez snaid snov sreb) y sreb)))) ;добавление новых вершин

;поиск пути (первая вершина, вторая вершина, список ребер)

(defun path(x y sreb)

(shir nil (list x) y sreb)) ;поиск в ширину

;перебор вершин (первая вершина, список вершин, список ребер)

(defun perebor(fver sver sreb)

(cond

((null sver) t) ;конец перебора

((path fver (car sver) sreb) (perebor fver (cdr sver) sreb)) ;путь найден

(t nil))) ;нет пути

;определение связанности графа(список вершин, список ребер)

(defun svgraf(sver sreb)

(perebor (car sver) (cdr sver) sreb)) ;перебор вершин и поиск пути от первой вершины ко всем остальным

ПРИЛОЖЕНИЕ 2

Результаты работы программы

Тест: 1

Выражение: (svgraf '(v1 v2 v3 v4) '((v1 v2) (v2 v3) (v3 v4)))

Результат: Т

Тест: 2

Выражение: (svgraf '(v1 v2 v3 v4) '((v1 v2) (v2 v4) (v2 v3) (v3 v4) (v1 v4) (v3 v4)))

Результат: T

Тест: 3

Выражение: (svgraf '(v1 v2 v3 v4 v5 v6 v7) '((v1 v2)(v2 v3)(v1 v3)(v4 v5)(v4 v7)(v5 v6)(v6 v7)))

Результат: NIL

Тест: 4

Выражение: (svgraf '(v1 v2 v3 v4 v5 v6) '((v1 v7)(v2 v7)(v3 v7)(v4 v7)(v5 v7)(v6 v7)(v1 v1)(v2 v2)(v3 v3)(v4 v4)(v5 v5)(v6 v6)))

Результат: T

Тест: 5

Выражение: (svgraf '(v1 v2 v3 v4) '((v1 v2)(v1 v2)(v3 v4)(v3 v4)))

Результат: NIL

Тест: 6

Выражение: (svgraf '(v1) nil)

Результат: T

Тест: 7

Выражение: (svgraf '(v1 v2 v3) nil)

Результат: NIL

Тест: 8

Выражение: (svgraf '(v1 v2 v3 v4) '((v1 v2) (v2 v3) (v3 v1)))

Результат: NIL

Свежие статьи
Популярно сейчас
Зачем заказывать выполнение своего задания, если оно уже было выполнено много много раз? Его можно просто купить или даже скачать бесплатно на СтудИзбе. Найдите нужный учебный материал у нас!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5160
Авторов
на СтудИзбе
439
Средний доход
с одного платного файла
Обучение Подробнее