Раскраска графа
Сущность алгоритма раскраски графа, сферы применения данного процесса. Создание и листинг программы, в которой пользователь мог бы иметь возможность сгенерировать случайный граф, который правильно раскрашивался бы минимальным количеством цветов.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 22.02.2019 |
Размер файла | 265,5 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Раскраска графа
Введение
Первые упоминания о раскраске графа и применении этой теории датируются 1852 годом. С тех пор теория претерпела множество изменений.
Задачи раскраски вершин или ребер графа занимают важное место в теории графов. К построению раскрасок сводится целый ряд практических задач. Характерной особенностью этих задач является существование объектов, которые по каким-либо причинам не могут быть объединены в одну группу.
Задача раскраски графов была поставлена во многих областях применения. Раскраска вершин моделирует многие проблемы планирования. Алгоритм раскраски графа используется при распределении регистров и в технологии цифровых водяных знаков. Также решение головоломки Судоку можно рассматривать как завершение раскраски 9 цветами заданного графа из 81 вершины.
1. Постановка задачи
граф алгоритм раскраска
Необходимо создать программу, в которой пользователь мог бы иметь возможность сгенерировать случайный граф, который правильно раскрашивался бы минимальным количеством цветов.
Управление в программе необходимо осуществлять с помощью клавиатуры и мыши. В процессе выполнения работы необходимо научится анализировать и различать события, возникающие при работе программы и реагировать на события посредством воздействия на клавиатуру и мышь. Программа должна однозначно идентифицировать и выполнять те или иные действия в зависимости от действий пользователя
Графический интерфейс, применяемый для визуализации результатов работы программы должен делать работу пользователя, знакомому с основами теории графов, интуитивно понятной.
Программа должна быть разработана для работы в операционной системе Microsoft Windows. Средой разработки является Microsoft Visual Studio 2015. Язык программирования С++.
2. Теоретическая часть задания
Пусть G - некоторый граф, k - натуральное число. Произвольная функция вида f: V > {1,2,…, k} называется вершинной k-раскраской или просто k-раскраской графа G. Раскраска называется правильной, если f(v)?f(u) для любых смежных вершин v и u. Граф, для которого существует правильная k-раскраска, называется k-раскрашиваемым.
Алгоритм раскраски графа:
1. Выберем в графе G некоторое максимальное независимое множество вершин U (лучше наибольшее). Покрасим все вершины данного множества в один цвет.
2. Выберем максимальное независимое множество вершин U1 в графе G1, который получается из графа G удалением множества вершин U и всех инцидентных им ребер. Покрасим вершины множества U1 в очередной цвет.
3. Шаг 2 повторять до тех пор, пока в графе G не будут раскрашены все вершины.
На рисунке 1 приведен пример правильно раскрашиваемого графа.
Рисунок 1.- Граф G
3. Описание алгоритма поставленной задачи
Первоначально был разработан и протестирован алгоритм раскрашивания графа. Далее был разработан графический интерфейс, который позволил бы пользователю легко ориентироваться в программе. Для реализации задачи был выбран язык C++. В качестве среды программирования был выбран программный продукт Visual Studio 2013. Некоторые доработки были выполнены с помощью программного продукта Visual Studio 2010. Была создана функция InitInstance, создающая окно программы и заполняющая заголовки. Затем была создана функция LRESULT CALLBACK WndProc(), в которую был добавлен уже разработанный алгоритм построения вершин и ребер графа, действий при нажатии кнопок, а также алгоритм распределения цветов по вершинам.
4. Пример ручного расчета задачи и вычислений
На рисунке 2 изображен граф, выбранный для ручного расчета.
Рисунок 2. Граф для ручного расчета
Алгоритм расчета:
1. Берем вершины и раскрашиванием их в какие-либо цвета.
2. Берем первую вершину. Если какая-либо смежная ей вершина имеет такой же цвет, то меняем цвет взятой вершины.
3. Повторяем пункт 3, пока не будут раскрашены все вершины.
4. Далее необходимо избавится от одинаковых цветов последней вершины и смежных ей. Для этого берем первую вершину. Если какая-либо смежная ей вершина имеет такой же цвет, то меняем цвет смежной вершины.
5. Повторяем 4 пункт, пока не будут проверены все вершины.
5. Описание самой программы
При запуске программы пользователя встречает окно с двумя кнопками. Кнопка «Generate» позволяет сгенерировать случайный граф и раскрасить его минимальным количеством цветов. Кнопка «Exit» выходит из программы.
Исходное состояние программы показано на рисунке 3.
Рисунок 3. Исходное состояние
6. Результаты работы
Результат работы программы представлен на рисунке 4 и 5.
Рисунок 4. Результат работы
Рисунок 5. Результат работы
7. Тесты
Программа Visual Studio 2013 была выбрана в качестве среды разработки. Для отладки программы были использованы такие инструменты тестирования как точка останова, выполнение кода по шагам, анализ содержимого локальных и глобальных переменных, анализ содержимого памяти.
В ходе тестирования было выявлено множество проблем связанных с работой алгоритма, построением графа и его раскраской. Было найдено и исправлено множество недоработок. На рисунке 7 показаны результаты тестирования.
Рисунок 6. Результат тестирования
Заключение
В ходе выполнения данной курсовой работы были получены навыки работы с графами. Разработан алгоритм раскраски графа.
Программу можно улучшить, добавив для наглядности вывод матрицы смежности.
Список литературы
1. Электронный ресурс: stackoverflow.com.
2. Электронный ресурс: CyberForum.ru.
3. Электронный ресурс: wikipedia.org.
4. Зыков А.А. Основы теории графов.-М.:Наука, 1984 г.
5. Успенский В.А. Семенов А.Л. Теория алгоритмов: основные понятия и приложения.-М.: Наука, 1987 г.
Приложение
Листинги программы
Файл «L_CW.cpp»
#include «stdafx.h»
#include «L_CW.h»
BOOL InitInstance (HINSTANCE hInstance, int nCmdShow)
{
int XWndSize=800, YWndSize=600;
HWND hWnd;
hInst = hInstance;
hWnd = CreateWindow (
szWindowClass,
L» Raskraska grapha»,
WS_OVERLAPPEDWINDOW,
GetSystemMetrics (SM_CXSCREEN)/2-XWndSize/2,
GetSystemMetrics (SM_CYSCREEN)/2-YWndSize/2,
XWndSize, YWndSize,
NULL, NULL,
hInstance, NULL);
if (! hWnd)
{
return FALSE;
}
ShowWindow (hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
switch (wmId)
{
case IDM_N_3:
DrawN3=! DrawN3;
InvalidateRect (hWnd, NULL, true);
UpdateWindow(hWnd);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc (hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint (hWnd, &ps);
if (DrawN3)
{
int M[7] [7];
TextOut (hdc, 2, 2, _T («Вывод графа с подкрашенными вершинами.»), strlen («Вывод графа с подкрашенными вершинами.»));
srand (time(0));
for (int i = 0; i < 7; i++)
{
for (int j = 0; j < 7; j++)
{
if (i == j) M[i] [j] = 0;
else
M[i] [j] = M[j] [i] = rand()% 2;
}
}
const int n = 7;
int kolvoEltov=7;
int color[n] = {60, 60, 60, 60, 60, 60, 60};
for (int i = 0; i < kolvoEltov; i++) {
for (int j = 0; j < kolvoEltov; j++) {
if (M[i] [j]!= 0) {
if (color[j] == color[i])
{
color[j] += 20;
}
}
}
}
for (int i = 0; i < kolvoEltov; i++) {
for (int j = 0; j < kolvoEltov; j++) {
if (M[i] [j]!= 0) {
if (color[j] == color[i])
{
color[i] += 20;
}
}
}
}
int V[7] [2]={{100,100}, {200,80}, {300,120}, {320,200}, {270,270}, {160,270}, {80,200}};
for (int i=0; i<7; i++)
{
for (int j=0; j<7; j++)
{
if (M[i] [j]>0)
{
MoveToEx (hdc, V[i] [0], V[i] [1], 0);
LineTo (hdc, V[j] [0], V[j] [1]);
}
}
}
for (int i=0; i<7; i++)
{
for (int j=0; j<7; j++)
{
Ellipse (hdc, V[i] [0] - 13, V[i] [1] - 13, V[i] [0]+13, V[i] [1]+13);
switch (color[i]) {
case(10):
SetTextColor (hdc, RGB (255, 255, 0));
break;
case(30):
SetTextColor (hdc, RGB (0, 255, 255));
break;
case(50):
SetTextColor (hdc, RGB (140, 0, 140));
break;
case(60):
SetTextColor (hdc, RGB (255, 0, 0));
break;
case(70):
SetTextColor (hdc, RGB (0, 0, 0));
break;
case(80):
SetTextColor (hdc, RGB (0, 255, 0));
break;
case(100):
SetTextColor (hdc, RGB (220, 220, 0));
break;
case(200):
SetTextColor (hdc, RGB (0, 255, 240));
break;
case(120):
SetTextColor (hdc, RGB (0, 0, 255)); break;
}
char v[2];
TextOut (hdc, V[i] [0] - 5, V[i] [1] - 7, (LPCTSTR) itoa (i+1, v, 10), 1);
}
}
DrawN3=false;
}
EndPaint (hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc (hWnd, message, wParam, lParam);
}
return 0;
}
Файл «Resourse.h»
#define IDS_APP_TITLE 103
#define IDR_MAINFRAME 128
#define IDD_L_CW_DIALOG 102
#define IDM_EXIT 105
#define IDI_L_CW 107
#define IDI_SMALL 108
#define IDC_L_CW 109
#define IDC_MYICON 2
#define IDM_N_3 113
bool DrawN3 = false;
#define MAX_LOADSTRING 100
HINSTANCE hInst;
TCHAR szTitle [MAX_LOADSTRING];
TCHAR szWindowClass [MAX_LOADSTRING];
ATOM MyRegisterClass (HINSTANCE hInstance);
BOOL InitInstance (HINSTANCE, int);
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About (HWND, UINT, WPARAM, LPARAM);
int APIENTRY _tWinMain (HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
MSG msg;
HACCEL hAccelTable;
LoadString (hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString (hInstance, IDC_L_CW, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);
if (! InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
hAccelTable = LoadAccelerators (hInstance, MAKEINTRESOURCE (IDC_L_CW));
while (GetMessage (&msg, NULL, 0, 0))
{
if (! TranslateAccelerator (msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int) msg.wParam;
}
ATOM MyRegisterClass (HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon (hInstance, MAKEINTRESOURCE (IDI_L_CW));
wcex.hCursor = LoadCursor (NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH) (COLOR_WINDOW+1);
wcex.lpszMenuName = MAKEINTRESOURCE (IDC_L_CW);
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon (wcex.hInstance, MAKEINTRESOURCE (IDI_SMALL));
return RegisterClassEx(&wcex);
}
Файл «Stdafx.cpp»
#include «stdafx.h»
Файл «Stdafx.h»
#pragma once
#include <windows.h>
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>
#include <math.h>
#include <winbase.h>
#include <string.h>
#include <stdio.h>
#include <direct.h>
#include <time.h>
Размещено на Allbest.ru
...Подобные документы
Математические графы, области их применения. Способы раскраски вершин и ребер графов, задачи на их применение. Разработка алгоритма, работающего на основе операций с матрицей смежности. Описание логической структуры программы. Пример зарисовки графа.
курсовая работа [145,5 K], добавлен 27.01.2013Разработка граф-схемы алгоритма раскраски на языке Object Pascal. Формат файла для хранения графов. Выбор удобочитаемых идентификаторов. Переменные, константы, типы, компоненты, процедуры и функции модулей uMain, uInputk, uFiling, uColoring, uHelp.
курсовая работа [1,3 M], добавлен 22.11.2013Этапы нахождения хроматического числа произвольного графа. Анализ примеров раскраски графа. Характеристика трудоемкости алгоритма раскраски вершин графа Мейниеля. Особенности графов, удовлетворяющих структуру графов Мейниеля, основные классы графов.
курсовая работа [1,1 M], добавлен 26.06.2012Разработка проекта приложения, при помощи которого можно задать граф с любым количеством вершин и ребер, построить его графическое изображение, автоматически рассчитать ребра полного графа. Выбор состава программных средств. Руководство пользователя.
курсовая работа [466,5 K], добавлен 21.11.2015Создание программного обеспечения для реализации алгоритма, позволяющего находить кратчайшее расстояние от одной из вершин графа до всех остальных, при условии, что ребра графа не имеют отрицательного веса. Примеры выполнения алгоритма Дейкстра.
курсовая работа [1,1 M], добавлен 11.01.2015История и термины теории графов. Описание алгоритма Дейкстры. Математическое решение проблемы определения кратчайшего расстояния от одной из вершин графа до всех остальных. Разработка программы на объектно-ориентированном языке программирования Delphi 7.
контрольная работа [646,9 K], добавлен 19.01.2016Основные понятия и определения теории графов: теоремы и способы задания графа, сильная связность графов. Построение блок-схем алгоритма, тестирование разработанного программного обеспечения, подбор тестовых данных, анализ и исправление ошибок программы.
курсовая работа [525,6 K], добавлен 14.07.2012Определение понятий - клика, подграф, неориентированный граф. Реализация алгоритма Брона-Кербоша псевдокодом для быстрого поиска клик. Описание классов для выполнения операций над графом и его матрицей. Использование в программе нестандартных компонентов.
курсовая работа [410,1 K], добавлен 02.01.2011Способ представления графа в информатике. Алгоритмы поиска элементарных циклов в глубину в неориентированных графах. Описание среды wxDev-C++, последовательность создания проекта. Руководство пользователю программы поиска и вывода на экран простых циклов.
курсовая работа [783,2 K], добавлен 18.02.2013Программа формирования матрицы смежности по заданному списку окрестностей вершин ориентированного графа. Формирование динамического списка дуг ориентированного графа по заданному списку окрестностей. Анализ временной и емкостной сложности алгоритма.
курсовая работа [8,1 M], добавлен 07.09.2012Области применения теории графов. Алгоритм решения задачи поиска инвариантного и полного графа. Реализация программы с графическим интерфейсом пользователя на основе алгоритма. Реализация редактора графа и вывод полученных результатов в понятной форме.
курсовая работа [493,3 K], добавлен 27.12.2008Разработка алгоритма реализации на ЭВМ процесса поиска кратчайшего пути в графе методом Дейкстры. Программная реализация алгоритма поиска кратчайшего пути между двумя любыми вершинами графа. Проверка работоспособности программы на тестовых примерах.
реферат [929,8 K], добавлен 23.09.2013Общее понятие графа, его виды и сущность вершинного покрытия. Написание точного алгоритма решения задачи о надежности сети, нахождение минимального покрытия. Реализация данного алгоритма на языке TurboC++. Код программы, решающий поставленную задачу.
курсовая работа [1,3 M], добавлен 27.06.2014Вершина в заданном графе с различным количеством вершин. Результаты обработки графа программой MyProject.exe. Сопряжение модулей программы. Модуль вывода матрицы смежности. Тесты черного ящика. Комбинаторное покрытие условий тестами черного ящика.
курсовая работа [44,8 K], добавлен 13.10.2012Теоретическое обоснование теории графов. Методы нахождения медиан графа. Задача оптимального размещения насосной станции для полива полей. Алгоритм Флойда, поиск суммарного расстояния до вершин. Функция нахождения индекса минимального значения в массиве.
курсовая работа [336,8 K], добавлен 28.05.2016Засвоєння засобів аналізу трудомісткості обчислювальних алгоритмів. Побудова графа алгоритму з отриманої блок-схеми. Мінімізація графа, його подання у вигляді стохастичної матриці. Знаходження кількості звернень до файлів за допомогою Microsoft Excel.
лабораторная работа [681,5 K], добавлен 02.06.2011Граф как средство для описания структуры сложных объектов и функционирования систем. Входные и выходные данные. Язык программирования, системные требования. Модульный состав программы. Схемотехническое и конструкторско–топологическое проектирование.
курсовая работа [1,2 M], добавлен 22.04.2014Использование NP-трудных в сильном смысле задачи. Обслуживание требований без задержек. Алгоритм построения бесконтурного графа. Псевдополиномиальные сведения задач. Последовательный анализ вариантов допустимого расписания ориентированного графа.
курсовая работа [783,7 K], добавлен 15.06.2009Корректность определения кратчайших путей в графе и рёбра отрицательной длины. Анализ алгоритмов Дейкстры, Беллмана-Форда, Флойда-Уоршелла. Вычисление кратчайших расстояний между всеми парами вершин графа. Топологическая сортировка ориентированного графа.
презентация [449,3 K], добавлен 19.10.2014Создание программы визуализации методов сортировки массива, особенности и направления ее практического применения. Выбор и обоснование среды программирования. Разработка руководства пользователя. Листинг программы и оценка эффективности ее использования.
дипломная работа [1,0 M], добавлен 15.06.2014