Adik28

Sieć Hopfielda / A

Jan 22nd, 2018
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.80 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace HopfieldaSiec_Nazwisko_Imie
  8. {
  9.     static public class HopfieldaSiecAlgorytm
  10.     {
  11.         static public int n = 0;
  12.         static public List<List<int>> bazaObarzow = new List<List<int>>();
  13.         static public List<List<decimal>> wagi = new List<List<decimal>>();
  14.  
  15.         //! dla ulatwienia zapisanie macierzy w jednej lini
  16.         //! true -> 1, false -> -1
  17.         static public List<int> zamienMacierzNaLiniowa(bool[,] obraz)
  18.         {
  19.             List<int> obrazLiniowy = new List<int>();
  20.             for (int i = 0; i < Formatka.poleSzerokosc; i++)
  21.             {
  22.                 for (int j = 0; j < Formatka.poleWysokosc; j++)
  23.                 {
  24.                     obrazLiniowy.Add(obraz[j, i] ? 1 : -1);
  25.                 }
  26.             }
  27.             return obrazLiniowy;
  28.         }
  29.  
  30.         //! inicjuj tablicę wag (0) - do wywolania w Formatka()
  31.         static public void inicjuj(int szerokosc, int wysokosc)
  32.         {
  33.             n = szerokosc * wysokosc;
  34.             for (int i = 0; i < n; i++)
  35.             {
  36.                 List<decimal> wierszWLiscieWag = new List<decimal>();
  37.                 for (int j = 0; j < n; j++)
  38.                 {
  39.                     wierszWLiscieWag.Add(0);
  40.                 }
  41.                 wagi.Add(wierszWLiscieWag);
  42.             }
  43.         }
  44.  
  45.         //! dodanie obrazu do bazy z parametru
  46.         static public void dodajObrazDoBazy(bool[,] obraz)
  47.         {
  48.             List<int> obrazDoDodania = zamienMacierzNaLiniowa(obraz);
  49.             bazaObarzow.Add(obrazDoDodania);
  50.         }
  51.  
  52.         //! nauczenie się jednego obrazu
  53.         //! obraz nie jest brany z bazy tylko z parametru
  54.         static public void nauczObraz(bool[,] obraz)
  55.         {
  56.             List<int> obrazDoNauczenia = zamienMacierzNaLiniowa(obraz);
  57.  
  58.             for (int i = 0; i < n; i++)
  59.             {
  60.                 for (int j = 0; j < n; j++)
  61.                 {
  62.                     if (i == j)
  63.                     {
  64.                         continue;
  65.                     }
  66.  
  67.                     decimal iloczyn = obrazDoNauczenia[i] * obrazDoNauczenia[j];
  68.                     decimal waga = iloczyn / (Formatka.poleSzerokosc * Formatka.poleWysokosc);
  69.                     wagi[i][j] += waga;
  70.                 }
  71.             }
  72.         }
  73.  
  74.         //! nauczenie sie wszystkich obrazow z bazy
  75.         //! metoda dodatkowa - alternatywny sposób
  76.         static public void nauczObrazy()
  77.         {
  78.             for (int i = 0; i < n; i++)
  79.             {
  80.                 for (int j = 0; j < n; j++)
  81.                 {
  82.                     if (i == j)
  83.                     {
  84.                         continue;
  85.                     }
  86.  
  87.                     decimal suma = 0;
  88.                     for (int indexObrazu = 0; indexObrazu < bazaObarzow.Count; indexObrazu++)
  89.                     {
  90.                         suma += bazaObarzow[indexObrazu][i] * bazaObarzow[indexObrazu][j];
  91.                     }
  92.  
  93.                     decimal waga = suma / (Formatka.poleSzerokosc * Formatka.poleWysokosc);
  94.                     wagi[i][j] = waga;
  95.                 }
  96.             }
  97.         }
  98.  
  99.         //! rozpoznaj obraz z parametru
  100.         static public bool rozpoznajObraz(ref bool[,] obraz)
  101.         {
  102.             List<int> obrazDoRozpoznania = zamienMacierzNaLiniowa(obraz);
  103.  
  104.             for (int i = 0; i < n; i++)
  105.             {
  106.                 decimal suma = 0;
  107.                 for (int j = 0; j < n; j++)
  108.                 {
  109.                     if (j == i)
  110.                     {
  111.                         continue;
  112.                     }
  113.  
  114.                     decimal waga = wagi[i][j];
  115.                     decimal wyjscie = obrazDoRozpoznania[j];
  116.                     suma += waga * wyjscie;
  117.                 }
  118.                 if (suma >= 0)
  119.                 {
  120.                     obrazDoRozpoznania[i] = 1;
  121.                 }
  122.                 else
  123.                 {
  124.                     obrazDoRozpoznania[i] = -1;
  125.                 }
  126.             }
  127.  
  128.             bool zmiana = false;
  129.             int k = 0;
  130.             for (int i = 0; i < Formatka.poleSzerokosc; i++)
  131.             {
  132.                 for (int j = 0; j < Formatka.poleWysokosc; j++)
  133.                 {
  134.                     if (obrazDoRozpoznania[k] == 1 && !obraz[j, i])
  135.                     {
  136.                         obraz[j, i] = true;
  137.                         zmiana = true;
  138.                     }
  139.                     else if (obrazDoRozpoznania[k] == -1 && obraz[j, i])
  140.                     {
  141.                         obraz[j, i] = false;
  142.                         zmiana = true;
  143.                     }
  144.                     k++;
  145.                 }
  146.             }
  147.  
  148.             return zmiana;
  149.         }
  150.  
  151.     }
  152. }
Add Comment
Please, Sign In to add comment