Программа 1-НЕЙРОН

1. Общее
2. Матрица нейронов
3. Структура программы 1-НЕЙРОН
4. Входной сигнал
5. Суперцикл
6. Основной цикл
7. Формирование матрицы s4[1..gg,1..n]
8. Результат
9. Сравнение по итерациям
10. Вывод
11. Трактовка результатов
12. Скачать программу 1-НЕЙРОН
Приложение
программа 1-НЕЙРОН WORD

1. Общее
Разум у живого реализован на основе нейронных сетей.
У нематоды – 300 нейронов, у человека – 68 млд.
https://ru.wikipedia.org/wiki/Список_жи … у_нейронов
Нейронов передают между собой сигналы возбуждения (активности).
В технике появились аналоги нейронных сетей живого.
Такие сети наследовали только общие принципы нейронных сетей живого.
Аналоги не связаны биологическими ограничениями.
Эволюция однообразна.
Так в воздухе эволюция не создала ни винта, ни ракеты.
Ниже будет описана программа 1-НЕЙРОН.
Цель программы – проведение экспериментов по результатам воздействия разных входных сигналов на сеть нейронов.
Отдаленный аналог поставленной задачи  - цепи Маркова.

2. Матрица нейронов
Матрица нейронов p[1..n,1..n].
Элемент p[i,j]  - равен весу нейрона i,j.
Вес: больше, меньше  или  равен нулю.
Задаётся ограничение.
z1<p[i,j]<z
Принято: элементы матрицы p[i,j] и p[j,i] соответствуют одному нейрону.
Всего нейронов: n(n-1):2.

3. Структура программы 1-НЕЙРОН
3.1. Задаются данные ввода.
Пример
const
      n=  50;//число нейронов
        gg= 50;//gg<=n  число серий входных сигналов
      t1 =  4 ;///максимальное число итераций основного цикла
       a1 = 7;// абсолютный вес  связи аксон - дендрит
        z= 30000000 ;//   максимальный вес нейрона
        z1= -30000000 ;//минимальный  вес нейрона
       nn=20;// Связь аксон - дендрит: + или -
       t6 =17;///связь аксон - дендрит: + или -
         m=20;//отсутствие связи мжду нейронами
            t7=18 ;// отсутствие связи мжду нейронами
       tt = 2;//входной сигнал
       pp = 2 ;// номер итерации суперцикла для вычисления
      //суммы веса нейронов больше, меньше  и равного нулю в конце
   //    основного цикла, соответственно m1, m2, m3
       ga =gg;//1<= ga<=gg  вывод массива p
       gb =t1 ;// 1<= gb<=t1   вывод массива p
  gc=n;//gc <=n итерация основного цикла, формирование матрицы s4
           tc =gg;//шаг суперцикла при сравнении
         ta =1;// сравнение  - основной цикл
          tb=t1;// сравнение - основной цикл
          t4=1; //порог активности нейрона
          va= 3 ;//    три способа задания входного сигнала
3.2. Генерируется таблица связей между нейронами s[1..n, 1 ..n]
3.3. Суперцикл.
3.3.1. На каждой итерации 1.. gg суперцикла генерируется входной сигнал.
3.3.2. На каждой итерации суперцикла проходит t1 итераций основного цикла
3.3.3. По результатам циклов суперцикла и основного формируется - массив s4[1..gg,1..n]
3.4. Основной вывод – результат обработки массива s4[1..gg,1..n]

4. Входной сигнал
4.1 Задается один из трёх видов входного сигнала
va=1
va=2
va=3
4.2. va=1
Входной сигнал с периодом от 1 до gg
4.3. va=2
Входной сигнал:
n подмассивов - строк с входными сигналами с 1 до gg
Входные сигналы с начала строк массива f[1..gg,1..n]
4.4. va=3
Аналогично, как по п.4.3, но входные сигналы с конца строк массива.

5. Суперцикл
5.1. На каждой итерации основного цикла генерируется входной сигнал.
Входной сигнал представляет матрицу f[1..gg,1..n].
5.2. На каждой итерации i суперцикла строки i матрицы f[1..n,1..n] приравниваются к первой строке матрицы p[1..n,1..n].
5.3. На каждой итерации суперцикла проходит t1 итераций основного цикла

6. Основной цикл
6.1. На каждой итерации последовательно преобразуется или остаются без изменений элементы матрицы p[1..n,1..n]
6.2. Проводится преобразование матрицы p[1..n,1..n] – основной цикл.
if ib> 1 then begin //
       if     p[ia,ib-1] >= t4
       then    begin
       c1:= c1+1;
        p[ia,ib]:=  p[ia,ib]+ s[ib ,ia];
То есть состояние  каждого элемента зависит от двух элементов.
Так как p[i,j] = p[j,i]
Элемент p[i,1] преобразуeтся с учетом состояния элемента p[i,n]

7. Формирование матрицы s4[1..gg,1..n]
Строка i соответствует номеру итерации суперцикла.
Элементы строки равны строке tc матрицы p[1..n,1..n],
на итерации t1 основного цикла.

8. Результат
Обобщенный результат вычисляется путём суммирования по строкам матрицы s4[1..gg,1..n]
for i:=1 to gg do  begin
            for j:=1 to n do
            begin
                Form1.Caption:=IntToStr(GetTickCount-Tick);
            if s4[i,j] =0 then  w[i,1] := w[i,1]+1 ;
             if s4[i,j] >0 then  w[i,2] := w[i,2]+1;
              if s4[i,j] <0 then  w[i,3] := w[i,3]+1;
              if s4[i,j] >0 then  w[i,4] := w[i,4]+s4[i,j];
               if s4[i,j]<0 then  w[i,5] := w[i,5]+s4[i,j];
        w[i,6] := w[i,6]+s4[i,j] ;
                     end;   end;

           for i:=1 to gg do
             begin
            r[i,7] := w[i,1]/n;
             r[i,8] := w[i,2]/n;
               r[i,9] := w[i,3]/n;
               if  (w[i,4]-w[i,5])>0 then
        r[i,10] := w[i,4]/(w[i,4]-w[i,5]);
                     if  (w[i,4]-w[i,5])>0 then
         r[i,11] := -w[i,5]/(w[i,4]-w[i,5]);
                               end;

9. Сравнение по итерациям
В ходе вычислений фиксируются массивы s1 и s2.
Массив s1 равен массиву р: суперцикл итерация tc,  основной  цикл итерация  ta
Массив s2 равен массиву р: суперицкл итерация tc,  основной  цикл итерация  tb
Вычисляется  z  - сумма несовпадений величин элементов массивов s1 и s2.’

10. Вывод
Выводятся массивы:
s [1..n, 1 ..n]     
p : array [1..n,1..n]  - для заданных итераций суперцикла и основного цикла
     f :  array [1..gg,1..n]
     w : array [1..gg,1..7]
     r : array [1..gg,7..12]

11. Трактовка результатов
Оценку результатов вычислений можно провести по величине элементов массива w[i,4].’
Оказалось, что часто серии элементов w[i,4] равны.
То есть, например, w[i,4] = w[i+1,4] = w[i+2,4] = … = w[i+k,4].
Можно трактовать, как опознание множеств сходных объектов
n= 20;//число нейронов
           tc =6;//шаг суперцикла при сравнении
         ta =3;// сравнение  - основной цикл
          tb=4;// сравнение - основной цикл
          t4=1; //порог активности нейрона
          va= 1 ;//    три способа задания входного сигнала

12. Скачать программу 1-НЕЙРОН
https://disk.yandex.ru/d/xgrj-zJYKazxhQ

Приложение
Программа  1-НЕЙРОН  WORD

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, StdCtrls, Menus, ActnMan, ActnColorMaps;

type
  TForm1 = class(TForm)

    StringGrid1: TStringGrid;
    Button1: TButton;
    Button3: TButton;
    Button5: TButton;
    Label1: TLabel;
    StringGrid2: TStringGrid;
    StringGrid3: TStringGrid;
    StringGrid4: TStringGrid;
    Button4: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Label4: TLabel;
    Edit3: TEdit;
    Edit4: TEdit;
    StringGrid5: TStringGrid;
    StaticText1: TStaticText;
    StringGrid6: TStringGrid;

    procedure Button1Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
implementation
{$R *.dfm}
          const
      n=   20;//числоо нейронов
        gg=        20;//gg<=n  число серий входных сигналов
      t1 =  4 ;///максимальное число итераций основного цикла
       a1 = 7;// абсолютный вес  связи аксон - дендрит
        z= 30000000 ;//   ммаксимальный вес нейрона
        z1= -30000000 ;//минимальный  вес нейрона
       nn=20;// Связь аксон - дендрит: + или -
       t6 =17;///связь аксон - дендрит: + или -
         m=20;//отсутствие связи мжду нейронами
            t7=18 ;// отсутствие связи мжду нейронами
       tt = 2;//входной сигнал
       pp = 2 ;// номер итерации суперцикла для вычисленият
      //суммы веса нейронов больше, меньше  и равногт нулю в конце
   //    основного цикла, соответствено m1, m2, m3
       ga =gg;//1<= ga<=gg  вывод массива p
       gb =t1 ;// 1<= gb<=t1   вывод массива p gc =5;;
  gc=n;//gc <=n итерация основного цикла, формирование матрицы s4
           tc =gg;//шаг суперцикла при сравнении
         ta =1;// сравнение  - основной цикл
          tb=t1;// сравнение - основной цикл
          t4=1; //порог активности нейрона
          va=2 ;//    три способа задания входного сигнала

      var
       Tick: Cardinal;

s:array [1..n, 1 ..n] of integer;// связи аксон - дендриты
p : array [1..n,1..n] of integer;// состояние нейронов
   f :  array [1..gg,1..n] of integer;
   // состояние входного сигнала
w : array [1..gg,1..7] of INTEGER;
// суммирование состояний нейронов по строкам матрицы  s4[1..gg,1..n]
  r : array [1..gg,1..15] of variant;
   //доля состояний нейронов
s4 :  array   [1..gg,1..n]of integer;
// выборки состояний нейронов для входных сигналов
s1 :  array   [1..n,1..n]of integer;//массив для сравнения
s2  :  array   [1..n,1..n]of integer;// массив для сравнения
s3  :  array   [1..5,1..gg]of integer;//  резерв
a, u, x,x1, c,c1,c2, b1,  d1, t,  d, g, q,i,j,i1,i2,ji,hh : integer; //
j1,j2,j3,j4,j5,j6,j7,j8,i3,i4,i5,i6,i7,i8,i0, jz : integer; //
zz,e, e1, z2, z3, iv,jv: integer;//
m1 ,m2,m3,m7,m9,m10, m11,m12,mm,ma: integer;//
df,ii, h, x7,x8,x9,a7,a8,a9: integer;
    ia, ib,ic, id ,it,iw, iu, ju, ja, jb, jc, jd ,jt, jw, ij ,ix: integer;//
ss, dd,  sss, uu ,u1,u2,u3,u4  :integer;//
  r1, r2, r3, r4, r5, r6 ,r7, r8, r9 ,bb:  integer;//
         ff, g1,cc,ccc,  kk,c3, c4, c5:  integer;//
  m4,m5, m6,m8 ,ww, l1, l2 ,l3,l4: variant;//
 
procedure TForm1.Button1Click(Sender: TObject);
// окантовка
begin

    for q:=1 to n //нумерация по горизонтали в табл №1 ,
     do StringGrid1.Cells[q,0]:=IntToStr(q);
       for q:=1 to gg   // нумерация по вертикали  в табл №1 ,
     do   StringGrid1.Cells[0,q]:=IntToStr(q);

   for q:=1 to n //нумерация по горизонтали в табл №2,
     do StringGrid2.Cells[q,0]:=IntToStr(q);
       for q:=1 to n   // нумерация по вертикали  в табл №2 ,
     do   StringGrid2.Cells[0,q]:=IntToStr(q);

       for q:=1 to 20 //нумерация по горизонтали в табл №3,
     do StringGrid3.Cells[q,0]:=IntToStr(q);
       for q:=1 to gg   // нумерация по вертикали  в табл №3 ,
     do   StringGrid3.Cells[0,q]:=IntToStr(q);

           for q:=1 to n //нумерация по горизонтали в табл №4,
     do StringGrid4.Cells[q,0]:=IntToStr(q);
       for q:=1 to n   // нумерация по вертикали  в табл №4 ,
     do   StringGrid4.Cells[0,q]:=IntToStr(q);

         for q:=1 to n //нумерация по горизонтали в табл №5,
     do StringGrid5.Cells[q,0]:=IntToStr(q);
       for q:=1 to gg   // нумерация по вертикали  в табл №5 ,
     do   StringGrid5.Cells[0,q]:=IntToStr(q);

      for q:=1 to gg //нумерация по горизонтали в табл №6,
     do StringGrid6.Cells[q,0]:=IntToStr(q);
       for q:=1 to 5    // нумерация по вертикали  в табл №6 ,
     do   StringGrid6.Cells[0,q]:=IntToStr(q);

         StringGrid2.Cells[0,0]:='P';
           StringGrid5.Cells[0,0]:='S4';
              StringGrid3.Cells[0,0]:='W';
                  StringGrid1.Cells[0,0]:='F';
                      StringGrid4.Cells[0,0]:='S';
                        StringGrid6.Cells[0,0]:='S3';

             // Формирование матрицы s
        for i:=1 to n do
        for j:= 1 to n do
                   begin
                   h:=0; mm:=0;
              Form1.Caption:=IntToStr(GetTickCount-Tick);
         s[i,j] := random (a1)+1;
          mm:= random (nn)+1 ;
              if mm >t6 then s[i,j] := (-s[i,j]);
              h:= random (m)+1;
          if h>t7 then s[i,j] := 0;
         end;  //b

       for iu :=1 to n do
         for ju := 1 to n do
         begin
        if s[iu,ju] >0 then u1 := u1 +1;
         if s[iu,ju] =0 then u2 := u2 +1;
           if s[iu,ju] <0 then u3 := u3 +1;
         end;
         u4:=   u1+ u2+ u3;

            for ii:=1 to gg do  //суперцикл
            begin
              for iv:=1 to  n do
              for jv :=1 to n do
              p[iv,jv] :=0;

        //серия периодических  входных сигналов
           if va=1 then
                    for j:=1 to n  do
                    begin
                        Form1.Caption:=IntToStr(GetTickCount-Tick);
                      df := j mod ii;
                      if df =0 then f[ii,j] :=tt;
                      end;
            // серия  сплошных входныхъ сигналов - с начала
                     if va=2 then
                     for jz:=1 to ii do
                    f[ii,jz] := tt;
                    //  серия  сплошных входныхъ сигналов - с конца
                         if va=3 then
                     for jz:=1  to ii do
                    f[ii,n-jz+1] := tt;

            //передача входных сигналов на нейроны
                 for j:=1 to n   do begin
              p[1,j] := f[ii,j] ;
                 p[j,1] := f[ii,j];
               end;

              begin  //  aa
               //основной цикл
                for i:=1  to  t1 do
                begin  /////
                    for ia:=1 to n do
                    for ib :=1 to n do
                begin  //  cc
                 c:= c+1;
                      Form1.Caption:=IntToStr(GetTickCount-Tick);

           if ib> 1 then//
       if     p[ia,ib-1] >= t4
       then    begin
       c1:= c1+1;
        p[ia,ib]:=  p[ia,ib]+ s[ib ,ia];
             if p[ia,ib]>z then  p[ia,ib]:=z;
         if p[ia,ib]<z1 then  p[ia,ib]:=z1;
          p[ib,ia] := p[ia,ib];
         end;
        //
               if ib=n then//
      if     p[ia,n] >= t4
       then
       begin
       c2:=c2+1;
        p[ia,1]:=  p[ia,1]+ s[ia,1];
          if p[ia,1]>z then  p[ia,1]:=z;
         if p[ia,1]<z1 then  p[ia,1]:=z1;
          p[1,ia] := p[ia,1];
          end;

                       /////////////
            // фиксация состояний нейронов в основном цикдле
                     if ii=tc then
          begin
                        if    i=ta then
                     for x7:=1 to n do
                     for a7:=1 to n do
                     s1[x7,a7]:= p[x7,a7] ;

                    if    i=tb then
                     for x8:=1 to n do
                     for a8 :=1 to n do
                     s2[x8,a8]:= p[x8,a8]  ;

                        zz:=0; uu:=0; ss:=0; mm:=0;dd:=0;
                          for x9:=1 to n do
                           for a9:=1 to n do
                          if s1[x9,a9]<> s2[a9,x9]then begin
                          zz := zz +1;
                       if s1[x9,a9]=z then uu:=uu+1;
                      if s1[x9,a9]=-z then ss :=  ss+1;
                       if s2[x9,a9]=z  then ma:=ma+1;
                     if s2[x9,a9]=-z then dd := dd+1;
                                                  end;
                             end;
                       /////////////
                //вывод соcтояния нейронов при заданных итерациях
               // суперцикла и основного цикла
                if (ii = ga) and (i=gb) then
                  for it:=1 to n  do
       for jt:= 1 to n   do
   StringGrid2.Cells[jt,it]:=
   IntToStr( p[it,jt]);
             end; //
       //формиирование итогового массива
                      if i=t1 then
              for ix:=1 to n do
              s4[ii,ix] := p[gc,ix];
                if  (ii = pp) and (i=t1) then
                for i8 :=1 to n do
                 for j8 :=1 to n do
                  begin
                  if p[i8,j8] =0 then
                 m1:= m1 +1;
                   if p[i8,j8] >0 then
                 m2:= m2 +1;
                  if p[i8,j8] <0 then
                 m3 := m3 +1;
                end;     end; //
                              end;// aa
                                  end; // bb

                    for i:=1 to gg do//  begin
            for j:=1 to n do
            begin
                Form1.Caption:=IntToStr(GetTickCount-Tick);
            if s4[i,j] =0 then  w[i,1] := w[i,1]+1 ;
             if s4[i,j] >0 then  w[i,2] := w[i,2]+1;
              if s4[i,j] <0 then  w[i,3] := w[i,3]+1;
              if s4[i,j] >0 then  w[i,4] := w[i,4]+s4[i,j];
               if s4[i,j]<0 then  w[i,5] := w[i,5]+s4[i,j];
        w[i,6] := w[i,6]+s4[i,j] ;
                     end;//  end;

           for i:=1 to gg do
             begin
            r[i,7] := w[i,1]/n;
             r[i,8] := w[i,2]/n;
               r[i,9] := w[i,3]/n;
               if  (w[i,4]-w[i,5])>0 then
        r[i,10] := w[i,4]/(w[i,4]-w[i,5]);
                     if  (w[i,4]-w[i,5])>0 then
         r[i,11] := -w[i,5]/(w[i,4]-w[i,5]);
                               end;

                   m4 := m1/(n*n);
                       m5 := m2/(n*n);
                         m6 := m3/(n*n);
                    m7:= m1+m2+m3;
                      m8 := m4+m5+m6;

                     ww:= zz/(n*n);

                           c3:= c1 + c2;
                            c4:= c-(c1 + c2);
                     for i:=1 to 5 do
                     for j:=1 to gg do begin
                StringGrid6.Cells[j,i]:=
   IntToStr(s3[i,j]);
   end;

               for i:=1 to gg do
            for j:=1 to 7 do
                StringGrid3.Cells[j,i]:=
   IntToStr( w[i,j]);

                     for i:=1 to gg do
            for j:=7 to 12 do
                StringGrid3.Cells[j,i]:=
                      FormatFloat('0.000',r[i,j]) ;
                   Form1.Caption:=IntToStr(GetTickCount-Tick);

            for i:=1 to gg do
            for j:=1 to n do
   StringGrid1.Cells[j,i]:=
   IntToStr( f[i,j]);

       for i:=1 to n  do
       for j:=1 to n   do
            StringGrid4.Cells[j,i]:=
   IntToStr( s[i,j]);
                 Form1.Caption:=IntToStr(GetTickCount-Tick);

          for i:=1 to gg do
           for j:= 1 to n   do
   StringGrid5.Cells[j,i]:=
   IntToStr( s4[i,j]);

          Edit1.Text :=  'va='+'---' +IntToStr(va) +'   '  +
           'n='+'---'+IntToStr(n)+'   '  +
         'gg='+'---' +IntToStr(gg) +'   '  +
        't1='+'---'+IntToStr(t1)+'   '  +
        'a1='+'---'+IntToStr(a1)+'   '  +
        'z='+'---'+IntToStr(z)+'   '  +
           'z1='+'---'+IntToStr(z1)+'   '  +
           'm='+'---'+IntToStr(m)+'   '  +
            't6='+'---'+IntToStr(t6)+'   '  +
               'nn='+'---' +IntToStr(nn) +'   '  +
                't7'+'---'+IntToStr(t7)+'   '  +
                   'tt='+'---' +IntToStr(tt)  +'   '  +
                     'pp='+'---' +IntToStr(pp)    ;

        Edit2.Text :=
        'm1='+'---'+IntToStr(m1)+'   ' +
           'm2='+'---'+IntToStr(m2)+'   ' +
               'm3='+'---'+IntToStr(m3)+'   ' +
           'm4='+'---'+FormatFloat('0.000',m4)+'   ' +
              'm5='+'---'+FormatFloat('0.000',m5)+'   ' +
         'm6='+'---'+FormatFloat('0.000',m6)+'   ' +
             'm7='+'---'+IntToStr(m3)+'   ' +
         'm8='+'---'+FormatFloat('0.000',m8)+'   ' +
           'u1='+'---'+  IntToStr(u1)+'   ' +
        'u2='+'---'+IntToStr(u2)   +'   '  +
        'u3='+'---'+IntToStr(u3)     +'   '  +
        'u4='+'---'+IntToStr(u4)   ;

        Edit3.Text :=
          'z='+'---' +IntToStr(z)  +'   '  +
         'z1='+'---' +IntToStr(z1)  +'   '  +
        'c='+'---'+IntToStr(c)   +'   '  +
            'c1='+'---'+IntToStr(c1)   +'   '  +
              'c2 ='+'---'+IntToStr(c2)  +'   '  +
                 'c3='+'---'+IntToStr(c3)   +'   '  +
            'c4='+'---'+IntToStr(c4)   +'   '  +
              'c5 ='+'---'+IntToStr(c5);

   Edit4.Text := 'zz='+'---'+IntToStr(zz)   +'   '  +
   'ww='+'---'+FormatFloat('0.000', ww)+'   ' +
              'cc ='+'---'+IntToStr(cc) +'   '  +
                'uu='+'---'+IntToStr(uu)   +'   '  +
                   'ss='+'---'+IntToStr(ss)  +'   '  +
               'ma='+'---'+IntToStr(ma)    +'   '  +
                   'dd='+'---'+IntToStr(dd)      +'   '  +
                  //  'm9='+'---'+IntToStr(m9)   +'   '  +
                 //  'm10='+'---'+IntToStr(m10)  +'   '  +
               //'m11='+'---'+IntToStr(m11)   +'   '  +
                //   'm12='+'---'+IntToStr(m12)+'   '  +
                 'bb='+'---'+IntToStr(bb)                                                   ;
                                     end;

                procedure TForm1.Button4Click(Sender: TObject);
begin
end;
  /////////  ///////////////////////////////////////////////////////
        procedure TForm1.Button5Click(Sender: TObject);
begin
      close
end;
   initialization
randomize;
end.

Отредактировано ABC (2024-03-17 15:05:15)