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)); }
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); }
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); }
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); }