Разработка приложения для поиска максимально удалённых вершин в графе

Автор работы: Пользователь скрыл имя, 17 Декабря 2013 в 11:14, курсовая работа

Описание работы

Появление компьютеров стало прорывом для всего человечества. В настоящее время с помощью них возможно производить расчёты с огромной скоростью. Они позволяют решать разнообразные задачи, одной из которых является поиск и составление путей от пункта А в пункт Б. Для таких задач наиболее применима теория графов.
Целью данной курсовой работы является разработка программного продукта для поиска максимально удалённых вершин в графе. Программный продукт должен иметь графический интерфейс и поддерживать любые типы графов.

Содержание работы

1. Введение 3
2. Теория графов 4
2.1 Ориентированный граф 5
2.2 Смешанный граф 5
2.3 Изоморфные графы 6
2.4 Прочие связанные определения 6
2.5 Дополнительные характеристики графов 7
2.6 Обобщение понятия графа 8
2.7 Способы представления графа в информатике 9
3. Техническая реализация 11
3.1 Алгоритм поиска пути 11
3.2 Классы и диаграмма классов 11
3.3 Методы класса GraphEdge 13
3.4 Методы класса GraphNode 13
3.5 Функции класса Graph 14
3.6 Методы класса GraphMaxDistanceFinder 18
}3.7 Графический интерфейс 22
4. Заключение 25
5. Список литературы 26

Файлы: 1 файл

referat_maxdistofgraph.docx

— 269.23 Кб (Скачать файл)

                            break;

                        default:

                            g.DrawImage(graph.imgNode, node.GetPositionX() - graph.imageCenter, node.GetPositionY() - graph.imageCenter);

                            break;

                    }

                    g.DrawString((i + 1).ToString(), graph.font, Brushes.Black, node.GetPositionX() - 12, node.GetPositionY() - 12);

                }

            }

        }

3. Метод GraphMaxDistanceFinder ищет кратчайший путь между заданными вершинами и возвращает true если путь был найден и false если путь не существует:

    class GraphMaxDistanceFinder

    {

        struct NodesDistanceEntry

        {

            public int node1, node2;

            public int pathLength;

 

            public NodesDistanceEntry(int n1, int n2, int length)

            {

                node1 = n1;

                node2 = n2;

                pathLength = length;

            }

        }

 

        Graph graph;

        GraphPathFinder pf;

        Image imgFoundNode;

 

        List<NodesDistanceEntry> distanceList;

        int maxDistanceInd;

        int maxDistanceLength;

 

        public GraphMaxDistanceFinder(ref Graph _graph, string foundNodeImage)

        {

            graph = _graph;

            imgFoundNode = Image.FromFile(foundNodeImage);

            pf = new GraphPathFinder(ref graph, foundNodeImage);

            distanceList = new List<NodesDistanceEntry>();

            maxDistanceInd = -1;

            maxDistanceLength = -1;

        }

 

        public bool FoundFarestNodes()

        {

            maxDistanceInd = -1;

            maxDistanceLength = -1;

            distanceList.Clear();

 

            for (int i = 0; i < graph.nodes.Count - 1; i++)

            {

                for (int j = i + 1; j < graph.nodes.Count; j++)

                {

                    if (pf.FindPath(i, j))

                    {

                        distanceList.Add(new NodesDistanceEntry(i, j, pf.GetPathLength()));

                    }

                }

            }

            if (distanceList.Count == 0)

                return false;

            for (int i = 0; i < distanceList.Count; i++)

            {

                NodesDistanceEntry nde = distanceList[i];

                if (maxDistanceLength < nde.pathLength)

                {

                    maxDistanceLength = nde.pathLength;

                    maxDistanceInd = i;

                }

            }

            return true;

        }

 

        public void Draw(ref Graphics g)

        {

            Pen pen = new Pen(Color.Black, 5);

            for (int i = 0; i < graph.edges.Count; i++)

            {

                Point xFrom, xTo;

                int node1, node2;

                graph.edges[i].GetLinkedNodes(out node1, out node2);

                xFrom = new Point(graph.nodes[node1].GetPositionX(), graph.nodes[node1].GetPositionY());

                xTo = new Point(graph.nodes[node2].GetPositionX(), graph.nodes[node2].GetPositionY());

                g.DrawLine(pen, xFrom, xTo);

            }

            for (int i = 0; i < graph.nodes.Count; i++)

            {

                GraphNode node = graph.nodes[i];

                if (node.isExists())

                {

                    NODE_TYPE nodeType = NODE_TYPE.NOT_CONNECTED; //0 - Not connected, 1 - OK node, 2 - Path node

                    if (maxDistanceInd != -1)

                    {

                        if (distanceList[maxDistanceInd].node1 != i && distanceList[maxDistanceInd].node2 != i)

                            foreach (GraphEdge edge in graph.edges)

                            {

                                int node1, node2;

                                edge.GetLinkedNodes(out node1, out node2);

                                if (node1 == i || node2 == i)

                                {

                                    nodeType = NODE_TYPE.OK;

                                    break;

                                }

                            }

                        else

                            nodeType = NODE_TYPE.FOUND;

                    }

                    else

                    {

                        foreach (GraphEdge edge in graph.edges)

                        {

                            int node1, node2;

                            edge.GetLinkedNodes(out node1, out node2);

                            if (node1 == i || node2 == i)

                            {

                                nodeType = NODE_TYPE.OK;

                                break;

                            }

                        }

                    }

                    switch (nodeType)

                    {

                        case NODE_TYPE.NOT_CONNECTED:

                            g.DrawImage(graph.imgNode, node.GetPositionX() - graph.imageCenter, node.GetPositionY() - graph.imageCenter);

                            break;

                        case NODE_TYPE.OK:

                            g.DrawImage(graph.imgOkNode, node.GetPositionX() - graph.imageCenter, node.GetPositionY() - graph.imageCenter);

                            break;

                        case NODE_TYPE.FOUND:

                            g.DrawImage(imgFoundNode, node.GetPositionX() - graph.imageCenter, node.GetPositionY() - graph.imageCenter);

                            break;

                        default:

                            g.DrawImage(graph.imgNode, node.GetPositionX() - graph.imageCenter, node.GetPositionY() - graph.imageCenter);

                            break;

                    }

                    g.DrawString((i + 1).ToString(), graph.font, Brushes.Black, node.GetPositionX() - 12, node.GetPositionY() - 12);

                }

            }

        }

    }

}

3.7 Графический интерфейс

Для реализации графического интерфейса были использованы стандартные средства визуального проектирования интерфейса среды разработки Microsoft Visual Studio 2012. Графический интерфейс представляет собой форму (System.Windows.Forms.Form) на которой расположены строка меню и командная панель. На командной панели расположены элементы управления RadioButton для выбора режима редактирования графа и кнопки, необходимые для поиска пути.

Граф отображается на форме  с помощью события Paint. Красным цветом обозначены вершины, не имеющие ни одного ребра (не связанные с другими вершинами). Зеленым цветом помечаются вершины, связанные хотя бы с одной другой вершиной. На командной панели имеется выбор различных режимов редактирования графа:

  • "Вершины" - активирует режим редактирования вершин (используется по умолчанию). В этом режиме можно добавлять вершины с помощью левой кнопки мыши, перемещать вершины на графе методом "drag'n'drop" с помощью зажатой левой кнопки мыши, а также, удалять вершины с помощью правой кнопки мыши. Координаты вершины при перемещении изменяются в реальном времени.
  • "Ребра" - активирует режим редактирования ребер. В этом режиме можно добавлять ребра путем зажатия левой кнопки мыши на вершине и отпускания левой кнопки мыши на другой вершине. При перемещении мыши с зажатой левой кнопкой будет отображаться ребро, начинающееся с той вершины, где была зажата левая кнопка мыши. Ребро заканчивается в текущих координатах курсора мыши и отображается серым цветом. Также, в режиме редактировании ребер можно удалить ребро путем нажатия правой кнопки мыши на одной из вершин, связываемых нужным ребром. При нажатии правой кнопки мыши появится контекстное меню со списком ребер. В данном меню нужно выбрать необходимое ребро для удаления.
  • "Поиск максимально удалённых вершин" - активирует режим поиска максимально удалённых друг от друга вершин, при этом становятся доступны кнопка, отвечающая за поиск пути, расположенная справа.

С помощью команд меню, расположенных  в пункте меню "Файл" можно создать  новый граф, сохранить текущий  или загрузить граф из файла.

 

4. Заключение

Результатом курсовой работы является приложение, позволяющее найти  максимально удалённые вершины  в графе. Программный продукт имеет графический интерфейс и имеет возможность сохранения и загрузки графов. Приложение реализовано с помощью языка программирования Microsoft Visual C#, с использованием среды разработки Microsoft Visual Studio 2012.

 

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

  1. Wikipedia/ Википедия. Теория графов
  2. Джон Шарп. Microsoft Visual C# 2008 Step by Step (Изучение Microsoft Visual C# 2008 шаг за шагом) / Джон Шарп.
  3. Джейми Плендерлейт. Microsoft Visual Studio 2008 Programming (Программирование в Microsoft Visual Studio 2008) / Джейми Плендерлейт, Стив Бунн.
  4. Фрэнк Харари. Теория графов / Фрэнк Харари.

 


Информация о работе Разработка приложения для поиска максимально удалённых вершин в графе