Esempio n. 1
0
 private void button2_Click(object sender, EventArgs e)
 {
     Mass.Clear();
     newmas.Clear();
     Rez.Clear();
     Nn.Clear();
 }
        private void button1_Click(object sender, EventArgs e)
        {
            long a, n;

            try {
                a = Convert.ToInt64(textBox1.Text);
                n = Convert.ToInt64(textBox2.Text);
            } catch {
                return;
            }

            textBox3.Text = string.Empty;

            string binary_n = string.Empty;

            while (n > 0)
            {
                binary_n += n % 2;        //Інвертований бінарний запис.
                n        /= 2;
            }

            long Rez;

            if (binary_n[0] == '1')
            {
                Rez = a;
            }
            else
            {
                Rez = 1;
            }


            textBox3.Text = Rez.ToString();

            for (int i = 1; i < binary_n.Length; i++)
            {
                a = a * a;
                if (binary_n[i] == '1')
                {
                    textBox3.Text += (" * " + a);
                    Rez           *= a;
                }
            }

            textBox3.Text += " = " + Rez;
        }
Esempio n. 3
0
        // Рассчёт

        private void button1_Click(object sender, EventArgs e)
        {
            textBox3.Clear();
            int Rez,
                n;

            // Проверка конвертации
            if (Int32.TryParse(textBox1.Text, out n))
            {
                // Вызов функции из библиотеки
                Rez = Lib_9.Class.Summ(n, textBox3);
                // Вывод суммы
                textBox2.Text = Rez.ToString();
            }
            // При неудачной конвертации выводим подсказку и очищаем поле
            else
            {
                textBox1.Clear();
                MessageBox.Show("Ошибка конвертации!");
            }
        }
        override public void Build()
        {
            getAnySpanningTree();

            List <List <int> > temp = DeepClone(mainA) as List <List <int> >;

            mainA = spanningTree;
            base.Build(); //into Rez
            mainA = temp;

            if (Rez.Count == 0)
            {
                return;
            }
            //   getAllConflicts();
            while (getAllConflicts().Count > 0)
            {
                conflictPairs = getAllConflicts();
                Point conf         = conflictPairs[0];      //TODO: в загальному випадку ітератор просто по конфліктним парам навряд чи гарна ідея. Але має процювати.
                int   currentLevel = LevelOfV(Rez, conf.X); //TODO: меншого за рівнем з пари

                if (LevelOfV(Rez, conf.X) > LevelOfV(Rez, conf.Y))
                {
                    Rez.Insert(currentLevel + 1, new List <int>());
                    Rez[LevelOfV(Rez, conf.Y)].Remove(conf.Y);
                    Rez[currentLevel + 1].Add(conf.Y);
                    conflictPairs.Remove(conf);
                    continue;
                }

                int t = -1;
                if (currentLevel > 1)
                {
                    if (!hasPreOnLevel(conf.X, currentLevel - 1))
                    {
                        if (Rez[currentLevel - 1].Count < h[0])
                        {
                            Rez[currentLevel - 1].Add(conf.X);
                            Rez[currentLevel].Remove(conf.X);
                            conflictPairs.Remove(conf);
                            //вільне місце!
                            continue;
                        }
                        t = canSwitchPrev(currentLevel);
                        if (t != -1)
                        {
                            // п.4. Міняємо місцями початкову вершину зі знайденого конфлікту, і вершину 𝑡.
                            SwitchVs(t, conf.X);
                            conflictPairs.Remove(conf);
                            continue;
                        }
                    }
                }


                if (currentLevel < Rez.Count - 1)
                {
                    if (!hasNextOnLevel(conf.Y, currentLevel + 1))
                    {
                        if (Rez[currentLevel + 1].Count < h[0]) //або на наступному місці є вільне місце і наша вершина не має наступників на наступному місці
                        {
                            Rez[currentLevel + 1].Add(conf.Y);
                            Rez[currentLevel].Remove(conf.Y);
                            conflictPairs.Remove(conf);
                            continue;
                        }
                        t = canSwitchNext(currentLevel);
                        if (t != -1)
                        {
                            //п.6. Міняємо місцями кінцеву вершину зі знайденого конфлікту, і вершину 𝑡.
                            SwitchVs(t, conf.Y);
                            conflictPairs.Remove(conf);
                            continue;
                        }
                    }
                }


                // п.7. Збільшуємо довжину впорядкування, додавши місце в упорядкування відразу за поточним.
                // Ставимо на нього кінцеву вершину з конфліктної пари.
                Rez.Insert(currentLevel + 1, new List <int>());
                Rez[LevelOfV(Rez, conf.Y)].Remove(conf.Y);
                Rez[currentLevel + 1].Add(conf.Y);
                conflictPairs.Remove(conf);


                AddVInroFreePlaces(currentLevel);
                currentLevel++;
                AddVInroFreePlaces(currentLevel);


                // getAllConflicts();
            }

            for (int i = 0; i < Rez.Count; i++)
            {
                AddVInroFreePlaces(i);
            }
            for (int i = 0; i < Rez.Count; i++)
            {
                if (Rez[i].Count == 0)
                {
                    Rez.Remove(Rez[i]);
                }
            }
        }
Esempio n. 5
0
        //unnecessary, remove late
        public void BuildEuristic()
        {
            A = DeepClone(mainA) as List <List <int> >;
            int l = FindS(A, 1).Count;

            while (true)  //for l0
            {
                Rez.Clear();
                List <int> index        = new List <int>(); // номера вершин, которые мы занесли в упорядочение на это место hi
                List <int> S0           = new List <int>();
                List <int> fromPrevious = new List <int>();
                List <int> nessesary    = new List <int>();



                for (int i = 0; i < h.Count; i++) //для всех hi
                {
                    if (index.Count > 0)
                    {
                        Rez.Add(DeepClone(index) as List <int>);
                    }
                    A = Remove(index);
                    index.Clear();
                    if (A.Count == 0)
                    {
                        return;
                    }

                    S = FindS(A, 0);
                    s = FindS(A, 1);
                    int k = 0;
                    //находим вершины, которые поставили в упорядочение на прошлом шаге,
                    //и которые еще существуют
                    fromPrevious = fromPreviousLevel(Rez);

                    //вершины, которые ставить необхдимо из-за того, что на этом шаге у них заканчивается мю.
                    nessesary = findNessesary(l, i, A);

                    for (int j = 0; j < h[i]; j++) // не более, чем hi раз             каждый раз добавляем по одной вершине
                    {
                        //остальное как обычно в уровневом

                        //брать из S[0] уже нечего
                        if ((S0.Count == 0) || (j == 0))
                        {
                            if (k < S.Count) //вспомнить бы, зачем на самом деле тут k
                            {
                                //если еще остаслись вершины, которые можно было ставить на прошлом шаге, то ставим их
                                //иначе, т.е. если (S0.Count == 0), ищем новые
                                if (S0.Count == 0)
                                {
                                    S0 = AND(S[k], s[0]);
                                    k++;
                                }
                            }
                            else
                            {
                                break;
                            }
                        }
                        if ((S0.Count > 0) || (nessesary.Count > 0) || (fromPrevious.Count > 0))
                        {
                            int t;
                            if (nessesary.Count > 0)
                            {
                                t = findAny(nessesary);
                                if (index.Contains(nessesary[t])) //TODO find something better
                                {
                                    j--;
                                }
                                //добавляем вершину в упорядочение
                                else
                                {
                                    index.Add(nessesary[t]);
                                }
                                //удаляем вершину с списка вершин-кандидатов
                                nessesary.RemoveAt(t);
                            }
                            else
                            {
                                if (fromPrevious.Count > 0)
                                {
                                    t = findAny(fromPrevious);
                                    if (index.Contains(fromPrevious[t])) //TODO find something better
                                    {
                                        j--;
                                    }

                                    //добавляем вершину в упорядочение
                                    else
                                    {
                                        index.Add(fromPrevious[t]);
                                    }

                                    //удаляем вершину с списка вершин-кандидатов
                                    fromPrevious.RemoveAt(t);
                                }

                                else
                                {
                                    //было в не эвристическом
                                    //берем не рандомные, а те, которые стояли на прошлом шаге.
                                    //это не делает хуже, т.к. можно брать любые.
                                    t = findBestFitEasy(S0, Rez);

                                    //если попалась вершина, которая уже стоит на этом месте - берем следующую.
                                    //в такую ситуацию попадаем из-за того, что вершину с длительностью больше 1
                                    //по сути представляем просто как цепочку независимых вершин.
                                    if (index.Contains(S0[t])) //TODO find something better
                                    {
                                        j--;
                                    }

                                    //добавляем вершину в упорядочение
                                    else
                                    {
                                        index.Add(S0[t]);
                                    }

                                    //удаляем вершину с списка вершин-кандидатов
                                    S0.RemoveAt(t);
                                }
                            }
                        }
                    }
                }

                if (index.Count > 0)
                {
                    Rez.Add(DeepClone(index) as List <int>);
                    A = Remove(index);
                }
                if (A.Count > 1)
                {
                    Rez.Clear();
                }
            }
        }
Esempio n. 6
0
        override public void Build()
        {
            A = DeepClone(mainA) as List <List <int> >;
            Rez.Clear();
            List <int> index = new List <int>(); // номера вершин, которые мы занесли в упорядочение на это место hi
            List <int> S0    = new List <int>();

            for (int i = 0; i < h.Count; i++) //для всех hi
            {
                if (index.Count > 0)
                {
                    Rez.Add(DeepClone(index) as List <int>);
                }
                A = Remove(index);
                index.Clear();
                if (A.Count == 0)
                {
                    return;
                }
                S = FindS(A, 0);
                s = FindS(A, 1);
                int k = 0;
                for (int j = 0; j < h[i]; j++) // не более, чем hi раз             каждый раз добавляем по одной вершине
                {
                    //брать из S[0] уже нечего
                    if ((S0.Count == 0) || (j == 0))
                    {
                        if (k < S.Count) //длина искомого упорядочения не может быть больше числа вершин
                        {
                            //если еще остаслись вершины, которые можно было ставить на прошлом шаге, то ставим их
                            //иначе, т.е. если (S0.Count == 0), ищем новые
                            //   if (S0.Count == 0)
                            //   {
                            S0 = AND(S[k], s[0]);
                            k++;
                            //  }
                        }
                        else
                        {
                            break;
                        }
                    }
                    if (S0.Count > 0)
                    {
                        //берем не рандомные, а те, которые стояли на прошлом шаге.
                        //это не делает хуже, т.к. можно брать любые.
                        int t = findBestFitEasy(S0, Rez);

                        //если попалась вершина, которая уже стоит на этом месте - берем следующую.
                        //в такую ситуацию попадаем из-за того, что вершину с длительностью больше 1
                        //по сути представляем просто как цепочку независимых вершин.
                        if (index.Contains(S0[t])) //TODO find something better
                        {
                            j--;
                        }

                        //добавляем вершину в упорядочение
                        else
                        {
                            index.Add(S0[t]);
                        }

                        //удаляем вершину с списка вершин-кандидатов
                        S0.RemoveAt(t);
                    }
                }
            }
            if (index.Count > 0)
            {
                Rez.Add(DeepClone(index) as List <int>);
                A = Remove(index);
            }
            if (A.Count > 1)
            {
                Rez.Clear();
            }
        }