コード例 #1
0
        // Перевести задачу в состояние выполненной задачи
        void SetProblemFinish()
        {
            problemState = MaxBipartiteMatchingProblemState.ProblemFinish;
            graphVisInterface.InteractiveMode  = InteractiveMode.NonInteractive;
            graphVisInterface.IsVerticesMoving = false;
            string message =
                "Максимальное паросочетание в двудольном графе найдено." + Environment.NewLine +
                "Задание успешно выполнено!";

            ShowSuccessTip(message);
            if (problemMode == ProblemMode.Solution)
            {
                SetAnswerGroupBoxState(false, false, "Принять ответ");
            }
            else if (problemMode == ProblemMode.Demonstration)
            {
                SetAnswerGroupBoxState(false, false, "Сделать шаг");
            }
            buttonReloadIteration.Enabled = false;
            // Отмечаем, что задача решена
            if (problemMode == ProblemMode.Solution)
            {
                maxBipartiteMatchingProblemStatistics.IsSolved = true;
                Close();
            }
        }
コード例 #2
0
        // Перевести задачу в состояние ожидания значения мощности найденного максимального паросочетания
        private void SetMaxMatchingCardinalityWaitingState()
        {
            problemState = MaxBipartiteMatchingProblemState.MaxMatchingCardinalityWaiting;
            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 +
                    $"Мощность максимального (текущего) паросочетания для этого двудольного графа равна {correctMaximalMatchingCardinality}.";
            }
            ShowSuccessTip(message);
            if (problemMode == ProblemMode.Solution)
            {
                SetAnswerGroupBoxState(true, true, "Принять ответ");
            }
            buttonReloadIteration.Enabled = false;
        }
コード例 #3
0
        // Перевести задачу в состояние ожидания вершины для аугментального маршрута
        private void SetNextPathVertexWaitingState()
        {
            problemState = MaxBipartiteMatchingProblemState.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}." + 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;
            }
            message +=
                "Жирным выделены рёбра, которые принадлежат текущему паросочетанию. " +
                "Зелёным при построении аугментальной цепи выделяются рёбра, которые после проведения чередования должны войти в паросочетание. " +
                "Красным при построении аугментальной цепи выделяются рёбра, которые после проведения чередования должны удалиться из паросочетания." + Environment.NewLine;
            if (problemMode == ProblemMode.Demonstration)
            {
                message +=
                    "Нажмите кнопку \"Сделать шаг\", чтобы добавить следующую вершину в строящийся аугментальный путь.";
            }
            ShowStandardTip(message);
            if (problemMode == ProblemMode.Solution)
            {
                SetAnswerGroupBoxState(true, false, "Провести чередование");
            }
            else if (problemMode == ProblemMode.Demonstration)
            {
                SetAnswerGroupBoxState(true, false, "Сделать шаг");
            }
            buttonReloadIteration.Enabled = true;
        }
コード例 #4
0
        // Перевести задачу в псевдосостояние ожидания чередования по построенному аугментальному пути (для режима демонстрации)
        private void SetAlternationWaitState()
        {
            problemState = MaxBipartiteMatchingProblemState.NextPathVertexWaiting; // Само состояние совпадает с состоянием ожидания очередной вершины
            string message =
                "Аугментальная цепь построена." + Environment.NewLine +
                "Нажмите кнопку \"Сделать шаг\", чтобы провести чередование рёбер по построенному аугментальному пути. " +
                "При этом рёбра, входящие в паросочетание (выделены жирным и красным), будут удалены из него, " +
                "а оставшиеся рёбра цепи (выделены зелёным), наоборот, будут добавлены в него. Таким образом мощность паросочетания увеличится на единицу.";

            ShowSuccessTip(message);
            SetAnswerGroupBoxState(true, false, "Сделать шаг");
            buttonReloadIteration.Enabled = true;
        }
コード例 #5
0
        // ----Методы изменения состояния (этапа) решения задания
        // Перевести задачу в состояние ожидания начала
        private void SetStartWaitingState()
        {
            problemState = MaxBipartiteMatchingProblemState.StartWaiting;
            graphVisInterface.InteractiveMode  = InteractiveMode.NonInteractive;
            graphVisInterface.IsVerticesMoving = false;
            string message = "";

            if (problemMode == ProblemMode.Solution)
            {
                message =
                    "Добро пожаловать в задание \"Максимальное паросочетание в двудольном графе\"!" + Environment.NewLine +
                    "Ваша задача - найти максимальное паросочетание в представленном двудольном графе и указать его мощность." + Environment.NewLine +
                    "Последовательно стройте аугментальные маршруты и постепенно увеличивайте мощность текущего паросочетания. " +
                    "Для построения чередующихся (аугментальных) цепей последовательно выбирайте вершины маршрута, начав с непокрытой паросочетанием вершины " +
                    "и закончив такой же непокрытой вершиной." + 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);
            if (problemMode == ProblemMode.Solution)
            {
                SetAnswerGroupBoxState(false, true, "Принять ответ");
            }
            else if (problemMode == ProblemMode.Demonstration)
            {
                SetAnswerGroupBoxState(false, false, "Сделать шаг");
            }
            buttonReloadIteration.Enabled = true;
        }