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

ОГЛАВЛЕНИЕ

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

1. Общее
Программа 3-НЕЙРОН развитие программы 1-НЕЙРОН.
Исследуется двухмерная нейронная сеть.
Каждый нейрон связан с несколькими нейронами. 
Цель программы определить состояние нейронной сети
при поступлении разных сигналов на вход нейронной сети.

2. Матрица нейронов
Матрица нейронов (нейронная сеть)  p[1..n,1..n].
Элемент p[i,j]  - равен весу нейрона i,j.
Вес: больше, меньше  или  равен нулю.

3. Структура программы 3-НЕЙРОН
3.1. Ввод и массивы.
Ввод.
Пример
Const
n=30;//размер матрицы нейронов
        gg= 30;//gg<=n  число серий входных сигналов
      t1 =  1    ;/// число итераций основного цикла
       a1 =  5;// исходнгый вес  связи аксон - дендрит
          m=150;//отсутствие связи между нейронами
            t7=1;// отсутствие связи между нейронами
       nn=20;// Связь  "аксон - дендрит": + или -
       t6 =21 ;///связь "аксон - дендрит ": + или -
       tt =  3;//входной сигнал
       pp = 2 ;// номер итерации суперцикла для вычисленият
      //суммы веса нейронов больше, меньше  и равногт нулю в конце
   //    основного цикла, соответствено m1, m2, m3
       ga = gg;//ga<=gg  вывод массива p
       gb =t1 ;// 1<= gb<=t1   вывод массива p
  //gc=n;//gc <=n формирование матрицы s4
          t4=3 ; //порог активности нейрона  t4<=tt
          v=  5 ;// пять вариантов задания входного сигнала
          h1=3; // вывод слоя матрицы  s
          h2= 4; // вывод слоя матрицы  s
          z = 200;//оценка активности нейронов
          z1 = 200;// оценка активности нейронов
  za=1;//формирование массива S4  1- по горизонтали,2 - по вертикали
Массивы
s:array [1..n, 1 ..n,1..n,1..n] of integer;// связи аксон - дендриты
p : array [1..n,1..n] of integer;// состояние нейронов
  p1 : array [1..n,1..n] of integer;// состояние нейронов
   f :  array [1..n,1..n] of integer;
   // состояние входного сигнала
s4 :  array   [1..n ,1..n]of integer;// заданные строки матрицы p
//  по циклам суперцикла
  w : array [1..gg,1..7] of INTEGER; // результаты целочисленные
     r : array [1..gg,1..15] of variant;  // результаты не целочисленные
3.2. Генерируется таблица связей между нейронами s[1..n, 1..n, 1..n,1.. n]
То есть каждый нейрон может активировать все другие нейроны.
Конкретные нейроны для активации и величина активации – случайный процесс.
3.3. Суперцикл.
3.3.1. На каждой итерации 1.. gg суперцикла генерируется входной сигнал из однотипной серии входных сигналов.
Всего 5 серий входных сигналов.
V = номер серии (1-5)
3.3.2. На каждой итерации суперцикла проходит t1 итераций основного цикла
3.3.3. По результатам циклов суперцикла и основного формируется - массив s4[1..gg,1..n]
3.4. Результат обработки массива s4[1..gg,1..n] – массив w[1..gg,1..7]

4. Входной сигнал
4.1. Задается один из пяти серий  входного сигнала
4.2. v=1
Входной сигнал с периодом от 1 до gg
4.3. v=2
Входной сигнал арифметическая прогрессия с фиксированным началом в столбце 1 массива p.
4.3. v=3
Входной сигнал арифметическая прогрессия с фиксированным началом в столбце n массива p.
4.3. v=4
Входной сигнал по диагонали  массива p.
4.3. v=5
Входной сигнал арифметическая прогрессия со сменным началом в массиве p.

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] – основной цикл.
for i:=1  to  t1 do
                  begin
                   c:=c+1;
                begin  /////
                    for ia:=1 to n do
                    for ib :=1 to n do
                    for ic:=1 to n do
                    for id:=1 to n do
                    begin
                        Form1.Caption:=IntToStr(GetTickCount-Tick);

                        if p[ia,ib]<>0 then
                       p[ia,ib] := p[ia,ib] +  s[ia,ib,ic,id];
                        if p[ia,ib]>z then  c1:= c1+1;
                       if p[ia,ib]<z1 then   c2:= c2+1;
                       if ii = gg then     c3:= c3+1;
                    end;
                    end;
7. Формирование матрицы s4[1..gg,1..n]
Строка i соответствует номеру итерации суперцикла.
Элементы строки равны строке tc или столбцу tc матрицы p[1..n,1..n],
на итерации t1 основного цикла.

8. Результат
По матрице s4 находится матрица w[1..gg,1..7] путём суммирования
элементов строк матрицы s4.

9. Трактовка результата
За конечный результат принят столбец w[1..gg,6]
При v=1, v=4 и v=5 закономерностей не обнаружено.
При  v=2 и v=3  при всех расчётах
w[i+1,6] > = w[i,6]   

10. Вывод
Выводятся массивы:
p1, s4, f , s w, и r

ww- среднее число связей между нейронами.

11. Скачать программу   3-НЕЙРОН
ZIP
https://disk.yandex.ru/d/2IBvLWqs7AyduQ
TAR
https://disk.yandex.ru/d/NVl25xJIc8TOEA

Приложение
Программа  3-НЕЙРОН  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;
    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=30;//размер матрицы нейронов
        gg= 30;//gg<=n  число серий входных сигналов
      t1 =  1    ;/// число итераций основного цикла
       a1 =  5;// исходнгый вес  связи аксон - дендрит
          m=150;//отсутствие связи между нейронами
            t7=1;// отсутствие связи между нейронами
       nn=20;// Связь  "аксон - дендрит": + или -
       t6 =21 ;///связь "аксон - дендрит ": + или -
       tt =  3;//входной сигнал
       pp = 2 ;// номер итерации суперцикла для вычисленият
      //суммы веса нейронов больше, меньше  и равногт нулю в конце
   //    основного цикла, соответствено m1, m2, m3
       ga = gg;//ga<=gg  вывод массива p
       gb =t1 ;// 1<= gb<=t1   вывод массива p
  //gc=n;//gc <=n формирование матрицы s4
          t4=3 ; //порог активности нейрона  t4<=tt
          v=  5 ;// пять вариантов задания входного сигнала
          h1=3; // вывод слоя матрицы  s
          h2= 4; // вывод слоя матрицы  s
          z = 200;//оценка активности нейронов
          z1 = 200;// оценка активности нейронов
    za=1;//формирование массива S4  1- по горизонтали,2 - по вертикали
      var
       Tick: Cardinal;

s:array [1..n, 1 ..n,1..n,1..n] of integer;// связи аксон - дендриты
p : array [1..n,1..n] of integer;// состояние нейронов
  p1 : array [1..n,1..n] of integer;// состояние нейронов
   f :  array [1..n,1..n] of integer;
   // состояние входного сигнала
s4 :  array   [1..n ,1..n]of integer;// заданные строки матрицы p
//  по циклам суперцикла
  w : array [1..gg,1..7] of INTEGER; // результаты целочисленные
     r : array [1..gg,1..15] of variant;  // результаты не целочисленные

a, u, x,x1, c,c1,c2,c3,c4, 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; //
e, e1, z2, z3, iv,jv,ii,jj: integer;//
m1 ,m2,m3,m7,m9,m10, m11,m12,mm,ma: integer;//
df, h, x7,x8,x9,a7,a8,a9, ui,uj: 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;//
    y,k,ff, g1,cc,ccc,   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);
     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
              for ii:= 1 to n do
               for jj :=1 to n do
                  if (i<>ii) or (j<>jj) then
                   begin
                   h:=0; mm:=0;
              Form1.Caption:=IntToStr(GetTickCount-Tick);
         s[i,j,ii,jj] := random (a1)+1;
           h:= random (m)+1;
          if h>t7 then s[i,j,ii, jj] := 0;
               mm:= random (nn)+1 ;
            if mm >t6 then s[i,j,ii,jj] := (-s[i,j,ii,jj]);
         end;  //b

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

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

        //серия периодических  входных сигналов
           if v=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 v=2 then
                     for jz:=1 to ii do
                    f[ii,jz] := tt;
                    //  серия  сплошных входныхъ сигналов - с конца
                         if v=3 then
                     for jz:=1  to ii do
                    f[ii,n-jz+1] := tt;

                       if v= 4 then
                          begin
                           cc:= cc+1;
                    if  (cc+jz)<=n then
                    f[ii,cc] := tt;
                         end;

                            if v= 5 then
                          begin
                          cc:= cc+1;
                    if 2*cc<=n then
                       for jz:=1  to cc do
                     f[ii,cc+jz-1] := tt ;
                             end;

           // передача входных сигналов на нейроны
                 for j:=1 to n   do begin
              p[1,j] := f[ii,j] ;
                            end;
                             //основной цикл
                for i:=1  to  t1 do
                  begin
                   c:=c+1;
                begin  /////
                    for ia:=1 to n do
                    for ib :=1 to n do
                    if p[ia,ib] >= t4 then
                        begin
                  for ic:=1 to n do
                    for id:=1 to n do

                    begin
                        Form1.Caption:=IntToStr(GetTickCount-Tick);
                        p[ic,id] := p[ic,id] +  s[ia,ib,ic,id];
                        if p[ia,ib]>z then  c1:= c1+1;
                       if p[ia,ib]<z1 then   c2:= c2+1;
                       if ii = gg then     c3:= c3+1;
                    end;

                         if   (ii = ga) and (i=gb) then
                  for it:=1 to n  do
       for jt:= 1 to n   do
                p1[it,jt]:=  p[it,jt];
                    end;
                        end;
                         /////////////
                //вывод соcтояния нейронов при заданных итерациях
                               // суперцикла и основного цикла
       //формиирование итогового массива
                      if i=t1 then
                           begin
                     if za=1 then
                     for ix:=1 to n do
              s4[ii,ix] := p[n,ix];

                if za =2 then
                  for ix:=1 to n do
              s4[ii,ix] := p[ix,n];
                        end;

                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;//
                               end; //
                          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);

                         ww:=u1/(n*n);
                Form1.Caption:=IntToStr(GetTickCount-Tick);                //

                     for i:=1 to    n do
           for j:=1 to n do
                StringGrid2.Cells[j,i]:=
                            IntToStr( p1[i,j]);

                         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);

                   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,h1,h2]);
                 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 :=  'v='+'---' +IntToStr(v) +'   '  +
           '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)+'   ' +
             'm7='+'---'+IntToStr(m3)+'   ' +
         'm8='+'---'+FormatFloat('0.000',m8)+'   ' +
           'u1='+'---'+  IntToStr(u1)+'   ' +
        'u2='+'---'+IntToStr(u2) +'   '  +
        'u3='+'---'+IntToStr(u3)  +'   '  +
        'u4='+'---'+IntToStr(u4)   +'   '  +
        'ww='+'---'+  FormatFloat('0.000',ww) ;;

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

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

Отредактировано ABC (2024-04-16 16:29:38)