50010 (Разработка программы нахождения всех полных подграфов (клик) данного графа), страница 3
Описание файла
Документ из архива "Разработка программы нахождения всех полных подграфов (клик) данного графа", который расположен в категории "". Всё это находится в предмете "информатика" из 1 семестр, которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "курсовые/домашние работы", в предмете "информатика, программирование" в общих файлах.
Онлайн просмотр документа "50010"
Текст 3 страницы из документа "50010"
Листинг 3.2 - Первоначальное состояние метода OnPaint класса DockPanel.
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
if (DockBackColor == BackColor)
return;
Graphics g = e.Graphics;
SolidBrush bgBrush = new SolidBrush(DockBackColor);
g.FillRectangle(bgBrush, ClientRectangle);
}
Листинг 3.3 - Состояние метода OnPaint класса DockPanel после редактирования.
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
}
Как видно из листинга 3.2.2 изменение свелось к удалению запрете закраски панели собственным цветом фона. Это приведет к невозможности установки свойства BackColor компонента, но оно не используется в данном приложении.
Использование компонента в данном приложении
В данном приложении элемент DockPanel использовался для создания окна, отображающего свойства графа (класс MatrixWindow). Для этого сначала было создано окно-пустышка класса ToolWindow, наследуемое от класса DockContent. Это позволило окну ToolWindow стать "плавающим". Далее от класса ToolWindow был наследован MatrixWindow.
3.3 Реализация алгоритма удаления ребра графа мышью
Задача: удалить ребро графа, лежащее под курсором мыши (Рис. 3.2).
Рисунок 3.2 - Мышь находится рядом с ребром графа, который требуется удалить.
Решение:
Поскольку определять пересечение курсора мыши с линией не удобно, так как при тонкой линии требуется точное позиционирование мыши, по двум точкам строятся два треугольника, которые вместе образуют прямоугольник, который делит пополам ребро графа (рисунок 3.3).
Рисунок 3.3 - Прямоугольник, образованный двумя треугольниками, делит пополам ребро графа. Координаты мыши принадлежат одному из треугольников.
Так задача сводится к одной из классических задач аналитической геометрии – определение принадлежности точки треугольнику.
Рассмотрим алгоритм определения принадлежности точки к одному треугольнику. Для начала необходимо узнать, к какой области принадлежит точка (Рис. 3.4).
Рисунок 3.4. Области, в которых может лежать точка относительно линии.
Этим в классе Graph занимается частный метод pointClassify(Point source, Point dest), который возвращает один из элементов перечисления PointPlace, которое определяет область нахождения точки.
Перечисление PointPlace:
enum PointPlace : int
{
LEFT = 0,
RIGHT = 1,
BEYOND = 3,
BEHIND = 4,
BETWEEN = 5,
ORIGIN = 6,
DESTINATION = 7,
}
Листинг 3.4 – Метод pointClassify класса Graph.
PointPlace pointClassify(PointF point, PointF origin, PointF dest)
{
PointF a = dest;
a.X -= origin.X;
a.Y -= origin.Y;
PointF b = point;
b.X -= origin.X;
b.Y -= origin.Y;
double sa = a.X * b.Y - b.X * a.Y;
if (sa > 0.0)
return PointPlace.LEFT;
if (sa < 0.0)
return PointPlace.RIGHT;
if ((a.X * b.X < 0.0) || (a.Y * b.Y < 0.0))
return PointPlace.BEHIND;
if (Math.Sqrt(a.X * a.X + a.Y * a.Y) < Math.Sqrt(b.X * b.X + b.Y * b.Y))
return PointPlace.BEYOND;
if (point == origin)
return PointPlace.ORIGIN;
if (point == dest)
return PointPlace.DESTINATION;
return PointPlace.BETWEEN;
}
Далее достаточно определить лежит ли точка в области, образованной ребрами треугольника. Эту задачу выполняет метод pointInTriangle, который принимает координаты треугольников и точку, принадлежность треугольникам которой следует проверить. Метод возвращает true, если точка принадлежит треугольнику и false в противном случае.
Листинг 3.5 – Метод pointInTriangle класса Graph.
bool pointInTriangle(PointF p, PointF a, PointF b, PointF c)
{
return ((pointClassify(p, a, b) != PointPlace.LEFT) &&
(pointClassify(p, b, c) != PointPlace.LEFT) &&
(pointClassify(p, c, a) != PointPlace.LEFT));
}
Более подробное описание алгоритмов можно найти по следующим ссылкам:
-
http://algolist.manual.ru/maths/geom/belong/poly2d.php
-
http://algolist.manual.ru/maths/geom/datastruct.php
3.4 Тестирование реализации алгоритма Брон-Кербоша
Тестирование алгоритма производилось:
-
на пустом графе
-
на графе с единственной вершиной
-
не графе с тремя не соединенными ребрами вершинами
-
на графе из двух вершин, соединенных ребром
-
на сложном графе
Стратегия тестирования
Сперва, с помощью определения понятия "клика", были найдены клики данного графа, после чего результаты сравнивались с результатом работы программы.
-
Тестирование на пустом графе.
Теоретические расчеты: поскольку граф пуст (множество его вершин есть пустое множество) клик в нем нет.
Практический результат: клик в графе не найдено, получено соответствующее уведомление (рисунок 3.5).
Рисунок 3.5. Сообщение об отсутствии клик в графе.
Результат: теоретические и практические расчеты сходятся – на данном наборе алгоритм работает верно.
2. Тестирование на графе с единственной вершиной.
Теоретические расчеты: граф не содержит клик - подмножество его вершин, такое, что между каждой парой вершин этого подмножества существует ребро и, кроме того, это подмножество не принадлежит никакому большому подмножеству с тем же свойством.
Практический результат: клик в графе не найдено, получено соответствующее уведомление (рисунок 3.5).
Результат: теоретические и практические расчеты сходятся – на данном наборе алгоритм работает верно.
3.Тестирование на графе с тремя не соединенными ребрами вершинами.
Теоретические расчеты: аналогичны расчетом в пункте 2.
Практический результат: клик в графе не найдено, получено соответствующее уведомление (рисунок 3.5).
Результат: теоретические и практические расчеты сходятся – на данном наборе алгоритм работает верно.
4.Тестирование на графе из двух вершин, соединенных ребром.
Теоретические расчеты: граф удовлетворяет понятию "клика".
Практические результаты: найдена одна клика, представляющая собой данный граф. Результат: теоретические и практические расчеты сходятся – на данном наборе алгоритм работает верно.
Тестирование на сложном графе.
В программе был создан граф, представленный на рисунке 3.6.
Рисунок 3.6. Сложный граф, используемый в тесте.
Матрица смежности графа:
100011
10111000
11001100
01001100
01110100
00111000
10000000
10000000
Теоретические расчеты: алгоритмом должны быть найдены следующие клики: {1,2,3},{1,7},{1,8},{2,3,5},{2,4,5},{3,5,6},{4,5,6}.Практические результаты: программой был сгенерирован отчет, представленный на листинге 3.6.
Листинг 3.6. Отчет, сгенерированный программой.
Graph untitled.g
Vertices count: 8
Matrix:
100011
111000
001100
001100
110100
111000
000000
000000
Cliques count: 7
Clique 1
Vertices: 1 2 3
Matrix:
1
1
0
Clique 2
Vertices: 1 7
Matrix:
Clique 3
Vertices: 1 8
Matrix:
Clique 4
Vertices: 2 3 5
Matrix:
1
1
0
Clique 5
Vertices: 2 4 5
Matrix:
1
1
0
Clique 6
Vertices: 3 5 6
Matrix:
1
1
0
Clique 7
Vertices: 4 5 6
Matrix:
1
1
0
Результат: алгоритм работает верно.
3.5 Системные требования
Требования к аппаратному обеспечению:
Процессор с тактовой частотой 1000 МГц.
Не менее 256 Мб оперативной памяти.
Монитор с разрешением 1024 x 768.
Клавиатура, мышь.
Требования к программному обеспечению:
OS Windows Xp/Vista/7
NET Framework 2.0
Заключение
На языке программирования C# была выполнена реализация алгоритма Брона-Кербоша по поиску клик в неориентированном графе. Также были реализованы средства создания и редактирования неориентированного графа, а также поиска и отображения его клик и создания отчета о найденных кликах. Также были получены следующие навыки:
-
Умение применять и модифицировать opensource-компоненты.
-
Навык работы с динамическими структурами данных.
-
Навык организации печати документов средствами .NET Framework.
Список использованной литературы и источников
-
Bron C., Kerbosh J. (1973), Algorithm 457 — Finding all cliques of an undirected graph, Comm. of ACM, 16, p. 575—577
-
Cazals, F.; Karande, C. (2008), "A note on the problem of reporting maximal cliques", Theoretical Computer Science 407 (1): 564–568,doi:10.1016/j.tcs.2008.05.010
-
Graph Drawing: Algorithms for the Visualization of Graphs.
-
Drawing Graphs : Methods and Models (Lecture Notes in Computer Science).
-
http://sourceforge.net/projects/dockpanelsuite/
-
http://nzeemin.livejournal.com/184415.html
-
http://algolist.manual.ru/maths/geom/datastruct.php
-
http://algolist.manual.ru/maths/geom/belong/poly2d.php
Приложение
Руководство пользователя
Описание интерфейса
На рисунке 1 представлено главное окно приложения. Цифрами отмечены:
-
Рабочая область приложения.
-
Созданный на рабочей области граф.
-
Главное меню приложения.
-
Панель инструментов приложения.
-
Окно, отображающее матрицу смежности и параметры графа.
-
Матрица смежности графа.
-
Параметры графа.
Рисунок 1. Главное окно приложения.
Панель инструментов программы (Рис. 2):
-
Кнопка создание нового документа.
-
Открытие нового документа.
-
Сохранение изменений в документе.
-
Предварительный просмотр документа перед печатью.
-
Кнопка печати документа.
-
Отменить сделанное изменение (если таковое имело быть).
-
Отменить отмену изменение (если таковое имело быть).
-
Инструмент "Курсор".
-
Инструмент "Добавить вершину".
-
Инструмент "Удалить вершину".
-
Инструмент "Добавить ребро".
-
Инструмент "Удалить ребро".
Рисунок 2. Панель инструментов приложения.
Инструменты:
Инструмент "Курсор" необходим для изменения координат вершин графа. Для изменения координат вершины графа достаточно навести курсор на вершину, и зажать левую кнопку мыши. Теперь, пока кнопка не была опущена, координаты вершины будут меняться в соответствии с изменениями координат мыши. Для окончания перемещения графа необходимо отпустить кнопку мыши.
Инструмент "Добавить вершину" создает новую вершину в кликнутой рабочей области. Строка и столбец этой вершины в матрице заполняются нулями.
Инструмент "Удалить вершину" удаляет из графа вершину, по которой кликнули мышью.
Инструмент "Добавить ребро" создает новое ребро графа. Для этого нужно выделить одну из вершин, которой будет принадлежать ребро, мышью и, не отпуская левую кнопку, перетащить курсор на вторую вершину.
Инструмент "Удалить ребро" удаляет ребро графа, по которому кликнули мышью.
На рисунке 3 представлено окно "Граф", задачей которого ставится отображение матрицы и параметров графа. Оно позволяет добавлять и удалять вершины, а также устанавливать или удалять ребра графа. Окно является "плавающим" (Docking), что означает, что оно способно "прилипать" к краям главного окна, а также быть полностью независимым от него. Отобразить или скрыть это окно возможно при помощи функции меню Вид - > Окно свойств.
Рисунок 3. Докинговое окно "Граф".
На рисунке 4 представлено окно "Клики графа", задачей которого ставится поиск и отображения всех клик графа, а также сохранение отдельных клик в графический, текстовый или графовый (*.g) файл, а также создание отчета обо всех найденных кликах. Доступ к окну можно получить из меня Граф -> Операции -> Поиск клик. Следует отметить, что если граф не создан или в нем отсутствуют клики, пользователь не получит доступ к окну, получив соответствующее уведомление.