Geograph

Untitled

Feb 10th, 2017
273
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. using System;
  2.  
  3. class Number5
  4. {
  5.     // Инициализация весов сети
  6.     static int[] weights = new int[15];
  7.  
  8.     // Порог функции активации
  9.     static int bias = 7;
  10.  
  11.     static Random random = new Random(Guid.NewGuid().GetHashCode());
  12.  
  13.     static void Main()
  14.     {
  15.         // Цифры (Обучающая выборка)
  16.         var num0 = "111101101101111".ToCharArray();
  17.         var num1 = "001001001001001".ToCharArray();
  18.         var num2 = "111001111100111".ToCharArray();
  19.         var num3 = "111001111001111".ToCharArray();
  20.         var num4 = "101101111001001".ToCharArray();
  21.         var num5 = "111100111001111".ToCharArray();
  22.         var num6 = "111100111101111".ToCharArray();
  23.         var num7 = "111001001001001".ToCharArray();
  24.         var num8 = "111101111101111".ToCharArray();
  25.         var num9 = "111101111001111".ToCharArray();
  26.  
  27.         // Список всех вышеуказанных цифр
  28.         char[][] nums = { num0, num1, num2, num3, num4, num5, num6, num7, num8, num9 };
  29.  
  30.         // Виды цифры 5 (Тестовая выборка)
  31.         var num51 = "111100111000111".ToCharArray();
  32.         var num52 = "111100010001111".ToCharArray();
  33.         var num53 = "111100011001111".ToCharArray();
  34.         var num54 = "110100111001111".ToCharArray();
  35.         var num55 = "110100111001011".ToCharArray();
  36.         var num56 = "111100101001111".ToCharArray();
  37.  
  38.         // Тренировка сети
  39.         for (int i = 0; i < 10000; i++)
  40.         {
  41.             // Генерируем случайное число от 0 до 9
  42.             var option = random.Next(0, 9 + 1);
  43.  
  44.             // Если получилось НЕ число 5
  45.             if (option != 5)
  46.             {
  47.                 // Если сеть выдала True/Да/1, то наказываем ее
  48.                 if (proceed(nums[option])) decrease(nums[option]);
  49.             }
  50.             // Если получилось число 5
  51.             else
  52.             {
  53.                 // Если сеть выдала False/Нет/0, то показываем, что эта цифра - то, что нам нужно
  54.                 if (!proceed(num5)) increase(num5);
  55.             }
  56.         }
  57.  
  58.         // Вывод значений весов
  59.         Console.WriteLine(String.Join(", ", weights));
  60.  
  61.         // Прогон по обучающей выборке
  62.         Console.WriteLine("0 это 5? " + proceed(num0));
  63.         Console.WriteLine("1 это 5? " + proceed(num1));
  64.         Console.WriteLine("2 это 5? " + proceed(num2));
  65.         Console.WriteLine("3 это 5? " + proceed(num3));
  66.         Console.WriteLine("4 это 5? " + proceed(num4));
  67.         Console.WriteLine("6 это 5? " + proceed(num6));
  68.         Console.WriteLine("7 это 5? " + proceed(num7));
  69.         Console.WriteLine("8 это 5? " + proceed(num8));
  70.         Console.WriteLine("9 это 5? " + proceed(num9), "\r\n");
  71.  
  72.         // Прогон по тестовой выборке
  73.         Console.WriteLine("Узнал 5? " + proceed(num5));
  74.         Console.WriteLine("Узнал 5 - 1? " + proceed(num51));
  75.         Console.WriteLine("Узнал 5 - 2? " + proceed(num52));
  76.         Console.WriteLine("Узнал 5 - 3? " + proceed(num53));
  77.         Console.WriteLine("Узнал 5 - 4? " + proceed(num54));
  78.         Console.WriteLine("Узнал 5 - 5? " + proceed(num55));
  79.         Console.WriteLine("Узнал 5 - 6? " + proceed(num56));
  80.  
  81.         Console.WriteLine("\r\nНажмите любую кнопку для выхода");
  82.         Console.ReadKey();
  83.     }
  84.  
  85.     // Является ли данное число 5
  86.     static bool proceed(char[] number)
  87.     {
  88.         // Рассчитываем взвешенную сумму
  89.         var net = 0;
  90.         for (int i = 0; i < 15; i++)
  91.         {
  92.             net += int.Parse(number[i].ToString()) * weights[i];
  93.         }
  94.  
  95.         // Превышен ли порог? (Да - сеть думает, что это 5. Нет - сеть думает, что это другая цифра)
  96.         return net >= bias;
  97.     }
  98.  
  99.     // Уменьшение значений весов, если сеть ошиблась и выдала 1
  100.     static void decrease(char[] number)
  101.     {
  102.         for (int i = 0; i < 15; i++)
  103.         {
  104.             // Возбужденный ли вход
  105.             if (int.Parse(number[i].ToString()) == 1)
  106.             {
  107.                 // Уменьшаем связанный с ним вес на единицу
  108.                 weights[i]--;
  109.             }
  110.         }
  111.     }
  112.  
  113.     // Увеличение значений весов, если сеть ошиблась и выдала 0
  114.     static void increase(char[] number)
  115.     {
  116.         for (int i = 0; i < 15; i++)
  117.         {
  118.             // Возбужденный ли вход
  119.             if (int.Parse(number[i].ToString()) == 1)
  120.             {
  121.                 // Увеличиваем связанный с ним вес на единицу
  122.                 weights[i]++;
  123.             }
  124.         }
  125.     }
  126. }
RAW Paste Data