예제 #1
0
 /// <summary>
 /// Конструктор-клонизатор
 /// </summary>
 /// <param name="prototype"></param>
 public MdsRowViewModel(MdsRowViewModel prototype)
 {
     this.VerticesSet  = prototype.VerticesSet;
     this.IsBuilt      = prototype.IsBuilt;
     this.Number       = ++_count;
     this.VerticesView = prototype.VerticesView;
 }
        /// <summary> Задание загружено </summary>
        /// <param name="e"></param>
        protected override void OnTaskLoadingComlete(VariantDownloadedEventArgs e)
        {
            // Мы вызваны из другого потока. Поэтому работаем с UI-элементами через Dispatcher.
            Dispatcher.BeginInvoke(
                () =>
            {
                try
                {
                    GivenGraph = (UndirectedGraph)VariantSerializer.Deserialize(e.Data)[0];
                }
                catch (InvalidCastException ex)
                {
                    throw new InvalidCastException("Входной граф должен быть неориентированным.", ex);
                }

                MdsRows = new ObservableCollection <MdsRowViewModel>();
                DomSet  = new ObservableCollection <Vertex>();
                IsMouseVerticesMovingEnabled = true;
                var minDsCount = new MinDSEvaluator(GivenGraph);
                minDsCount.Evaluate(GivenGraph, true);
                RealMdsRows = new List <MdsRowViewModel>();
                foreach (var minDs in minDsCount.MinDs)
                {
                    var tempScc = new MdsRowViewModel(minDs);
                    RealMdsRows.Add(tempScc);
                }
                var minimalDsCount = new MinDSEvaluator(GivenGraph);
                minimalDsCount.Evaluate(GivenGraph, false);
                var tempCount = 0;
                foreach (var minDs in minimalDsCount.MinDs)
                {
                    tempCount++;
                }
                _task       = Task.TaskAdjacencyMatrix;
                _dsCount    = tempCount - 1;
                _countOfSes = _dsCount;

                var matrix = new ObservableCollection <CommonUI.Controls.ViewModels.MatrixRowViewModel <string> >();
                for (var i = 0; i < GivenGraph.VerticesCount; ++i)
                {
                    var row = new ObservableCollection <string> {
                        i.ToString()
                    };
                    for (var j = 0; j < GivenGraph.VerticesCount; ++j)
                    {
                        row.Add("0");
                    }

                    row.CollectionChanged += RowChanged;
                    matrix.Add(new CommonUI.Controls.ViewModels.MatrixRowViewModel <string>(row));
                }
                Matrix = matrix;
            });
        }
        /// <summary>
        ///  Является ли множество минимальным доминирующим
        /// </summary>
        /// <param name="setEs"></param>
        /// <param name="givenGraph"></param>
        /// <returns></returns>
        public bool IsMinimal(IList <Vertex> setEs, UndirectedGraph givenGraph)
        {
            var leadFlag = true;
            var flag     = true;

            for (var i = 0; i < setEs.Count; i++)
            {
                var newSet = new MdsRowViewModel(setEs, false);
                newSet.VerticesSet.RemoveAt(i);
                flag = IsExternalStability(newSet.VerticesSet, givenGraph);
                if (flag)
                {
                    leadFlag = false;
                }
            }
            if (leadFlag)
            {
                return(true);
            }
            return(false);
        }
        /// <summary>
        /// Проверка выбранного множества вершин на соответствие множеству внешней устойчивости
        /// </summary>
        /// <returns></returns>
        private bool ValidateSet()
        {
            var  isAdded    = false;
            var  setChecker = new CheckSet();
            bool isExternal = setChecker.IsExternalStability(DomSet, GivenGraph);
            var  sccStr     = new MdsRowViewModel(DomSet, _dsCount - _countOfSes + 1);
            var  isMinimal  = setChecker.IsMinimal(DomSet, GivenGraph);

            // какое множество проверяем
            UserActionsManager.RegisterInfo("Внешняя устойчивость. Задание 2. На проверку отправлено множество: " + sccStr.VerticesView);
            if (isExternal)
            {
                if (isMinimal)
                {
                    //Поиск выбранного множества в списке всех множеств ???
                    foreach (var sccRow in MdsRows)
                    {
                        if (sccRow.VerticesView == sccStr.VerticesView)
                        {
                            isAdded = true;
                            break;
                        }
                    }
                    //Проверка на уже добавленность выбранного множества
                    if (isAdded)
                    {
                        MessageBox.Show("Множество " + sccStr.VerticesView + " уже добавлено.");
                        if (UserActionsManager.Score > 2)
                        {
                            UserActionsManager.RegisterMistake("Множество " + sccStr.VerticesView + " уже добавлено.", 2);
                        }
                        else if (UserActionsManager.Score > 0)
                        {
                            UserActionsManager.RegisterMistake("Множество " + sccStr.VerticesView + " уже добавлено.",
                                                               (short)UserActionsManager.Score);
                        }
                    }
                    else
                    {
                        MdsRows.Add(sccStr);
                        --_countOfSes;
                        //Выбрано достаточное количество множеств внешней устойчивости
                        if (_countOfSes == 0)
                        {
                            UserActionsManager.RegisterInfo("Внешняя устойчивость. Задание 2 завершено. ");
                            MessageBox.Show("Задание 2 пройдено.\n Вы перешли к заданию 3.\n Ознакомьтесь со справкой.<?>");
                            _task = Task.TaskFindMinDomSets;
                        }
                        if (UserActionsManager.Score > _countOfSes)
                        {
                            UserActionsManager.RegisterInfo(string.Format(@"Множество добавлено. Осталось {0} множеств(о).",
                                                                          _countOfSes));
                        }
                        else if (UserActionsManager.Score > 0)
                        {
                            UserActionsManager.RegisterInfo(string.Format(@"Множество добавлено. Осталось {0} множеств(о).",
                                                                          UserActionsManager.Score));
                        }
                    }

                    //Очищаем текущее множество выбранных вершин
                    DomSet.Clear();

                    //Визуальное изменение выбранных элементов
                    foreach (var vertex in VertVisCol)
                    {
                        vertex.BorderBrush = new SolidColorBrush(_defaultBorderColor);
                        vertex.Background  = new SolidColorBrush(_defaultBackgroundColor);
                        Matrix[Convert.ToInt32(vertex.Name)].Background =
                            new SolidColorBrush(Color.FromArgb(250, 239, 240, 250));
                    }


                    foreach (var edge in EdgeVisCol)
                    {
                        edge.Stroke = new SolidColorBrush(_defaultBorderColor);
                    }
                }
                else
                {
                    if (UserActionsManager.Score > 10)
                    {
                        UserActionsManager.RegisterMistake("Это множество вершин не является минимальным.", 10);
                    }
                    else if (UserActionsManager.Score > 0)
                    {
                        UserActionsManager.RegisterMistake("Это множество вершин не является минимальным.",
                                                           (short)UserActionsManager.Score);
                    }
                }
            }
            else
            {
                if (UserActionsManager.Score > 10)
                {
                    UserActionsManager.RegisterMistake("Это множество вершин не является внешне устойчивым.", 10);
                }
                else if (UserActionsManager.Score > 0)
                {
                    UserActionsManager.RegisterMistake("Это множество вершин не является внешне устойчивым.",
                                                       (short)UserActionsManager.Score);
                }
            }
            return(true);
        }