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