Пример #1
0
 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();
     }
 }
Пример #2
0
        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();
        }
Пример #3
0
        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();
        }
Пример #4
0
 private static void FourthStepB2()
 {
     Console.WriteLine("На множестве Im/B^1 не существует упорядоченного непустого множества B^2 с заданными св-вами");
     if (firstOrderedMultitude.elements.Count != 0)
     {
         firstRecord            = firstOrderedMultitude;
         secondOrderedMultitude = new OrderedMultitude();
         FifthStep();
     }
 }
Пример #5
0
 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();
 }
Пример #6
0
        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();
                }
            }
        }
Пример #7
0
 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;
                 }
             }
         }
     }
 }
Пример #8
0
 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;
                 }
             }
         }
     }
 }