/// <summary> /// Конструктор /// </summary> /// <param name="problemDescriptor">Объект, содержащий описание решённой задачи</param> /// <param name="problemExample">Объект, содержащий решённый пример</param> /// <param name="problemStatistics">Объект, содержащий статистику решённой задачи (примера)</param> public FormProblemStatistics(IProblemDescriptor problemDescriptor, ProblemExample problemExample, IProblemStatistics problemStatistics) : this() { // Сохраняем всю информацию this.problemDescriptor = problemDescriptor; this.problemStatistics = problemStatistics; this.problemExample = problemExample; // Отображаем статистику textLabelStatistics.Text = problemStatistics.GetStatisticsText(); }
/// <summary> /// Отправить статистику решения задачи на сервер /// </summary> /// <param name="problem">Дескриптор решённой задачи</param> /// <param name="example">Дескприптор решённого примера</param> /// <param name="statistics">Статистика решения</param> /// <param name="studentName">Имя студента</param> /// <param name="studentGroup">Группа (класс) студента</param> /// <param name="errorMessage">Сообщение об ошибке. Означивается, если произошла ошибка</param> /// <returns>Флаг успеха</returns> public bool Send(IProblemDescriptor problem, ProblemExample example, IProblemStatistics statistics, string studentName, string studentGroup, out string errorMessage) { bool isSuccess = true; errorMessage = null; // Все отправляемые данные представляем в виде словаря пар <строка>-<строка> и сериализуем его в json Dictionary <string, string> data = new Dictionary <string, string> { { "student_name", studentName }, { "student_group", studentGroup }, { "problem_name", problem.Name }, { "example_name", example.Name }, { "example_description", example.Description }, { "statistics_body", statistics.GetStatisticsText() }, { "total_errors_count", statistics.TotalErrorsCount.ToString() }, { "necessary_errors_count", statistics.TotalNecessaryErrorsCount.ToString() }, { "mark", statistics.Mark.ToString() } }; string json = JsonConvert.SerializeObject(data, Formatting.Indented); // Готовим объект для совершения POST-запроса с JSON на сервер для отправки статистики var httpWebRequest = (HttpWebRequest)WebRequest.Create($"{serverConfig.ServerUri}/api/stats"); httpWebRequest.ContentType = "application/json"; httpWebRequest.Method = "POST"; // Совершаем запрос и получаем ответ try { // Пишем json в запрос using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())) { streamWriter.Write(json); } var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse(); // Читаем ответ using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) { var responseString = streamReader.ReadToEnd(); } } catch (Exception e) { isSuccess = false; errorMessage = e.Message; } return(isSuccess); }
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(); }