示例#1
0
        public void oblicz(Matrix w, Matrix I, Examination examination, bool isFunkcjaAktywackiUnipolarna)
        {
            int n = w.ColumnCount;
            int iteratorSekwencji = 0;
            int ineratorStep      = 1;

            var tempExaminationStep = new ExaminationStep();

            tempExaminationStep.PotencjalWejsciowy = examination.BadanyPunkt;

            do
            {
                tempExaminationStep.Numer = ineratorStep;
                ineratorStep++;

                tempExaminationStep.ObliczonyPotencjalWejsciowy = Matrix.Add(Matrix.Multiply(tempExaminationStep.PotencjalWejsciowy, w), I);

                double[] tempPotencjalWyjsciowy = new double[n];
                for (int i = 0; i < n; i++)
                {
                    if (i != sekwencja[iteratorSekwencji])
                    {
                        tempPotencjalWyjsciowy[i] = tempExaminationStep.PotencjalWejsciowy.GetElement(0, i);
                    }
                    else
                    {
                        if (isFunkcjaAktywackiUnipolarna)
                        {
                            tempPotencjalWyjsciowy[i] = Program.FunkcjaAktywacjiPolarna(tempExaminationStep.ObliczonyPotencjalWejsciowy.GetElement(0, i));
                        }
                        else
                        {
                            tempPotencjalWyjsciowy[i] = Program.FunkcjaAktywacjiBiPolarna(tempExaminationStep.ObliczonyPotencjalWejsciowy.GetElement(0, i));
                        }
                    }
                }

                //Twirzenie V(t)
                var tempPoteWyjMatrix = new Matrix(tempPotencjalWyjsciowy);

                tempExaminationStep.PotencjalWyjsciowy = tempPoteWyjMatrix;
                tempExaminationStep.Energia            = Program.EnergiaAsync(w, tempExaminationStep);
                examination.ListaKrorkow.Add(tempExaminationStep);

                iteratorSekwencji++;
                if (iteratorSekwencji == n)
                {
                    iteratorSekwencji = 0;
                }
                //Console.WriteLine(iteratorSekwencji+":\t"+tempExaminationStep.PotencjalWyjsciowy.ToString());

                tempExaminationStep = new ExaminationStep();
                //ustawianie V(t) do koljenego kroku jako V(t-1)
                tempExaminationStep.PotencjalWejsciowy = tempPoteWyjMatrix;
            } while (!checkExaminationAsync(n, examination));
        }
示例#2
0
        public static double EnergiaAsync(Matrix w, ExaminationStep e)
        {
            double suma = 0;
            int    n    = w.RowCount;

            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    suma += w.GetElement(i, j) * e.PotencjalWejsciowy.GetElement(0, i) * e.PotencjalWyjsciowy.GetElement(0, j);
                }
            }


            suma *= -0.5;

            return(suma);
        }
示例#3
0
        public static double EnergiaSync(Matrix w, Matrix I, ExaminationStep x)
        {
            double suma = 0;
            int    n    = w.RowCount;


            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    suma += w.GetElement(i, j) * x.PotencjalWyjsciowy.GetElement(0, i) * x.PotencjalWejsciowy.GetElement(0, j);
                }
            }
            suma *= -1;

            for (int i = 0; i < n; i++)
            {
                suma += I.GetElement(0, i) * (x.PotencjalWyjsciowy.GetElement(0, i) + x.PotencjalWejsciowy.GetElement(0, i));
            }

            return(suma);
        }
示例#4
0
        public static Network SynchHopfield(Matrix macierzWag, Matrix macierzI, ActivationFunction activationFunction)
        {
            var network = new Network(GenerujTablicePotencjalowWejsciowych(macierzWag.ColumnCount, activationFunction));

            for (int i = 0; i < network.BadanePunkty.Count; i++)
            {
                bool isExamining = true;
                var  noweBadanie = network.BadanePunkty[i];

                while (isExamining)
                {
                    var nowyKrok = new ExaminationStep();
                    nowyKrok.Numer = noweBadanie.ListaKrorkow.Count + 1;

                    // Ustawienie potencjału wejściowego
                    if (noweBadanie.ListaKrorkow.Count > 0)
                    {
                        nowyKrok.PotencjalWejsciowy = noweBadanie.ListaKrorkow[noweBadanie.ListaKrorkow.Count - 1].PotencjalWyjsciowy;
                    }
                    else
                    {
                        nowyKrok.PotencjalWejsciowy = network.BadanePunkty[i].BadanyPunkt;
                    }

                    // Sprawdzanie czy wpadliśmy w cykl
                    if (noweBadanie.ListaKrorkow.Any(x => x.PotencjalWejsciowy.AreMatrixesEquals(nowyKrok.PotencjalWejsciowy)))
                    {
                        isExamining = false;
                        continue;
                    }

                    // Obliczenie potencjału wejściowego dla funkcji aktywacji
                    nowyKrok.ObliczonyPotencjalWejsciowy = Matrix.Add(Matrix.Multiply(nowyKrok.PotencjalWejsciowy, macierzWag), macierzI);
                    //nowyKrok.ObliczonyPotencjalWejsciowy = Matrix.Add(Matrix.Multiply(macierzWag, nowyKrok.PotencjalWejsciowy), macierzI);

                    // Obliczenie potencjału wyjściowego
                    List <double> wyjsciowy = new List <double>();
                    foreach (var item in nowyKrok.ObliczonyPotencjalWejsciowy.ToArray())
                    {
                        wyjsciowy.Add(activationFunction == ActivationFunction.Unipolar ? FunkcjaAktywacjiPolarna(item) : FunkcjaAktywacjiBiPolarna(item));
                    }
                    nowyKrok.PotencjalWyjsciowy = new Matrix(wyjsciowy.ToArray());

                    // Obliczenie energii
                    nowyKrok.Energia = EnergiaSync(macierzWag, macierzI, nowyKrok);

                    // Sprawdzanie warunków stopu badania
                    var punktDoKtoregoZbiega = network
                                               .BadanePunkty
                                               .FirstOrDefault(x =>
                                                               x.BadanyPunkt.AreMatrixesEquals(nowyKrok.PotencjalWyjsciowy) &&
                                                               !noweBadanie.BadanyPunkt.AreMatrixesEquals(x.BadanyPunkt));

                    if (nowyKrok.PotencjalWejsciowy.AreMatrixesEquals(nowyKrok.PotencjalWyjsciowy))
                    { // Punkt stały
                        isExamining = false;

                        if (noweBadanie.ListaKrorkow.Count == 0)
                        {
                            noweBadanie.CzyPunktStaly = true;
                        }
                    }
                    else if (noweBadanie.ListaKrorkow.Count > 0 &&
                             nowyKrok.PotencjalWejsciowy == nowyKrok.PotencjalWyjsciowy &&
                             nowyKrok.Energia == noweBadanie.ListaKrorkow[noweBadanie.ListaKrorkow.Count - 1].Energia &&
                             macierzWag.IsSymetric())
                    {
                        noweBadanie.CzyPunktStaly = false;
                        isExamining = false;
                        //Console.WriteLine("Wyprodukowana przez sieć wartość energii jest równa w dwóch kolejnych krokach jej działania (warunek ten należy sprawdzać przy założeniu, że macierz wag jest symetryczna!).");
                    }
                    else if (punktDoKtoregoZbiega != null)
                    {// Ustawienie punktu do którego zbiega (Sprawdzanie cykli i ustawianie wniosków odbywa się po wszystkich obliczeniach wszystkich badań)
                        noweBadanie.CzyPunktStaly        = false;
                        noweBadanie.PunktDoKtoregoZbiega = punktDoKtoregoZbiega;
                    }
                    noweBadanie.ListaKrorkow.Add(nowyKrok);
                }

                network.BadanePunkty[i] = noweBadanie;
            }

            UstawWyniki(network);
            return(network);
        }