Advertisement
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;
- using Encog.Matrix;
- using System;
- namespace HopfieldProject
- {
- public class Program
- {
- private const double maxIloscKrokow = 8;
- private static bool result = false;
- private static int krok = 0;
- private static double v0Input;
- private static double v1Input;
- private static double v2Input;
- private static Matrix W = new Matrix(new double[3, 3]
- {
- { 0.0, -1.0, -3.0 },
- { -1.0, 0.0, 2.0 },
- { -3.0, 2.0, 0.0 }
- });
- private static void Main(string[] args)
- {
- Console.WriteLine("..::Symulacja działania sieci Hopfielda:..");
- Console.WriteLine("Autorzy: Miłosz Kulesza, Marcin Drozd, Michał Fabrowski\n");
- Console.WriteLine("Wprowadź wektor do zbadania.\nPodaj V[0]:");
- v0Input = Convert.ToDouble(Console.ReadLine());
- Console.WriteLine("Wprowadź wektor do zbadania.\nPodaj V[1]:");
- v1Input = Convert.ToDouble(Console.ReadLine());
- Console.WriteLine("Wprowadź wektor do zbadania.\nPodaj V[2]:");
- v2Input = Convert.ToDouble(Console.ReadLine());
- Console.WriteLine("Podaj tryb działania sieci (1 - synchroniczny, 2 - asynchroniczny):");
- int tryb = Convert.ToInt32(Console.ReadLine());
- Console.WriteLine("\nDane wejściowe:");
- Console.WriteLine("W = [");
- for (int i = 0; i < 3; i++)
- {
- for (int j = 0; j < 3; j++)
- {
- Console.Write($"\t{W[i, j]} ");
- }
- if (i == 2)
- Console.WriteLine("\n]");
- Console.WriteLine();
- }
- Console.WriteLine();
- if (tryb == 1)
- {
- LiczSynchronicznie();
- }
- else if (tryb == 2)
- {
- LiczAsynchronicznie();
- }
- Console.WriteLine("Naciśnij dowolny klawisz aby kontynuować...");
- Console.ReadKey();
- }
- private static void LiczSynchronicznie()
- {
- Matrix VWejsciowe = new Matrix(new double[1, 3] { { v0Input, v1Input, v2Input } });
- Matrix VWyjsciowe = new Matrix(new double[3, 1] { { 0 }, { 0 }, { 0 } });
- Matrix VDoOscylacji = new Matrix(new double[3, 1] { { VWejsciowe[0, 0] }, { VWejsciowe[0, 1] }, { VWejsciowe[0, 2] } });
- Console.Write($"V({krok})= [ ");
- for (int i = 0; i < 3; i++)
- {
- Console.Write($"{VWejsciowe[0, i]} ");
- }
- Console.WriteLine("]");
- do
- {
- if (krok == 0)
- VWejsciowe = MatrixMath.Transpose(VWejsciowe);
- Matrix U = MatrixMath.Multiply(W, VWejsciowe);
- Console.WriteLine("Potencjał wejściowy:");
- Console.WriteLine($"U({krok}) = [");
- for (int i = 0; i < 3; i++)
- {
- Console.WriteLine($"\t{U[i, 0]}");
- }
- Console.WriteLine("]");
- if (U[0, 0] <= 0)
- VWyjsciowe[0, 0] = -1;
- else
- VWyjsciowe[0, 0] = 1;
- if (U[1, 0] <= 0)
- VWyjsciowe[1, 0] = -1;
- else
- VWyjsciowe[1, 0] = 1;
- if (U[2, 0] <= 0)
- VWyjsciowe[2, 0] = -1;
- else
- VWyjsciowe[2, 0] = 1;
- krok++;
- Console.WriteLine("Potencjał wyjściowy:");
- Console.WriteLine($"V({krok}) = [");
- for (int i = 0; i < 3; i++)
- {
- Console.WriteLine($"\t{VWyjsciowe[i, 0]}");
- }
- Console.WriteLine($"]");
- double energia = 0;
- for (int i = 0; i < 3; i++)
- {
- for (int j = 0; j < 3; j++)
- {
- energia += W[i, j] * VWyjsciowe[i, 0] * VWejsciowe[j, 0];
- }
- }
- energia *= -1;
- Console.WriteLine($"E({krok}) = {energia}\n");
- if (VWejsciowe.Equals(VWyjsciowe))
- {
- if (krok == 1)
- Console.WriteLine($"Sieć ustabilizowała się w kroku {krok}.\nPodany punkt V(0)=[ {v0Input}, {v1Input}, {v2Input} ] jest punktem stałym.");
- else
- 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]} ].");
- result = true;
- }
- if (VDoOscylacji.Equals(VWyjsciowe) && !result)
- {
- 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}");
- if (krok > 2)
- Console.WriteLine($"Podany punkt V(0)=[ {v0Input}, {v1Input}, {v2Input} ] wpada w oscylację.");
- result = true;
- }
- if (krok == maxIloscKrokow)
- {
- Console.WriteLine("Osiągnięto maksymalną dopuszczalną liczbę kroków. Sieć nie ustabilizowała się.");
- result = true;
- }
- if (!result)
- {
- VDoOscylacji[0, 0] = VWejsciowe[0, 0];
- VDoOscylacji[1, 0] = VWejsciowe[1, 0];
- VDoOscylacji[2, 0] = VWejsciowe[2, 0];
- VWejsciowe[0, 0] = VWyjsciowe[0, 0];
- VWejsciowe[1, 0] = VWyjsciowe[1, 0];
- VWejsciowe[2, 0] = VWyjsciowe[2, 0];
- }
- } while (!result);
- }
- private static void LiczAsynchronicznie()
- {
- int n = 1; // ktory neuron
- int count = 0;
- Matrix VWejsciowe = new Matrix(new double[1, 3] { { v0Input, v1Input, v2Input } });
- Matrix VWyjsciowe = new Matrix(new double[3, 1] { { 0 }, { 0 }, { 0 } });
- Console.Write($"V({krok})= [ ");
- for (int i = 0; i < 3; i++)
- {
- Console.Write($"{VWejsciowe[0, i]} ");
- }
- Console.WriteLine("]");
- do
- {
- if (krok == 0)
- VWejsciowe = MatrixMath.Transpose(VWejsciowe);
- Matrix U = MatrixMath.Multiply(W, VWejsciowe);
- Console.WriteLine("Potencjał wejściowy:");
- Console.WriteLine($"U({krok}) = [");
- for (int i = 0; i < 3; i++)
- {
- if(i == n-1)
- Console.WriteLine($"\t{U[i, 0]}");
- else
- Console.WriteLine("\tNW");
- }
- Console.WriteLine("]");
- if (n == 1)
- {
- if (U[0, 0] <= 0)
- VWyjsciowe[0, 0] = -1;
- else
- VWyjsciowe[0, 0] = 1;
- VWyjsciowe[1, 0] = VWejsciowe[1, 0];
- VWyjsciowe[2, 0] = VWejsciowe[2, 0];
- }
- else if (n == 2)
- {
- VWyjsciowe[0, 0] = VWejsciowe[0, 0];
- if (U[1, 0] <= 0)
- VWyjsciowe[1, 0] = -1;
- else
- VWyjsciowe[1, 0] = 1;
- VWyjsciowe[2, 0] = VWejsciowe[2, 0];
- }
- else
- {
- VWyjsciowe[0, 0] = VWejsciowe[0, 0];
- VWyjsciowe[1, 0] = VWejsciowe[1, 0];
- if (U[2, 0] <= 0)
- VWyjsciowe[2, 0] = -1;
- else
- VWyjsciowe[2, 0] = 1;
- }
- krok++;
- Console.WriteLine("Potencjał wyjściowy:");
- Console.WriteLine($"V({krok}) = [");
- for (int i = 0; i < 3; i++)
- {
- Console.WriteLine($"\t{VWyjsciowe[i, 0]}");
- }
- Console.WriteLine($"]");
- double energia = 0;
- for (int i = 0; i < 3; i++)
- {
- for (int j = 0; j < 3; j++)
- {
- energia += W[i, j] * VWyjsciowe[i, 0] * VWyjsciowe[j, 0];
- }
- }
- energia *= (-0.5);
- Console.WriteLine($"E({krok}) = {energia}\n");
- if (krok >= 3)
- {
- if (VWejsciowe.Equals(VWyjsciowe))
- {
- count++;
- }
- else
- {
- count = 0;
- }
- if(count >= 3)
- {
- 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]} ].");
- result = true;
- }
- if (krok == maxIloscKrokow)
- {
- Console.WriteLine("Osiągnięto maksymalną dopuszczalną liczbę kroków. Sieć nie ustabilizowała się.");
- result = true;
- }
- }
- VWejsciowe[0, 0] = VWyjsciowe[0, 0];
- VWejsciowe[1, 0] = VWyjsciowe[1, 0];
- VWejsciowe[2, 0] = VWyjsciowe[2, 0];
- if (n < 3)
- n++;
- else
- n = 1;
- } while (!result);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement