// Сохранить выбор пользователя
        private void SaveSelectedOptions(ProblemMode mode)
        {
            IProblem selectedProblem = problems[listBoxProblems.SelectedIndex];

            ProblemExample[] selectedProblemExamples = selectedProblem.ProblemDescriptor.ProblemExamples;
            SelectedProblem = selectedProblem;
            // Если был выбран пример "Случаный пример", то ему соответствует null (его нет в списке примеров)
            if (listBoxExamples.SelectedIndex < selectedProblemExamples.Length)
            {
                SelectedExample = selectedProblemExamples[listBoxExamples.SelectedIndex];
            }
            else
            {
                SelectedExample = null;
            }
            SelectedMode = mode;
        }
    public static List<Problem> CreateSubProblems(Entry entry, ProblemMode problemMode)
    {
        List<Problem> problems;

        if (problemMode == ProblemMode.PartialWord)
        {
            problems = CreateSubProblems_PartialWord(entry);
        }
        else if (problemMode == ProblemMode.EachLetter)
        {
            problems = CreateSubProblems_WholeWord(entry).Union(
                CreateSubProblems_EachLetter(entry)).ToList();
        }
        else // Whole Word
        {
            problems = CreateSubProblems_WholeWord(entry);
        }

        return problems;
    }
Esempio n. 3
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();
        }
Esempio n. 4
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();
        }