Exemplo n.º 1
0
        // Задать граф
        private void buttonInitializeGraph_Click(object sender, EventArgs e)
        {
            bool[,] matrix;
            int demension;

            PointF[] layout;
            try {
                matrix = ReadGraph(out demension, out layout);
            }
            catch (Exception ex) {
                MessageBox.Show(ex.Message);
                return;
            }
            visualizingGraph = new Graph(matrix, checkBoxDirectedGraph.Checked);
            // Задаём вершинам координаты
            if (layout != null)
            {
                for (var vertIndex = 0; vertIndex < demension; vertIndex++)
                {
                    visualizingGraph.Vertices[vertIndex].DrawingCoords = new PointF {
                        X = layout[vertIndex].X,
                        Y = layout[vertIndex].Y
                    }
                }
            }
            ;
            // Задаём вершинам метки
            foreach (var vertex in visualizingGraph.Vertices)
            {
                vertex.Label = "в";
            }
            // Задаём рёбрам метки
            foreach (var edge in visualizingGraph.Edges)
            {
                edge.Label = "р";
            }
            visualizer.Initialize(visualizingGraph);
        }
Exemplo n.º 2
0
        List <Tuple <int, int> > correctMinimalCut; // правильное множество дуг минимального разреза


        // ----Интерфейс задачи
        public void InitializeProblem(ProblemExample example, ProblemMode mode)
        {
            // Если требуется случайная генерация
            if (example == null)
            {
                // Если случайной генерации нет, говорим, что не реализовано
                if (!ProblemDescriptor.IsRandomExampleAvailable)
                {
                    throw new NotImplementedException("Случайная генерация примеров не реализована");
                }
                // Иначе - генерируем задание
                else
                {
                    example = ExampleGenerator.GenerateExample();
                }
            }
            // Если нам дан пример не задачи о максимальном потоке - ошибка
            maxFlowExample = example as MaxFlowProblemExample;
            if (maxFlowExample == null)
            {
                throw new ArgumentException("Ошибка в выбранном примере. Его невозможно открыть.");
            }
            // В зависимости от режима задачи (решение/демонстрация) меняем некоторые элементы управления
            problemMode = mode;
            if (problemMode == ProblemMode.Solution)
            {
                SetAnswerGroupBoxSolutionMode();
            }
            else if (problemMode == ProblemMode.Demonstration)
            {
                SetAnswerGroupBoxDemonstrationMode();
            }
            // Создаём граф для визуализации по примеру
            visGraph = new Graph(maxFlowExample.GraphMatrix, maxFlowExample.IsGraphDirected);
            // Если у нас есть укладка по умолчанию - визуализируем граф в SimpleGraphVisualizer
            if (example.DefaultGraphLayout != null)
            {
                // Задаём расположение вершин графа
                for (int i = 0; i < visGraph.VerticesCount; i++)
                {
                    visGraph.Vertices[i].DrawingCoords = maxFlowExample.DefaultGraphLayout[i];
                }
                SetVisualizer(true);
            }
            // Если укладки по умолчанию нет (граф случайно сгенерирован) - визуализируем в MSAGL
            else
            {
                SetVisualizer(false);
            }
            graphVisInterface.Initialize(visGraph);
            // Сохраняем матрицу графа, исток и сток для решения. Создаём нужные коллекции
            capacityMatrix          = (int[, ])maxFlowExample.CapacityMatrix.Clone();
            verticesCount           = maxFlowExample.GraphMatrix.GetLength(0);
            sourceVertexIndex       = maxFlowExample.SourceVertexIndex;
            targetVertexIndex       = maxFlowExample.TargetVertexIndex;
            flowMatrix              = new int[verticesCount, verticesCount];
            curAugmentalPath        = new List <int>();
            curCutEdges             = new List <Tuple <int, int> >();
            selectedAugmentalPath   = null;
            selectedPathVertexIndex = 0;
            minimalCutEdgeIndex     = 0;
            // Пишем условие задачи - номер истока и номер стока
            textLabelExampleDescription.Text =
                $"Исток: {maxFlowExample.SourceVertexIndex + 1}; Сток: {maxFlowExample.TargetVertexIndex + 1}";
            // Выделяем исток и сток жирным
            visGraph.Vertices[maxFlowExample.SourceVertexIndex].Bold = true;
            visGraph.Vertices[maxFlowExample.TargetVertexIndex].Bold = true;
            // Отображаем метки величины потока на дугах
            UpdateEdgesLabels();
            // Получаем решение задачи
            Algorithm.GetMaxFlowSolve(capacityMatrix, sourceVertexIndex, targetVertexIndex, out correctMinimalCut, out correctMaxFlowValue);
            // Инициализируем статистику решения
            if (problemMode == ProblemMode.Solution)
            {
                maxFlowProblemStatistics = new MaxFlowProblemStatistics();
            }
            // Ставим решение в состояние ожидания начала
            SetStartWaitingState();
        }
Exemplo n.º 3
0
        private int correctMaximalMatchingCardinality; // правильная мощность максимального паросочетания в данном графе (количество рёбер в нём)


        // ----Интерфейс задач
        public void InitializeProblem(ProblemExample example, ProblemMode mode)
        {
            // Если требуется случайная генерация
            if (example == null)
            {
                // Если случайной генерации нет, говорим, что не реализовано
                if (!ProblemDescriptor.IsRandomExampleAvailable)
                {
                    throw new NotImplementedException("Случайная генерация примеров не реализована");
                }
                // Иначе - генерируем задание
                else
                {
                    example = ExampleGenerator.GenerateExample();
                }
            }
            // Если нам дан пример не задачи о максимальном паросочетании в двудольном графе - ошибка
            maxBipartiteMatchingExample = example as MaxBipartiteMatchingProblemExample;
            if (maxBipartiteMatchingExample == null)
            {
                throw new ArgumentException("Ошибка в выбранном примере. Его невозможно открыть.");
            }
            // В зависимости от режима задачи (решение/демонстрация) меняем некоторые элементы управления
            problemMode = mode;
            if (problemMode == ProblemMode.Solution)
            {
                SetAnswerGroupBoxSolutionMode();
            }
            else if (problemMode == ProblemMode.Demonstration)
            {
                SetAnswerGroupBoxDemonstrationMode();
            }
            // Создаём граф для визуализации по примеру
            visGraph = new Graph(maxBipartiteMatchingExample.GraphMatrix, maxBipartiteMatchingExample.IsGraphDirected);
            // Задаём расположение вершин графа
            for (int i = 0; i < visGraph.VerticesCount; i++)
            {
                visGraph.Vertices[i].DrawingCoords = maxBipartiteMatchingExample.DefaultGraphLayout[i];
            }
            graphVisInterface.Initialize(visGraph);
            // Сохраняем матрицу графа для решения. Создаём нужные коллекции
            graph              = (bool[, ])maxBipartiteMatchingExample.GraphMatrix.Clone();
            verticesCount      = maxBipartiteMatchingExample.GraphMatrix.GetLength(0);
            curAugmentalPath   = new List <int>();
            matchingPairsArray = new int[verticesCount];
            for (int i = 0; i < verticesCount; i++)
            {
                matchingPairsArray[i] = -1;
            }
            // Пишем условие задачи - номер истока и номер стока
            textLabelExampleDescription.Text =
                "Максимальное паросочетание?";
            // Получаем решение задачи
            correctMaximalMatchingCardinality = Algorithm.GetMatchingCardinality(Algorithm.GetMaximalMatching(graph, verticesCount));
            // Инициализируем статистику решения
            if (problemMode == ProblemMode.Solution)
            {
                maxBipartiteMatchingProblemStatistics = new MaxBipartiteMatchingProblemStatistics();
            }
            // Ставим решение в состояние ожидания начала
            SetStartWaitingState();
        }