Пример #1
0
        // Перевести задачу в состояние ожидания величины максимального потока для построеннного максимального потока сети
        void SetMaximalFlowWaiting()
        {
            problemState = MaxFlowProblemState.MaximalFlowWaiting;
            if (problemMode == ProblemMode.Solution)
            {
                graphVisInterface.InteractiveMode  = InteractiveMode.NonInteractive;
                graphVisInterface.IsVerticesMoving = false;
            }
            string message = "";

            if (problemMode == ProblemMode.Solution)
            {
                message =
                    "Максимальный поток в сети построен." + Environment.NewLine +
                    "Введите в поле для ответов величину построенного максимального потока в виде одного целого числа.";
            }
            else if (problemMode == ProblemMode.Demonstration)
            {
                message =
                    "Максимальный поток в сети построен." + Environment.NewLine +
                    $"Величина максимального (текущего) потока для данной сети равна {correctMaxFlowValue}.";
            }
            ShowSuccessTip(message);
            if (problemMode == ProblemMode.Solution)
            {
                UnlockAnswerGroupBox();
            }
            buttonReloadIteration.Enabled = false;
        }
Пример #2
0
        // Перевести задачу в состояние ожидания величины аугментального потока для построенного аугментального пути
        void SetFlowRaiseWaiting()
        {
            problemState = MaxFlowProblemState.FlowRaiseWaiting;
            if (problemMode == ProblemMode.Solution)
            {
                graphVisInterface.InteractiveMode  = InteractiveMode.NonInteractive;
                graphVisInterface.IsVerticesMoving = false;
            }
            string message = "";

            if (problemMode == ProblemMode.Solution)
            {
                message =
                    "Аугментальный путь построен." + Environment.NewLine +
                    "Введите в поле для ответов величину дополнительного потока, который можно пустить по построенному аугментальному пути, в виде одного целого числа.";
            }
            else if (problemMode == ProblemMode.Demonstration)
            {
                message = "Аугментальный путь построен." + Environment.NewLine +
                          $"Нажмите кнопку \"Сделать шаг\", чтобы пустить по построенному аугментальному пути дополнительный поток величиной {curAugmentalFlowValue}.";
            }
            ShowSuccessTip(message);
            if (problemMode == ProblemMode.Solution)
            {
                UnlockAnswerGroupBox();
            }
            buttonReloadIteration.Enabled = false;
        }
Пример #3
0
        // Перевести задачу в состояние ожидания метки выбранной вершины для аугментального пути
        void SetPathVertexLabelWaiting()
        {
            problemState = MaxFlowProblemState.PathVertexLabelWaiting;
            if (problemMode == ProblemMode.Solution)
            {
                graphVisInterface.InteractiveMode  = InteractiveMode.NonInteractive;
                graphVisInterface.IsVerticesMoving = false;
            }
            string message = "";

            if (problemMode == ProblemMode.Solution)
            {
                message =
                    "Введите метку для вершины в поле для ответов, а затем нажмите кнопку \"Принять ответ\"." + Environment.NewLine +
                    "Метка вводится в формате:" + Environment.NewLine +
                    "\"<знак><предыдущая вершина> <текущий аугментальный поток>\"," + Environment.NewLine +
                    "например: \"+1 inf\" или \"-7 19\"." + Environment.NewLine +
                    "Для вершины-истока текущий аугментальный поток следует принять бесконечным: \"inf\"." + Environment.NewLine +
                    "Метка проверяется на правильность, и ошибочная метка будет отмечена как ошибка (кроме опечаток)." + Environment.NewLine +
                    "Вы можете не ставить метку: для этого оставьте поле ввода ответа пустым.";
            }
            ShowStandardTip(message);
            if (problemMode == ProblemMode.Solution)
            {
                UnlockAnswerGroupBox();
            }
            buttonReloadIteration.Enabled = true;
        }
Пример #4
0
        // Перевести задачу в состояние ожидания следующей вершины для аугментального пути
        void SetNextPathVertexWaiting()
        {
            problemState = MaxFlowProblemState.NextPathVertexWaiting;
            if (problemMode == ProblemMode.Solution)
            {
                graphVisInterface.InteractiveMode  = InteractiveMode.Interactive;
                graphVisInterface.IsVerticesMoving = true;
            }
            string message = "";

            if (problemMode == ProblemMode.Solution)
            {
                message =
                    "Выберите следующую вершину для аугментального пути." + Environment.NewLine;
            }
            else if (problemMode == ProblemMode.Demonstration)
            {
                if (curAugmentalPath.Count > 0)
                {
                    int lastVertexIndex = curAugmentalPath.Last();
                    message = $"Последней выбрана вершина {lastVertexIndex + 1}, метка для неё: {visGraph[lastVertexIndex].Label}." + Environment.NewLine;
                }
            }
            if (curAugmentalPath.Count > 0)
            {
                // Формируем строку с текущим аугментальным маршрутом
                StringBuilder pathStr = new StringBuilder();
                foreach (var pathVertex in curAugmentalPath)
                {
                    pathStr.Append($"{pathVertex + 1}-");
                }
                // Удаляем последнюю чёрточку
                pathStr.Remove(pathStr.Length - 1, 1);
                message += $"Текущий аугментальный путь: {pathStr}." + Environment.NewLine;
            }
            if (problemMode == ProblemMode.Demonstration)
            {
                message +=
                    "Нажмите кнопку \"Сделать шаг\", чтобы добавить следующую вершину в строящийся аугментальный путь.";
            }
            ShowStandardTip(message);
            if (problemMode == ProblemMode.Solution)
            {
                LockAnswerGroupBox();
            }
            buttonReloadIteration.Enabled = true;
        }
Пример #5
0
        // Перевести задачу в состояние выполненной задачи
        void SetProblemFinish()
        {
            problemState = MaxFlowProblemState.ProblemFinish;
            if (problemMode == ProblemMode.Solution)
            {
                graphVisInterface.InteractiveMode  = InteractiveMode.NonInteractive;
                graphVisInterface.IsVerticesMoving = false;
            }
            string message =
                "Максимальный поток и минимальный разрез в сети найдены." + Environment.NewLine +
                "Задание успешно выполнено!";

            ShowSuccessTip(message);
            LockAnswerGroupBox();
            buttonReloadIteration.Enabled = false;
            // Отмечаем, что задача решена
            if (problemMode == ProblemMode.Solution)
            {
                ProblemStatistics.IsSolved = true;
                Close();
            }
        }
Пример #6
0
        // Перевести задачу в состояние ожидания следующей дуги минимального разреза
        void SetNextCutEdgeWaiting()
        {
            problemState = MaxFlowProblemState.NextCutEdgeWaiting;
            if (problemMode == ProblemMode.Solution)
            {
                graphVisInterface.InteractiveMode  = InteractiveMode.Interactive;
                graphVisInterface.IsVerticesMoving = true;
            }
            string message = "";

            if (problemMode == ProblemMode.Solution)
            {
                message =
                    "Выберите все дуги, которые входят в минимальный разрез данной сети." + Environment.NewLine;
            }
            if (curCutEdges.Count != 0)
            {
                // Формируем строку с текущими выбранными дугами разреза
                StringBuilder cutEdgesStr = new StringBuilder();
                foreach (var cutEdge in curCutEdges)
                {
                    cutEdgesStr.Append($"({cutEdge.Item1 + 1};{cutEdge.Item2 + 1}), ");
                }
                // Удаляем последнюю запятую и пробел
                cutEdgesStr.Remove(cutEdgesStr.Length - 2, 2);
                message += $"Уже отмеченные дуги минимального разреза: {cutEdgesStr}." + Environment.NewLine;
            }
            if (problemMode == ProblemMode.Demonstration)
            {
                message = "Нажмите кнопку \"Сделать шаг\", чтобы выбрать очередную дугу минимального разреза.";
            }
            ShowStandardTip(message);
            if (problemMode == ProblemMode.Solution)
            {
                LockAnswerGroupBox();
            }
            buttonReloadIteration.Enabled = false;
        }
Пример #7
0
        // ----Методы изменения состояния (этапа) решения задания
        // Перевести задачу в состояние ожидания начала
        void SetStartWaitingState()
        {
            problemState = MaxFlowProblemState.StartWaiting;
            graphVisInterface.InteractiveMode  = InteractiveMode.NonInteractive;
            graphVisInterface.IsVerticesMoving = false;
            string message = "";

            if (problemMode == ProblemMode.Solution)
            {
                message =
                    "Добро пожаловать в задание \"Максимальный поток в сети\"!" + Environment.NewLine +
                    "Ваша задача - найти максимальный поток в представленной сети, а затем - " +
                    "её минимальный разрез." + Environment.NewLine +
                    "Стройте аугментальные маршруты от истока к стоку. " +
                    "Для этого выбирайте вершины маршрута, начав с истока, и закончив в стоке." + Environment.NewLine +
                    $"Исток - вершина {maxFlowExample.SourceVertexIndex + 1}, сток - вершина {maxFlowExample.TargetVertexIndex + 1}." + Environment.NewLine +
                    "Если при построении маршрута Вы зашли в тупик, можете сбросить построенный маршрут кнопкой \"К началу итерации\", " +
                    "это не повлияет на оценку." + Environment.NewLine +
                    "Если Вы хотите начать задание заново, нажмите кнопку \"Начать заново\"." + Environment.NewLine +
                    "Если Вы хотите вспомнить тему, откройте текст лекции с помощью кнопки \"Текст лекции\"." + Environment.NewLine +
                    "Чтобы начать решение, нажмите кнопку \"К началу итерации\".";
            }
            else if (problemMode == ProblemMode.Demonstration)
            {
                message =
                    "Добро пожаловать в демонстрацию решения задачи \"Максимальный поток в сети\"!" + Environment.NewLine +
                    "Здесь у Вас есть возможность просмотреть пошаговую демонстрацию решения задачи о максимальном потоке." + Environment.NewLine +
                    "Для того, чтобы сделать очередной шаг решения, нажимайте кнопку \"Сделать шаг\"." + Environment.NewLine +
                    "Вы можете начать итерацию решения заново кнопкой \"К началу итерации\"." +
                    "Если Вы хотите начать задание заново, нажмите кнопку \"Начать заново\"." + Environment.NewLine +
                    "Если Вы хотите вспомнить тему, откройте текст лекции с помощью кнопки \"Текст лекции\"." + Environment.NewLine +
                    "Чтобы начать демонстрацию решения, нажмите кнопку \"К началу итерации\", " +
                    "а затем используйте кнопки \"Сделать шаг\", \"К началу итерации\" и \"Начать заново\" для управления ходом решения.";
            }
            ShowSuccessTip(message);
            LockAnswerGroupBox();
            buttonReloadIteration.Enabled = true;
        }