/// <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);
        }
Ejemplo 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();
        }
Ejemplo 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();
        }