Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace HopfieldaSiec_Nazwisko_Imie
- {
- static public class HopfieldaSiecAlgorytm
- {
- static public int n = 0;
- static public List<List<int>> bazaObarzow = new List<List<int>>();
- static public List<List<decimal>> wagi = new List<List<decimal>>();
- //! dla ulatwienia zapisanie macierzy w jednej lini
- //! true -> 1, false -> -1
- static public List<int> zamienMacierzNaLiniowa(bool[,] obraz)
- {
- List<int> obrazLiniowy = new List<int>();
- for (int i = 0; i < Formatka.poleSzerokosc; i++)
- {
- for (int j = 0; j < Formatka.poleWysokosc; j++)
- {
- obrazLiniowy.Add(obraz[j, i] ? 1 : -1);
- }
- }
- return obrazLiniowy;
- }
- //! inicjuj tablicę wag (0) - do wywolania w Formatka()
- static public void inicjuj(int szerokosc, int wysokosc)
- {
- n = szerokosc * wysokosc;
- for (int i = 0; i < n; i++)
- {
- List<decimal> wierszWLiscieWag = new List<decimal>();
- for (int j = 0; j < n; j++)
- {
- wierszWLiscieWag.Add(0);
- }
- wagi.Add(wierszWLiscieWag);
- }
- }
- //! dodanie obrazu do bazy z parametru
- static public void dodajObrazDoBazy(bool[,] obraz)
- {
- List<int> obrazDoDodania = zamienMacierzNaLiniowa(obraz);
- bazaObarzow.Add(obrazDoDodania);
- }
- //! nauczenie się jednego obrazu
- //! obraz nie jest brany z bazy tylko z parametru
- static public void nauczObraz(bool[,] obraz)
- {
- List<int> obrazDoNauczenia = zamienMacierzNaLiniowa(obraz);
- for (int i = 0; i < n; i++)
- {
- for (int j = 0; j < n; j++)
- {
- if (i == j)
- {
- continue;
- }
- decimal iloczyn = obrazDoNauczenia[i] * obrazDoNauczenia[j];
- decimal waga = iloczyn / (Formatka.poleSzerokosc * Formatka.poleWysokosc);
- wagi[i][j] += waga;
- }
- }
- }
- //! nauczenie sie wszystkich obrazow z bazy
- //! metoda dodatkowa - alternatywny sposób
- static public void nauczObrazy()
- {
- for (int i = 0; i < n; i++)
- {
- for (int j = 0; j < n; j++)
- {
- if (i == j)
- {
- continue;
- }
- decimal suma = 0;
- for (int indexObrazu = 0; indexObrazu < bazaObarzow.Count; indexObrazu++)
- {
- suma += bazaObarzow[indexObrazu][i] * bazaObarzow[indexObrazu][j];
- }
- decimal waga = suma / (Formatka.poleSzerokosc * Formatka.poleWysokosc);
- wagi[i][j] = waga;
- }
- }
- }
- //! rozpoznaj obraz z parametru
- static public bool rozpoznajObraz(ref bool[,] obraz)
- {
- List<int> obrazDoRozpoznania = zamienMacierzNaLiniowa(obraz);
- for (int i = 0; i < n; i++)
- {
- decimal suma = 0;
- for (int j = 0; j < n; j++)
- {
- if (j == i)
- {
- continue;
- }
- decimal waga = wagi[i][j];
- decimal wyjscie = obrazDoRozpoznania[j];
- suma += waga * wyjscie;
- }
- if (suma >= 0)
- {
- obrazDoRozpoznania[i] = 1;
- }
- else
- {
- obrazDoRozpoznania[i] = -1;
- }
- }
- bool zmiana = false;
- int k = 0;
- for (int i = 0; i < Formatka.poleSzerokosc; i++)
- {
- for (int j = 0; j < Formatka.poleWysokosc; j++)
- {
- if (obrazDoRozpoznania[k] == 1 && !obraz[j, i])
- {
- obraz[j, i] = true;
- zmiana = true;
- }
- else if (obrazDoRozpoznania[k] == -1 && obraz[j, i])
- {
- obraz[j, i] = false;
- zmiana = true;
- }
- k++;
- }
- }
- return zmiana;
- }
- }
- }
Add Comment
Please, Sign In to add comment