Создание бесплатной программы для тестирования студентов
Основные используемые переменные, константы, процедуры и функции. Нахождение максимальной клики в заданном неориентированном графе с помощью алгоритма Брона-Кербоша. Отслеживание правильности использованного алгоритма и заполнения матрицы смежности.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 14.02.2020 |
Размер файла | 215,0 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Содержание
1. Введение
2. Индивидуальное задание
3. Стратегия решения
3.1 Краткая теория
3.2 Реализованный алгоритм
4. Рабочий проект
4.1 Основные используемые переменные, константы, процедуры и функции
5. Руководство пользователя
6. Листинг
7. Примеры работы программы (скриншоты)
8. Тестирование и отладка программы
1.
1. Введение
Графы имеют очень большое значение во многих областях науки. Они помогают решить большое количество задач, связанных с вычислительной техникой. Очень часто алгоритмы для решения задач на графах реализуются на ЭВМ. Это связано с тем, что на практике решения таких задач могут быть очень громоздкими и занимают много времени. Чтобы решить эти проблемы, а также повысить точность вычислений решение подобных задач эффективнее всего реализовать на ЭВМ.
Для разработки программы, которая решает задачи на графах требуются большие знания в области дискретной математики, компьютерной графики и программирования, так как алгоритмы решений являются сложными логическими системами и требуют создания комплексных структур данных.
Это все позволит студенту получить хороший опыт и навыки при работе с подобными приложениями.
В этой курсовой работе данная задача решается с использованием языка программирования Delphi.
2. Индивидуальное задание
Вариант №24
Для заданного неориентированного графа найти максимальный по включению полносвязный подграф.
3. Стратегия решения
3.1 Краткая теория
В теории графов кликой неориентированного графа называется подмножество его вершин, любые две из которых соединены ребром. Клики имеют очень важное значение в теории графов и используются во многих других математических задачах. Также клики изучаются и в информатике. Несмотря на всю сложность, изучаются большое количество алгоритмов для поиска клик [1].
Изучение полных подграфов началось ещё с формулировки теоремы Рамсея в терминах теории графов Эрдёшем и Секерешем. Сам термин «клика» был введен при работе Люка и Пери, использовавшие полные подграфы при изучении социальных сетей для создания клики людей, то есть групп людей, которые знакомы друг с другом [4].
3.2 Реализованный алгоритм
Для решения поставленной задачи было необходимо использовать алгоритм, с помощью которого программа искала бы максимальную клику в заданном неориентированном графе. Был реализован алгоритм Брона - Кербоша для нахождения клик. Алгоритм хорош тем, что он достаточно понятен и относительно не сложен для реализации.
Пусть задан неориентированный граф G1 матрицей смежностей M1
Рис. 3.1 Неориентированный граф и матрица смежностей
Если выделить клику из этого графа и представить ее в виде матрицы смежностей, то получим матрицу вида:
Видим, что эта подматрица также симметрична относительна главной диагонали, и в верхнем и в нижнем ее треугольниках будут находятся единицы, а на главной диагонали нули.
Чтобы найти клику в неориентированном графе необходимо выделить подматрицы, такие как указаны выше, в матрице смежностей. Множество вершин, образующее эту матрицу и будет множеством вершин клики. Так как исходная матрица смежностей симметрична относительно главной диагонали, то поиск подматриц будет осуществляться только в ее верхнем или нижнем треугольнике [2-3].
Шаг 1.
Двигаемся по матрице как показано на рис. 3.1 в поисках первой попавшийся единицы. Запоминаем ее координаты (R,C).
Рис. 3.2 Пример работы алгоритма
Шаг 2.
Двигаемся в поисках следующей единицы по адресу (R,C1)
Шаг 3.
Начинаем спускаться по столбцу (С1) для нахождения единицы, причем искать ее нужно по адресу (С,С1), так как в исходной матрице столбцы попарно смежных вершин не обязательно соседствуют. Запоминаем строку каждой найденной таким образом единицы для поиска в следующих столбцах. Увеличиваем длину множества вершин на 1.
Количество повторений Шага 3 равно текущему размеру множества вершин.
Если по указанному адресу мы не встречаем единицы, значит данный столбец не образует подматрицу смежностей клики - пропускаем его. Начинаем Шаг 2.
Если размер множества вершин образующих клику больше 2 то запоминаем это множество.
Так до конца строки.
Повторяем Шаг 1 для всех единиц в строке.
Таким образом проходим всю матрицу. На выходе получаем несколько множеств вершин, отбираем среди них только оригинальные, не содержащие в себе других подмножеств.
Отобранные подмножества и есть клики заданного графа.
4. Рабочий проект
На окне программы отображены 3 кнопки (SetSize_btn, RandomGraph_btn, Solve_btn); таблица, являющаяся матрицей смежности (AdjMtrx_strGrd); окно отображения графа (Graph_img); надпись, указывающая количество вершин (Size_spEdt); надпись, указывающая множество вершин максимальной клики графа (Cluqie_lbl).
4.1 Основные используемые переменные, константы, процедуры и функции
N - переменная в которой находится значение размера графа.
Len - переменная, обозначающая текущую длину клики графа.
GrafMass - числовой двумерный массив, выполняющий роль матрицы смежностей.
Clique - числовой массив, в котором записано множество вершин максимальной клики.
IndClMass - числовой массив, в котором записаны индексы максимальной клики.
DrawGraph - процедура для рисования графа.
Rec - процедура нахождения максимальной клики.
5. Руководство пользователя
Данная программа реализует нахождение максимальной клики в заданном неориентированном графе с помощью алгоритма Брона - Кербоша.
Входными данными является количество вершин и матрица смежностей графа.
Выходными данными является изображение графа и окно, в котором содержится множество вершин максимальной клики.
Максимально число вершин графа в этой программе неограниченно.
В данной программе реализуется следующий алгоритм: перед его работой заполняется матрица смежностей. Из этой матрицы выделяются подматрицы, также симметричные относительно главной диагонали. Множество вершин, образующее эту матрицу и будет множеством вершин клики. Оно выводится в окне по окончанию работы алгоритма.
Того чтобы указать количество вершин графа нужно ввести необходимое значение на поле отображения вершин и нажать кнопку «Задать размер». Чтобы добавить вершину нужно нажать на стрелку «вверх» на окне отображения вершин, а чтобы убрать вершину, нужно нажать на стрелку «вниз» на том же окне. Чтобы сгенерировать матрицу смежностей для графа нажмите на кнопку «Матрица смежностей». Чтобы изобразить граф и найти его максимальную клику, необходимо нажать на кнопку «Нарисовать граф и найти клику».
6. Листинг
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, Spin, ExtCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Graph_img: TImage; //компонент для отрисовки графа
RandomGraph_btn: TButton;
Size_spEdt: TSpinEdit;
AdjMtrx_strGrd: TStringGrid;
SetSize_btn: TButton;
Solve_btn: TButton;
Cluqie_lbl: TLabel;
procedure FormCreate(Sender: TObject);
procedure RandomGraph_btnClick(Sender: TObject);
procedure SetSize_btnClick(Sender: TObject);
procedure Solve_btnClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
var N, Dlin_cliq, i_poz: Integer; //N-размер графа, Dlin_cliq-длина клики, i_poz-на какую позицию записывать
GrafMass: array[0..100, 0..100] of Integer; //граф
Clique: array[0..100] of Integer; //клика
IndClMass: array[0..100] of Integer; //индексы для клики
implementation
{$R *.dfm}
procedure rec(stolb, Len: Integer); //stolb - текущий столбец, Len - текущая длина клики
var i, j: Integer;
begin
if Len > Dlin_cliq then begin //нашли решение
for i:= 0 to Len-1 do
Clique[i]:= IndClMass[i];
Dlin_cliq:= Len;
end;
for i:= stolb to N-1 do begin
for j:= 0 to i_poz-1 do
if GrafMass[IndClMass[j]][i] = 0 then break;
if j > N+1 then j:= 0;
if j = i_poz then begin
IndClMass[i_poz]:= i;
i_poz:= i_poz+1;
rec(stolb+1, Len+1);
end;
rec(stolb+1, Len);
end;
end;
procedure DrawGraph();
var
X, Y: array [0..100] of Integer; //координаты вершин на экране
j, i: Integer;
begin
Form1.Graph_img.Canvas.FillRect(Form1.Graph_img.ClientRect); //очистка экрана
for i:= 0 to N-1 do begin
X[i]:= Random(Form1.Graph_img.Width); //случайные значения позиций
Y[i]:= Random(Form1.Graph_img.Height);
Form1.Graph_img.Canvas.Ellipse(X[i]-10,Y[i]-10,X[i]+10,Y[i]+10);
end; //рисуем вершины
for j:= 0 to N-1 do begin
for i:= j+1 to N do
if GrafMass[j][i] = 1 then begin //рисуем линии
Form1.Graph_img.Canvas.MoveTo(X[j],Y[j]);
Form1.Graph_img.Canvas.LineTo(X[i],Y[i]);
end;
Form1.Graph_img.Canvas.TextOut(X[j]-5,Y[j]-5,IntToStr(j+1)); //пишем номера вершин
end;
end;
procedure TForm1.RandomGraph_btnClick(Sender: TObject);
var i, j: Integer;
begin
N:= Size_spEdt.Value;
for j:= 0 to N-1 do
for i:= j to N-1 do
if j = i then AdjMtrx_strGrd.Cells[i,j]:= '0' //на диагонали 0
else begin
AdjMtrx_strGrd.Cells[i,j]:= IntToStr(Random(2)); //в остальных - рандом и симметрия
AdjMtrx_strGrd.Cells[j,i]:= AdjMtrx_strGrd.Cells[i,j]; end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Randomize;
RandomGraph_btnClick(RandomGraph_btn);
end;
procedure TForm1.SetSize_btnClick(Sender: TObject);
begin
N:= Size_spEdt.Value;
AdjMtrx_strGrd.ColCount:= N;
AdjMtrx_strGrd.RowCount:= N;
end;
procedure TForm1.Solve_btnClick(Sender: TObject);
var i, j: Integer;
begin
Dlin_cliq:= 0;
N:= AdjMtrx_strGrd.ColCount;
for j:= 0 to N-1 do //считываем граф и исправляем матрицу смежности (симметрия)
for i:= j to N-1 do begin
if AdjMtrx_strGrd.Cells[i,j] <> '0' then AdjMtrx_strGrd.Cells[i,j]:= '1';
AdjMtrx_strGrd.Cells[j,i]:= AdjMtrx_strGrd.Cells[i,j];
if j = i then AdjMtrx_strGrd.Cells[i,j]:= '0';
GrafMass[j][i]:= StrToInt(AdjMtrx_strGrd.Cells[i,j]);
GrafMass[i][j]:= GrafMass[j][i];
end;
DrawGraph(); //рисуем граф
for i:= 0 to N-1 do begin //поиск клики
i_poz:= 0;
rec(i, 0); end;
Cluqie_lbl.Caption:= 'Максимальная клика: ';
if Dlin_cliq = 1 then Cluqie_lbl.Caption:= Cluqie_lbl.Caption + 'клики нет'
else for i:= 0 to Dlin_cliq-1 do
if i < Dlin_cliq-1 then Cluqie_lbl.Caption:= Cluqie_lbl.Caption + Inttostr(Clique[i]+1) + ' -> '
else Cluqie_lbl.Caption:= Cluqie_lbl.Caption + Inttostr(Clique[i]+1);
end;
end.
7. Примеры работы программы (скриншоты)
Рис. 7.1 Начальное окно программы
Рис. 7.2 Работающее окно программы с графом, который состоит из 4 вершин и 3 ребер
8. Тестирование и отладка программы
алгоритм матрица граф неориентированный
В процессе данной работы в программе было проверено большое количество графов разной размерности. Это позволило проследить за правильностью использованного алгоритма и заполнения матрицы смежности. Также в процессе отладки и тестирования были проверены все кнопки: кнопка, которая задает размер графа, кнопка, задающая матрицу смежности и кнопка для рисования неориентированного графа и поиска его максимального полносвязного подграфа. После этого была произведена общая поверка программы, чтобы избежать возможных ошибок.
Рис. 8.1 Тестовый пример №1
«Работающая программа с графом, максимальная клика которого равна множеству вершин 1-2-3»
Рис. 8.2 Тестовый пример №2
«Работающая программа с графом, максимальная клика которого равна множеству вершин 1-2-4»
Рис. 8.3 Тестовый пример №3
«Работающая программа с графом, максимальная клика которого равна множеству вершин 2-3-4»
Список использованных источников
1. Зыков А.А - «Основы теории графов» 2004 г.
2. Научная библиотека - http://sci.sernam.ru/book_comb.php?id=35.
3. Образовательный портал - http://geum.ru/referat/ref-34265_1-1.php.
4. Свободная энциклопедия - https://ru.wikipedia.org.
Размещено на Allbest.ru
...Подобные документы
Модификация алгоритма RPC таким образом, чтобы он не требовал входного параметра, но сохранил свою гибкость при решении задачи нахождения максимальной клики для разных графов. Метод ветвей и границ. Построение функции-классификатора. Листинг алгоритма.
курсовая работа [197,8 K], добавлен 06.10.2016Обеспечение универсальности функций тестирования при разработке программы для тестирования студентов. Бесплатное программное обеспечение. Анализ выбора среды программирования. Особенности среды Delphi и СУБД MySQL. Описание алгоритма и блок-схемы.
курсовая работа [1,6 M], добавлен 01.02.2013Проектирование программы в среде Delphi для тестирования знаний студентов по программированию, с выводом оценки по окончанию тестирования. Разработка экранных форм и алгоритма программы. Описание программных модулей. Алгоритм процедуры BitBtn1Click.
курсовая работа [365,0 K], добавлен 18.05.2013Вершина в заданном графе с различным количеством вершин. Результаты обработки графа программой MyProject.exe. Сопряжение модулей программы. Модуль вывода матрицы смежности. Тесты черного ящика. Комбинаторное покрытие условий тестами черного ящика.
курсовая работа [44,8 K], добавлен 13.10.2012Элементы и переменные, используемые для составления записи в Паскале. Основные числовые типы языка Turbo Pascal. Составление блок-схемы приложения, программирование по ней программы для вычисления функции. Последовательность выполнения алгоритма.
лабораторная работа [256,9 K], добавлен 10.11.2015Графы: определения, примеры, способы изображения. Смежные вершины и рёбра. Путь в ориентированном и взвешенном графе. Матрица смежности и иерархический список. Алгоритм Дейкстры - алгоритм поиска кратчайших путей в графе. Работа в программе "ProGraph".
презентация [383,8 K], добавлен 27.03.2011Программа формирования матрицы смежности по заданному списку окрестностей вершин ориентированного графа. Формирование динамического списка дуг ориентированного графа по заданному списку окрестностей. Анализ временной и емкостной сложности алгоритма.
курсовая работа [8,1 M], добавлен 07.09.2012Определение понятий - клика, подграф, неориентированный граф. Реализация алгоритма Брона-Кербоша псевдокодом для быстрого поиска клик. Описание классов для выполнения операций над графом и его матрицей. Использование в программе нестандартных компонентов.
курсовая работа [410,1 K], добавлен 02.01.2011Разработка приложения для шифрования данных с помощью алгоритма DES5: процесс шифрования, расшифрования, получение ключей. Спецификация программы, процедуры и функции; описание интерфейса пользователя. Реализация задачи в среде программирования DELPHI.
курсовая работа [812,6 K], добавлен 27.03.2012Основные функции, требования и характеристики системы тестирования. Создание современной модели WEB-сервиса тестирования знаний студентов с помощью средств WEB-разработки. Описание пользовательского интерфейса сайта, этапы прохождения тестовых заданий.
курсовая работа [6,4 M], добавлен 14.07.2012Разработка программы тестирования студентов по MS PowerPoint с кодом на языке Delphi. Создание алгоритма для решения функциональных требований задачи. Описание переменных, вспомогательных процедур, входных и выходных данных для реализации программы.
курсовая работа [1,5 M], добавлен 21.09.2010Понятие информационной безопасности. История развития криптографии. Функции информационных моделей. Переменные, используемые при разработке прикладной программы для шифрования и дешифрования сообщений с помощью шифра Цезаря. Блок-схема общего алгоритма.
курсовая работа [975,5 K], добавлен 11.06.2014Разработка алгоритма реализации на ЭВМ процесса поиска кратчайшего пути в графе методом Дейкстры. Программная реализация алгоритма поиска кратчайшего пути между двумя любыми вершинами графа. Проверка работоспособности программы на тестовых примерах.
реферат [929,8 K], добавлен 23.09.2013Блок-схема алгоритма Флойда. Разработка его псевдокода в программе Microsoft Visual Studio. Программа реализации алгоритмов Беллмана-Форда. Анализ трудоемкости роста функции. Протокол тестирования правильности работы программы по алгоритму Флойда.
курсовая работа [653,5 K], добавлен 18.02.2013Переменные и операции языка СИ: используемые символы, константы, идентификаторы и ключевые слова. Использование комментариев в тексте программы. Типы данных и их объявление. Приоритеты операций и порядок вычислений. Функции, переменные, макроподстановки.
учебное пособие [135,0 K], добавлен 17.02.2012Анализ алгоритмов нахождения кратчайших маршрутов в графе без отрицательных циклов: Дейкстры, Беллмана-Форда и Флойда-Уоршалла. Разработка интерфейса программы на языке C++. Доказательство "правильности" работы алгоритма с помощью математической индукции.
курсовая работа [1,5 M], добавлен 26.07.2013Описание принципа работы генетического алгоритма, проверка его работы на функции согласно варианту на основе готовой программы. Основные параметры генетического алгоритма, его структура и содержание. Способы реализации алгоритма и его компонентов.
лабораторная работа [20,2 K], добавлен 03.12.2014Последовательность работ при разработке объектно-ориентированных программ. Виды синтаксических анализаторов и способы их применения. Описание алгоритма и анализ результативности работы программы, написанной на языке С, ее константы, переменные и функции.
курсовая работа [441,7 K], добавлен 03.07.2011Этапы процедуры принятия решений. Разработка математического алгоритма. Блок-схема алгоритма работы программы. Разработка программы на языке программирования С++ в среде разработки MFC. Текст программы определения технического состояния станка с ЧПУ.
курсовая работа [823,0 K], добавлен 18.12.2011Составление программы вычисления матрицы и программы вычисления интеграла с погрешностью, не превышающей заданную величину. Схема алгоритма и её описание. Инструкция по использованию разработанной программы и проверка правильности е функционирования.
курсовая работа [54,8 K], добавлен 27.10.2010