program percepton; // 1. Опис використаних модулів, сталих і змінних uses Graphics, Interfaces; const n = 2; // кількість типів еталонних зображень (літер) m = 29; // розмір зображень по вертикалі й горизонталі, зменшений на 1 s0 = '/home/chief/0/'; // тека тек файлів з еталонними зображеннями для навчання s1 = '/home/chief/1/'; // тека файлів із зображеннями для розпізнавання t0 : array[0..n] of string = ('А', 'Б', 'В'); // символи й назви тек з еталонними зображеннями n0 : array[0..n] of integer = ( 0 , 0 , 0 ); // кількості файлів з еталонними зображеннями без 1 n1 = 2; // кількість файлів для розпізнавання без 1 nk = 10; // кількість ітерацій навчання eta = 0.001; // коефіцієнт пропорційності η var w: array[0..n,0..m,0..m] of real; // результат навчання за всіма нейронами img: array [0..m,0..m] of byte; // результат розпізнавання x, // номер стовпчика пікселів у файлі зображення y, // номер рядка пікселів у файлі зображення i, // номер еталонного зображення j, // номер зображення для розпізнавання l, // номер штучного нейрону imin : byte; // номер штучного нейрону з найменшим відхиленням від k : word; // номер ітерації E, // значення помилки r, // відгук штучного нейрона rmin : real; // відгук штучного нейрона з найменшим відхиленням від номера нейрона o : text; // файлова змінна для вихідного файлу p : TBitmap; // поточне зображення s : string; // назва файлу, що містить № файлу із зображенням для розпізнавання // 2. Опис функції, що перетвоює колір у число 0 або 1 function f (c: TColor): shortint; var r, g, b: byte; color: $0..$FFFFFFFF; begin color := ColorToRGB(c); // інтенсивності кольорів моделі RGB: r := ($000000FF and Color); // червоного g := ($0000FF00 and Color) Shr 8; // зеленого b := ($00FF0000 and Color) Shr 16; // блакитного if (r+g+b > 381) then f:=0 else f:=1; end; BEGIN // 3. Заповнення початкових значень w випадковими числами з [0,1) randomize; for i:=0 to n do for x:=0 to m do for y:=0 to m do w[i,x,y]:=random()/m/m; // 4. Навчання згідно з дельта-правилом p:=TBitmap.Create; // Створення об'єкту зображення for k:=1 to nk do begin for i:=0 to n do for j:=0 to n0[i] do begin str(j,s); p.LoadFromFile(s0+t0[i]+'/'+s+'.bmp'); for x:=0 to m do for y:=0 to m do img[x,y]:=f(p.Canvas.Pixels[x,y]); for l:=0 to n do begin if (l=i) then E:=1 else E:=0; for x:=0 to m do for y:=0 to m do E:=E-w[l,x,y]*img[x,y]; for x:=0 to m do for y:=0 to m do w[l,x,y]:=w[l,x,y]+eta*E*img[x,y]; end; end; end; // 5. Розпізнавання зображень - знаходження еталону з найменшим відхиленням - // і запис результатів розпізнавання у файл output.txt у форматі // номер файлу (для розпізнавання) - символ еталону assign(o,'/home/chief/output.txt'); // пов'язування файлової змінної з назвою файлу rewrite(o); // відкриття файлу на запис з початку файлу for j:=0 to n1 do begin str(j,s); p.LoadFromFile(s1+s+'.bmp'); for x:=0 to m do for y:=0 to m do img[x,y]:=f(p.Canvas.Pixels[x,y]); imin:=0; for i:=0 to n do begin r:=0; for x:=0 to m do for y:=0 to m do r:=r+img[x,y]*w[i,x,y]; r:=abs(r-1); if (i=0) then rmin:=r else if (r