// Сохранить выбор пользователя 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; }
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(); }
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(); }