Advertisement
Guest User

Program.cs

a guest
Jan 26th, 2020
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 10.51 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. using Encog.Matrix;
  7. using System;
  8.  
  9. namespace HopfieldProject
  10. {
  11.     public class Program
  12.     {
  13.         private const double maxIloscKrokow = 8;
  14.         private static bool result = false;
  15.         private static int krok = 0;
  16.         private static double v0Input;
  17.         private static double v1Input;
  18.         private static double v2Input;
  19.         private static Matrix W = new Matrix(new double[3, 3]
  20.         {
  21.             { 0.0, -1.0, -3.0 },
  22.             { -1.0, 0.0, 2.0 },
  23.             { -3.0, 2.0, 0.0 }
  24.         });
  25.  
  26.         private static void Main(string[] args)
  27.         {
  28.             Console.WriteLine("..::Symulacja działania sieci Hopfielda:..");
  29.             Console.WriteLine("Autorzy: Miłosz Kulesza, Marcin Drozd, Michał Fabrowski\n");
  30.             Console.WriteLine("Wprowadź wektor do zbadania.\nPodaj V[0]:");
  31.             v0Input = Convert.ToDouble(Console.ReadLine());
  32.             Console.WriteLine("Wprowadź wektor do zbadania.\nPodaj V[1]:");
  33.             v1Input = Convert.ToDouble(Console.ReadLine());
  34.             Console.WriteLine("Wprowadź wektor do zbadania.\nPodaj V[2]:");
  35.             v2Input = Convert.ToDouble(Console.ReadLine());
  36.             Console.WriteLine("Podaj tryb działania sieci (1 - synchroniczny, 2 - asynchroniczny):");
  37.             int tryb = Convert.ToInt32(Console.ReadLine());
  38.  
  39.  
  40.             Console.WriteLine("\nDane wejściowe:");
  41.             Console.WriteLine("W = [");
  42.             for (int i = 0; i < 3; i++)
  43.             {
  44.                 for (int j = 0; j < 3; j++)
  45.                 {
  46.                     Console.Write($"\t{W[i, j]} ");
  47.                 }
  48.                 if (i == 2)
  49.                     Console.WriteLine("\n]");
  50.                 Console.WriteLine();
  51.             }
  52.  
  53.  
  54.  
  55.             Console.WriteLine();
  56.             if (tryb == 1)
  57.             {
  58.                 LiczSynchronicznie();
  59.             }
  60.             else if (tryb == 2)
  61.             {
  62.                 LiczAsynchronicznie();
  63.             }
  64.  
  65.             Console.WriteLine("Naciśnij dowolny klawisz aby kontynuować...");
  66.             Console.ReadKey();
  67.         }
  68.  
  69.         private static void LiczSynchronicznie()
  70.         {
  71.             Matrix VWejsciowe = new Matrix(new double[1, 3] { { v0Input, v1Input, v2Input } });
  72.             Matrix VWyjsciowe = new Matrix(new double[3, 1] { { 0 }, { 0 }, { 0 } });
  73.             Matrix VDoOscylacji = new Matrix(new double[3, 1] { { VWejsciowe[0, 0] }, { VWejsciowe[0, 1] }, { VWejsciowe[0, 2] } });
  74.             Console.Write($"V({krok})= [ ");
  75.             for (int i = 0; i < 3; i++)
  76.             {
  77.                 Console.Write($"{VWejsciowe[0, i]} ");
  78.             }
  79.             Console.WriteLine("]");
  80.             do
  81.             {
  82.                 if (krok == 0)
  83.                     VWejsciowe = MatrixMath.Transpose(VWejsciowe);
  84.                 Matrix U = MatrixMath.Multiply(W, VWejsciowe);
  85.                 Console.WriteLine("Potencjał wejściowy:");
  86.                 Console.WriteLine($"U({krok}) = [");
  87.                 for (int i = 0; i < 3; i++)
  88.                 {
  89.                     Console.WriteLine($"\t{U[i, 0]}");
  90.                 }
  91.                 Console.WriteLine("]");
  92.                 if (U[0, 0] <= 0)
  93.                     VWyjsciowe[0, 0] = -1;
  94.                 else
  95.                     VWyjsciowe[0, 0] = 1;
  96.                 if (U[1, 0] <= 0)
  97.                     VWyjsciowe[1, 0] = -1;
  98.                 else
  99.                     VWyjsciowe[1, 0] = 1;
  100.                 if (U[2, 0] <= 0)
  101.                     VWyjsciowe[2, 0] = -1;
  102.                 else
  103.                     VWyjsciowe[2, 0] = 1;
  104.                 krok++;
  105.                 Console.WriteLine("Potencjał wyjściowy:");
  106.                 Console.WriteLine($"V({krok}) = [");
  107.                 for (int i = 0; i < 3; i++)
  108.                 {
  109.                     Console.WriteLine($"\t{VWyjsciowe[i, 0]}");
  110.                 }
  111.                 Console.WriteLine($"]");
  112.                 double energia = 0;
  113.                 for (int i = 0; i < 3; i++)
  114.                 {
  115.                     for (int j = 0; j < 3; j++)
  116.                     {
  117.                         energia += W[i, j] * VWyjsciowe[i, 0] * VWejsciowe[j, 0];
  118.                     }
  119.                 }
  120.                 energia *= -1;
  121.                 Console.WriteLine($"E({krok}) = {energia}\n");
  122.                 if (VWejsciowe.Equals(VWyjsciowe))
  123.                 {
  124.                     if (krok == 1)
  125.                         Console.WriteLine($"Sieć ustabilizowała się w kroku {krok}.\nPodany punkt V(0)=[ {v0Input}, {v1Input}, {v2Input} ] jest punktem stałym.");
  126.                     else
  127.                         Console.WriteLine($"Sieć ustabilizowała się w kroku {krok}.\nPunkt V({krok}) jest punktem stałym.\nPodany punkt V(0)=[ {v0Input}, {v1Input}, {v2Input} ] jest zbieżny do punktu stałego V({krok})=[ {VWyjsciowe[0, 0]}, {VWyjsciowe[1, 0]}, {VWyjsciowe[2, 0]} ].");
  128.                     result = true;
  129.                 }
  130.                 if (VDoOscylacji.Equals(VWyjsciowe) && !result)
  131.                 {
  132.                     Console.WriteLine($"Oscylacja między dwoma punktami V({krok - 1})=[ {VDoOscylacji[0, 0]}, {VDoOscylacji[1, 0]}, {VDoOscylacji[2, 0]} ] i V({krok})=[ {VWejsciowe[0, 0]}, {VWejsciowe[1, 0]}, {VWejsciowe[2, 0]} ].\nOscylacja wykryta w kroku {krok}");
  133.                     if (krok > 2)
  134.                         Console.WriteLine($"Podany punkt V(0)=[ {v0Input}, {v1Input}, {v2Input} ] wpada w oscylację.");
  135.                     result = true;
  136.                 }
  137.                 if (krok == maxIloscKrokow)
  138.                 {
  139.                     Console.WriteLine("Osiągnięto maksymalną dopuszczalną liczbę kroków. Sieć nie ustabilizowała się.");
  140.                     result = true;
  141.                 }
  142.                 if (!result)
  143.                 {
  144.                     VDoOscylacji[0, 0] = VWejsciowe[0, 0];
  145.                     VDoOscylacji[1, 0] = VWejsciowe[1, 0];
  146.                     VDoOscylacji[2, 0] = VWejsciowe[2, 0];
  147.                     VWejsciowe[0, 0] = VWyjsciowe[0, 0];
  148.                     VWejsciowe[1, 0] = VWyjsciowe[1, 0];
  149.                     VWejsciowe[2, 0] = VWyjsciowe[2, 0];
  150.                 }
  151.             } while (!result);
  152.         }
  153.  
  154.         private static void LiczAsynchronicznie()
  155.         {
  156.             int n = 1; // ktory neuron
  157.             int count = 0;
  158.             Matrix VWejsciowe = new Matrix(new double[1, 3] { { v0Input, v1Input, v2Input } });
  159.             Matrix VWyjsciowe = new Matrix(new double[3, 1] { { 0 }, { 0 }, { 0 } });
  160.  
  161.             Console.Write($"V({krok})= [ ");
  162.             for (int i = 0; i < 3; i++)
  163.             {
  164.                 Console.Write($"{VWejsciowe[0, i]} ");
  165.             }
  166.             Console.WriteLine("]");
  167.  
  168.             do
  169.             {
  170.                 if (krok == 0)
  171.                     VWejsciowe = MatrixMath.Transpose(VWejsciowe);
  172.                 Matrix U = MatrixMath.Multiply(W, VWejsciowe);
  173.                 Console.WriteLine("Potencjał wejściowy:");
  174.                 Console.WriteLine($"U({krok}) = [");
  175.                 for (int i = 0; i < 3; i++)
  176.                 {                    
  177.                     if(i == n-1)
  178.                         Console.WriteLine($"\t{U[i, 0]}");
  179.                     else
  180.                         Console.WriteLine("\tNW");
  181.                 }
  182.                 Console.WriteLine("]");
  183.                 if (n == 1)
  184.                 {
  185.                     if (U[0, 0] <= 0)
  186.                         VWyjsciowe[0, 0] = -1;
  187.                     else
  188.                         VWyjsciowe[0, 0] = 1;
  189.                     VWyjsciowe[1, 0] = VWejsciowe[1, 0];
  190.                     VWyjsciowe[2, 0] = VWejsciowe[2, 0];
  191.                 }
  192.                 else if (n == 2)
  193.                 {
  194.                     VWyjsciowe[0, 0] = VWejsciowe[0, 0];
  195.                     if (U[1, 0] <= 0)
  196.                         VWyjsciowe[1, 0] = -1;
  197.                     else
  198.                         VWyjsciowe[1, 0] = 1;
  199.                     VWyjsciowe[2, 0] = VWejsciowe[2, 0];
  200.                 }
  201.                 else
  202.                 {
  203.                     VWyjsciowe[0, 0] = VWejsciowe[0, 0];
  204.                     VWyjsciowe[1, 0] = VWejsciowe[1, 0];
  205.                     if (U[2, 0] <= 0)
  206.                         VWyjsciowe[2, 0] = -1;
  207.                     else
  208.                         VWyjsciowe[2, 0] = 1;
  209.                 }
  210.  
  211.                 krok++;
  212.  
  213.                 Console.WriteLine("Potencjał wyjściowy:");
  214.                 Console.WriteLine($"V({krok}) = [");
  215.                 for (int i = 0; i < 3; i++)
  216.                 {
  217.                     Console.WriteLine($"\t{VWyjsciowe[i, 0]}");
  218.                 }
  219.                 Console.WriteLine($"]");
  220.  
  221.                 double energia = 0;
  222.  
  223.                 for (int i = 0; i < 3; i++)
  224.                 {
  225.                     for (int j = 0; j < 3; j++)
  226.                     {
  227.                         energia += W[i, j] * VWyjsciowe[i, 0] * VWyjsciowe[j, 0];
  228.                     }
  229.                 }
  230.                 energia *= (-0.5);
  231.  
  232.                 Console.WriteLine($"E({krok}) = {energia}\n");
  233.  
  234.                
  235.  
  236.                 if (krok >= 3)
  237.                 {
  238.                     if (VWejsciowe.Equals(VWyjsciowe))
  239.                     {
  240.                         count++;                            
  241.                     }
  242.                     else
  243.                     {
  244.                         count = 0;
  245.                     }
  246.  
  247.                     if(count >= 3)
  248.                     {
  249.                         Console.WriteLine($"Sieć ustabilizowała się w kroku {krok}.\nPunkt V({krok}) jest punktem stałym.\nPodany punkt V(0)=[ {v0Input}, {v1Input}, {v2Input} ] jest zbieżny do punktu stałego V({krok})=[ {VWyjsciowe[0, 0]}, {VWyjsciowe[1, 0]}, {VWyjsciowe[2, 0]} ].");
  250.                         result = true;
  251.                     }
  252.  
  253.                     if (krok == maxIloscKrokow)
  254.                     {
  255.                         Console.WriteLine("Osiągnięto maksymalną dopuszczalną liczbę kroków. Sieć nie ustabilizowała się.");
  256.                         result = true;
  257.                     }
  258.                 }
  259.                     VWejsciowe[0, 0] = VWyjsciowe[0, 0];
  260.                     VWejsciowe[1, 0] = VWyjsciowe[1, 0];
  261.                     VWejsciowe[2, 0] = VWyjsciowe[2, 0];
  262.                
  263.                 if (n < 3)
  264.                     n++;
  265.                 else
  266.                     n = 1;
  267.  
  268.             } while (!result);
  269.  
  270.         }
  271.     }
  272. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement