예제 #1
0
 public BothBell(SingleBell parents, SingleBell child, TypeCompare compare, TypeSorted sorted, TypeAlignCfg align)
 {
     this._parents = parents;
     this._child   = child;
     Compare       = compare;
     Sorted        = sorted;
     Align         = align;
 }
예제 #2
0
 private void ShowAddBell(int position, int amount, SingleBell A)
 {
     this.progressBar1.Maximum = amount;
     this.progressBar1.Value   = position;
     this.label4.Text          = String.Format("Найдено {0} вариантов из {1}", position, amount);
     if (position == amount)
     {
         Bell.AddBellElement -= ShowAddBell;
     }
 }
예제 #3
0
파일: Bell.cs 프로젝트: LikoIlya/AOP-Ruller
 void Gen(ref List <SingleBell> E, SingleBell A, int k, int p)    // Рукурсивная процедура генерации перестановок
 {                                                                // Входные данные:
     // A - Входной масссив последовательности
     // k - текущее значение длины сформированной последовательности
     if (A.Count > 0)
     {
         if (k == A.Count)           // Если сформировалась последовательность длиной, которая соответствует
         {                           // начальной длине массива последовательности, то добавляем ее в итоговый массив
             if (!SearchBell(E, A))
             {
                 lock (this)
                 {
                     E.Add(A.Clone());
                     if (AddBellFullElement != null)
                     {
                         AddBellFullElement(countOfAddBellFullElementEvent++, amountBellFull.Count, new BothBell(aBell[p], E[E.Count - 1]), p); // Вызов события AddBellFullElement нахождения очередного элемента массива конфигураций обобщенных чисел Белла
                     }
                 }
             }
         }
         else                          // Если длина последовательности не достигла длине
                                       // перевоначального массива,
         {                             // производим циклические перестановки
             SingleBell R = A.Clone(); // Создаем временный массив
             for (int i = k; i < A.Count; i++)
             {
                 for (int j = 0; j < R.Count; j++)
                 {
                     if (j == k)
                     {
                         R[j] = A[i];
                     }
                     else if (j == (i))
                     {
                         R[j] = A[k];
                     }
                     else
                     {
                         R[j] = A[j];
                     }
                 }
                 if (stopThread())
                 {
                     i = A.Count;
                 }
                 else
                 {
                     Gen(ref E, R, k + 1, p);
                 }
             }
             R = null;
         }
     }
 }
예제 #4
0
파일: Bell.cs 프로젝트: LikoIlya/AOP-Ruller
 public Bell(int count)
 {
     aBell          = new List <SingleBell>();
     aBellFull      = new List <BothBell>();
     aBellTemp      = new SingleBell();
     T              = new Thread[0];
     S              = new bool[0];
     amountBell     = new A000041(count);
     amountBellFull = new A005418(count);
     countOfAddBellFullElementEvent = 0;
     LengthChild   = count;
     LengthParents = count;
     Count         = count;
 }
예제 #5
0
파일: Bell.cs 프로젝트: LikoIlya/AOP-Ruller
        /// <summary>
        /// Метод, производящий перестановку элементов массива
        /// </summary>
        /// <param name="R"></param>
        /// <param name="k"></param>

        /*void Mix(ref tempArr[] R, uint k)    // Метод, производящий перестановку элементов массива
         * {
         *  if (k < (R.Length - 1))
         *  {
         *      int a = R[k][R[k].I];
         *      int b = R[k][k];
         *      for (int j = 0; j < R.Length; j++)
         *      {
         *          if (j == k) R[k + 1][j] = a;
         *          else if (j == R[k].I) R[k + 1][j] = b;
         *          else R[k + 1][j] = R[k][j];
         *      }
         *  }
         * }*/
        bool SearchBell(List <SingleBell> T, SingleBell a) // Метод, который проверяет на наличие дубликата
        {                                                  // T - Массив, в котором ведется поиск,
                                                           // a - массив искомой конфигурации
                                                           // Возвращает true, если такая конфигурация уже существкует
            bool r = false;
            bool k;

            if (T.Count > 0)
            {
                for (int i = 0; i < T.Count; i++)
                {
                    k = true;
                    for (int j = 0; j < T[i].Count; j++)
                    {
                        if (T[i][j] != a[j])
                        {
                            k = false;
                            j = T[i].Count;
                        }
                    }
                    r = k;
                    if (k)
                    {
                        i = T.Count;
                    }
                }
                if (!r)
                {
                    for (int i = 0; i < T.Count; i++)
                    {
                        k = true;
                        for (int j = 0; j < T[i].Count; j++)
                        {
                            if (T[i][T[i].Count - j - 1] != a[j])
                            {
                                k = false;
                                j = T[i].Count;
                            }
                        }
                        r = k;
                        if (k)
                        {
                            i = T.Count;
                        }
                    }
                }
            }
            return(r);
        }
예제 #6
0
파일: Bell.cs 프로젝트: LikoIlya/AOP-Ruller
        /*void PermutationBell()  // Метод для полных перестановок полученных конфигураций в массиве aBell[]
         * {                       // Результат заносится в массив aBellFull[]
         *
         *  aBellFull.Add(new BothBell(aBell[0], aBell[0]));
         *  lock (this)
         *  {
         *      if (AddBellFullElement != null) AddBellFullElement(countOfAddBellFullElementEvent++, amountBellFull.Count, aBell[0], 0, aBell[0]); // Вызов события AddBellFullElement нахождения очередного элемента массива конфигураций обобщенных чисел Белла
         *  }
         *  T = new Thread[aBell.Count - 1];
         *  S = new bool[aBell.Count - 1];
         *  for (int i = 0; i < S.Length; i++) S[i] = false;
         *  for (int i = 1; i < aBell.Count; i++)
         *  {
         *      T[i - 1] = new Thread(new ParameterizedThreadStart(Generate));
         *      T[i - 1].IsBackground = true;
         *      T[i - 1].Start((object)i);
         *      //Generate((object)i);
         *  }
         *  TimeBellFull = DateTime.Now - timeStartBellFull;
         * }*/
        void Generate(object o)
        {
            int               i = (int)o;
            SingleBell        A = aBell[i].Clone();
            List <SingleBell> E = new List <SingleBell>();

            Gen(ref E, A, 0, i);
            if (E.Count != 0)
            {
                lock (this)
                {
                    for (int j = 0; j < E.Count; j++)
                    {
                        aBellFull.Add(new BothBell(aBell[i], E[j]));
                    }
                    S[i - 1] = true;
                }
            }
        }
예제 #7
0
 public VariantRullerBuilder(SingleBell configs) : this(configs.ToArrayBell())
 {
 }
예제 #8
0
 public BothBell(SingleBell parents, SingleBell child) : this(parents, child, TypeCompare.FirstParents, TypeSorted.Up, TypeAlignCfg.Left)
 {
 }