private static void FourthStepB1a() { firstRecord = firstOrderedMultitude; secondRecord = secondOrderedMultitude; if (firstRecord.weight + secondRecord.weight == omega[0].Count) //неравенство 2.3.7 { Console.WriteLine("Перебор окончен, сумма весов рекордных множеств имеет максимально возможный вес"); //конец if (taskType == 2) { Console.Write("B1: "); foreach (int element in firstRecord.elements) { Console.Write("{0}", element); } } Console.Write(" B2: "); foreach (int element in secondRecord.elements) { Console.Write("{0}", element); } Console.WriteLine(); FifthStep(); } else { FourthStepA1b(); } }
private static Stopwatch time; // создаём объект Stopwatch public static void Main(string[] args) { Thread FirstThread = new Thread(ThirdStep, 2147483647); //увеличение памяти Thread SecondThread = new Thread(FirstStep, 2147483647); //увеличение памяти time = new Stopwatch(); time.Start(); // запускаем отсчёт времени if (args.Length > 0) { inputFileName = args[0]; n = int.Parse(args[1]); taskType = int.Parse(args[2]); } a.Fill(); //заполнить структурную матрицу из файла Console.WriteLine("Исходная структурная матрица:"); a.Print(); //Показать заполненную матрицу //TODO: брать веса из файла /* if (weights.Count == 0 || weights.Count != n) * { * for (int i = 0; i < n; i++) * { * weights.Add(new WeightCoefficient(i, 1)); * } * }*/ weights.Add(new WeightCoefficient(0, 4)); weights.Add(new WeightCoefficient(1, 2)); weights.Add(new WeightCoefficient(2, 2)); weights.Add(new WeightCoefficient(3, 5)); weights.Add(new WeightCoefficient(4, 3)); weights.Add(new WeightCoefficient(5, 3)); weights.Add(new WeightCoefficient(6, 4)); omega = a.FindOmegaZero();//ищем омега (1,0) if (omega[0].Count == 0) { Console.WriteLine("Никакое изменение порядка следования уравнений исходной системы не может обеспечить выделения групп уравнений, имеющих структурные особенности"); time.Stop(); // останавливаем работу Console.WriteLine(time.Elapsed); // выводим затраченное время } else { if (taskType == 1) { firstOrderedMultitude = new OrderedMultitude(); firstRecord = new OrderedMultitude(); secondRecord = new OrderedMultitude(); FirstThread.Start(); // ThirdStep(); } else if (taskType == 2) { SecondThread.Start(); // FirstStep(); } } // Console.Read(); }
private static void ThirdStep()//перебор для задачи 1 с этого пункта { //инициализация омега 2,0 if (taskType == 1) { secondOmega = new List <List <int> > { new List <int>(omega[0]) }; } else if (taskType == 2) { secondOmega = new List <List <int> > { new List <int>(omega[0].Except(firstOrderedMultitude.elements)) }; } indexOfSecondPlunk = 0; //Номер уровня на 2 дереве перебора secondOrderedMultitude = new OrderedMultitude(0, new List <int>()); //очищаем //вводим второе вспомогательные множества centralSecondElement = new List <List <CentralElement> >(); helpfullMultitudeQ = new List <List <PossibleExtension> >(); quantityOfSecondPossibleExtension = new List <List <PossibleExtension> >(); centralSecondElement.Add(new List <CentralElement>()); helpfullMultitudeQ.Add(new List <PossibleExtension>()); quantityOfSecondPossibleExtension.Add(new List <PossibleExtension>()); FourthStep(); }
private static void FourthStepB2() { Console.WriteLine("На множестве Im/B^1 не существует упорядоченного непустого множества B^2 с заданными св-вами"); if (firstOrderedMultitude.elements.Count != 0) { firstRecord = firstOrderedMultitude; secondOrderedMultitude = new OrderedMultitude(); FifthStep(); } }
static void FirstStep() { indexOfFirstPlunk = 0; firstRecord = new OrderedMultitude(); //B1 secondRecord = new OrderedMultitude(); //B2 supportingMultitudeF.Add(new List <CentralElement>()); supportingMultitudeQ.Add(new List <PossibleExtension>()); quantityOfPossibleExtension.Add(new List <PossibleExtension>()); SecondStep(); }
private static void FourthStepA1b() { if (indexOfSecondPlunk > 0) { secondOmega.RemoveAt(indexOfSecondPlunk); centralSecondElement.RemoveAt(indexOfSecondPlunk); helpfullMultitudeQ.RemoveAt(indexOfSecondPlunk); quantityOfSecondPossibleExtension.RemoveAt(indexOfSecondPlunk); indexOfSecondPlunk--; FourthStepA0(); } else if (indexOfSecondPlunk == 0) { Console.WriteLine("Работа алгоритма по поиску наилучшего упорядоченного множества B2 при фиксированном B1 завершена");//конец Console.Write("B1: "); if (taskType == 2) { foreach (int element in firstOrderedMultitude.elements) { Console.Write("{0}", element); } } Console.Write(" B2: "); foreach (int element in secondOrderedMultitude.elements) { Console.Write("{0}", element); } Console.WriteLine(); if (taskType == 1) { secondRecord = secondOrderedMultitude; Console.WriteLine("Найденное рекордное множество B2 и есть искомое"); Console.WriteLine(); FifthStep(); } else if (taskType == 2) { Console.WriteLine("Необходимо построить новое упорядоченное множество B1"); Console.WriteLine(); SecondStepA1(); } } }
private static void OrderSecondMultitude() { if (centralSecondElement[indexOfSecondPlunk].Count != 0) { //инициализация #region secondOrderedMultitude = new OrderedMultitude(0, new List <int>()); int k = indexOfSecondPlunk * 2 + 1; for (int i = 0; i < k; i++) { secondOrderedMultitude.elements.Add(new int()); } #endregion //заполнение #region for (int eps = 0; eps < indexOfSecondPlunk; eps++) { secondOrderedMultitude.elements[eps] = helpfullMultitudeQ[eps].Last().i; secondOrderedMultitude.elements[k - eps - 1] = helpfullMultitudeQ[eps].Last().j; } secondOrderedMultitude.elements[indexOfSecondPlunk] = centralSecondElement[indexOfSecondPlunk].Last().index; #endregion //подсчет веса foreach (int element in secondOrderedMultitude.elements) { foreach (WeightCoefficient weight in Program.weights) { if (weight.index == element) { secondOrderedMultitude.weight += weight.weight; } } } } else { //инициализация #region secondOrderedMultitude = new OrderedMultitude(0, new List <int>()); int k = indexOfSecondPlunk * 2; for (int i = 0; i < k; i++) { secondOrderedMultitude.elements.Add(new int()); } #endregion //заполнение #region for (int eps = 0; eps < indexOfSecondPlunk; eps++) { secondOrderedMultitude.elements[eps] = helpfullMultitudeQ[eps].Last().i; secondOrderedMultitude.elements[k - eps - 1] = helpfullMultitudeQ[eps].Last().j; } #endregion //подсчет веса foreach (int element in secondOrderedMultitude.elements) { foreach (WeightCoefficient weight in Program.weights) { if (weight.index == element) { secondOrderedMultitude.weight += weight.weight; } } } } }
private static void OrderFirstMultitude() { if (supportingMultitudeF[indexOfFirstPlunk].Count != 0) { //инициализация #region firstOrderedMultitude = new OrderedMultitude(0, new List <int>()); int k = indexOfFirstPlunk * 2 + 1; for (int i = 0; i < k; i++) { firstOrderedMultitude.elements.Add(new int()); } #endregion //заполнение #region for (int eps = 0; eps < indexOfFirstPlunk; eps++) { firstOrderedMultitude.elements[eps] = supportingMultitudeQ[eps].Last().i; firstOrderedMultitude.elements[k - eps - 1] = supportingMultitudeQ[eps].Last().j; } firstOrderedMultitude.elements[indexOfFirstPlunk] = supportingMultitudeF[indexOfFirstPlunk].Last().index; #endregion //подсчет веса foreach (int element in firstOrderedMultitude.elements) { foreach (WeightCoefficient weight in Program.weights) { if (weight.index == element) { firstOrderedMultitude.weight += weight.weight; } } } } else { //инициализация #region firstOrderedMultitude = new OrderedMultitude(0, new List <int>()); int k = indexOfFirstPlunk * 2; for (int i = 0; i < k; i++) { firstOrderedMultitude.elements.Add(new int()); } #endregion //заполнение #region for (int eps = 0; eps < indexOfFirstPlunk; eps++) { firstOrderedMultitude.elements[eps] = supportingMultitudeQ[eps].Last().i; firstOrderedMultitude.elements[k - eps - 1] = supportingMultitudeQ[eps].Last().j; } #endregion //подсчет веса foreach (int element in firstOrderedMultitude.elements) { foreach (WeightCoefficient weight in Program.weights) { if (weight.index == element) { firstOrderedMultitude.weight += weight.weight; } } } } }