Программа 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)