Вы находитесь на странице: 1из 15

ФГАОУ ВО «УрФУ имени первого Президента России Б. Н.

Ельцина»
Институт новых материалов и технологий
Кафедра электронного машиностроения

РАЗРАБОТКА СИСТЕМЫ РАСПОЗНАВАНИЯ ЦИФР ПОЧТОВОГО


ИНДЕКСА
отчет по практической работе по дисциплине
«Искусственный интеллект»

Подпись Дата
Преподаватель_____________________________________________Лысенко В.В.
Студент____________________________________________________Куно Луза Э.
Группа___________________________________________________НМТМ-290702

Екатеринбург
2020
1. Разработать схему на логических элементах.

Система детектора почтового индекса имеет 9 входов (рис. 1) и 10 выходов. Которые


показаны в следующей таблице истинности.

Риc 1. элементы ввода

Создание таблицы истинности:

x x x x x y
x1 2 x3 4 5 x6 7 x8 9 y1 y2 y3 y4 5 y6 y7 y8 y9 y10
0 1 1 1 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0
1 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0
2 1 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0
3 1 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0
4 0 1 1 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0
5 1 1 0 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 0
6 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 1 0 0 0
7 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0
8 1 1 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0
9 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1

Выходные уравнения выглядят следующим образом:

[0] y1  x1 x2 x3 x4 x5 x6 x7 x8 x9
[1] y2  x1 x2 x3 x4 x5 x6 x7 x8 x9
[2] y3  x1 x2 x3 x4 x5 x6 x7 x8 x9
[3] y4  x1 x2 x3 x4 x5 x6 x7 x8 x9
[4] y5  x1 x2 x3 x4 x5 x6 x7 x8 x9
[5] y6  x1 x2 x3 x4 x5 x6 x7 x8 x9
[6] y7  x1 x2 x3 x4 x5 x6 x7 x8 x9
[7] y8  x1 x2 x3 x4 x5 x6 x7 x8 x9
[8] y9  x1 x2 x3 x4 x5 x6 x7 x8 x9
[9] y10  x1 x2 x3 x4 x5 x6 x7 x8 x9
Представление логических функций в логических элементах И и НЕ.

x1
x1
U4
U4 U1
U1
x2
x2
U2
U2
x3
x3 NOT
NOT
U5
U5
x4
x4 y1
y1

x5
x5 AND
AND
NOT
NOT
x6
x6 AND_8
AND_8
U6
U6
x7
x7

x8
x8
NOT
NOT
x9
x9

U22
U22
x1
x1
U3
U3
x2
x2
U26
U26
NOT
NOT
x3
x3
U23
U23 U7
U7
x4
x4 NOT
NOT
U27
U27 y2
y2
x5
x5 NOT
NOT
U24
U24 AND
AND
x6
x6
NOT
NOT AND_8
AND_8
x7
x7
U25
U25
NOT
NOT
x8
x8

x9
x9
NOT
NOT

U28
U28
x1
x1
U8
U8
U30
U30
x2
x2
NOT
NOT
U29 U9
U9
x3
x3 U29
NOT
NOT
x4
x4
U31
U31 y3
y3

x5
x5 NOT
NOT
U32
U32
AND
AND
x6
x6 NOT
NOT AND_8
AND_8

x7
x7
NOT
NOT
x8
x8

x9
x9

Риc 2. Выходные логические функции 1,2 и 3


U36
U36

y2
y2 x1
x1
U38
U38 U10
U10
NOT
NOT
x2
x2
U35
U35
U11
U11
x3
x3 NOT
NOT

x4
x4 NOT
NOT y4
y4
U37
U37
x5
x5
U34
U34
AND
AND
x6
x6 AND_8
AND_8
NOT
NOT
x7
x7
NOT
NOT
x8
x8

x9
x9

U40
U40

x1
x1
NOT
NOT
U39
U39
x2
x2
U12
U12
x3
x3
U41
U41 NOT U13
x4
NOT U13
x4

x5
x5
U33
U33 y5
y5
NOT
NOT
x6
x6 AND
AND
x7
x7 NOT
NOT AND_8
AND_8
U42
U42
x8
x8

x9
x9
NOT
NOT
U43
U43

NOT
NOT
x1
x1
U14
U14
x2
x2
U44
U44
U15
U15
x3
x3

x4
x4 NOT
NOT y6
y6

x5
x5
U45
U45 AND
AND
x6
x6 AND_8
AND_8
x7
x7 NOT
NOT
x8
x8
U46
U46
x9
x9

NOT
NOT
U47
U47

x1
x1
U16
U16
NOT
NOT
x2
x2
U48
U48
U17
U17
x3
x3

x4
x4 NOT
NOT y7
y7
U49
U49
x5
x5 AND
AND
x6
x6 AND_8
AND_8
NOT
NOT
x7
x7
U50
U50
x8
x8

x9
x9 NOT
NOT
Риc 3. Логические функции выхода 4,5,6 и 7

U51
U51

NOT
NOT
U52
U52

U18
U18
x1
x1
U53
U53 NOT
NOT
x2
x2 U19
U19
x3
x3 NOT
NOT
U54
U54
y8
y8
x4
x4
U55
U55 AND
AND
x5
x5 NOT
NOT
AND_8
AND_8
x6
x6
NOT
NOT
U56
U56
x7
x7

x8
x8
NOT
NOT
x9
x9

U57
U57
x1
x1
U20
U20
x2
x2 NOT
NOT

x3 U58
U58 U21
x3 U21
x4
x4
y9
y9
x5
x5 NOT
NOT
AND
AND
x6
x6
AND_8
AND_8
x7
x7

x8
x8

x9
x9

U61
U61
x1
x1
U59
U59
x2
x2 NOT
NOT
x3 U62
U62 U60
x3 U60
x4
x4
y10
y10
x5
x5 NOT
NOT
U63
U63 AND
AND
x6
x6
AND_8
AND_8
x7
x7
U64
U64
NOT
NOT
x8
x8

x9
x9
NOT
NOT

Риc 4. Функции логических выходов 8,9 и 10

2. Разработать программу для контроллера Arduino

Используя уравнения от 0 до 9, вы можете создать сценарий непосредственно в Arduino.


int in1 = 41;int in2 = 42;int in3 = 43;
int in4 = 44;int in5 = 45;int in6 = 46;
int in7 = 47;int in8 = 48;int in9 = 49;
int y1 = 1;int y2 = 2;int y3 = 3;int y4 = 4;
int y5 = 5;int y6 = 6;int y7 = 7;int y8 = 8;
int y9 = 9;int y10 = 10;
float x1=0;float x2=0;float x3=0;float x4=0;float x5=0;
float x6=0;float x7=0;float x8=0;float x9=0;
float u1=0;float u2=0;float u3=0;float u4=0;float u5=0;
float u6=0;float u7=0;float u_8=0;float u9=0;float u10=0;

void setup()
{
   pinMode(x1, INPUT);pinMode(x2, INPUT);pinMode(x3, INPUT);
   pinMode(x4, INPUT);pinMode(x5, INPUT);pinMode(x6, INPUT);
   pinMode(x7, INPUT);pinMode(x8, INPUT);pinMode(x9, INPUT);
   pinMode(y1, OUTPUT);pinMode(y2, OUTPUT);
   pinMode(y3, OUTPUT);pinMode(y4, OUTPUT);
   pinMode(y5, OUTPUT);pinMode(y6, OUTPUT);   
   pinMode(y7, OUTPUT);pinMode(y8, OUTPUT);
   pinMode(y9, OUTPUT);pinMode(y10, OUTPUT);   
}

void loop() {
   x1=digitalRead(in1);
   x2=digitalRead(in2);
   x3=digitalRead(in3);
   x4=digitalRead(in4);
   x5=digitalRead(in5);
   x6=digitalRead(in6);
   x7=digitalRead(in7);
   x8=digitalRead(in8);
   x9=digitalRead(in9);
   
   u1=x1*x2*x3*!x4*!x5*x6*x7*!x8*x9;
   u2=!x1*!x2*x3*x4*!x5*!x6*x7*!x8*!x9;
   u3=x1*!x2*x3*!x4*!x5*!x6*!x7*x8*x9;
   u4=x1*!x2*!x3*x4*x5*!x6*!x7*x8*!x9;
   u5=!x1*x2*x3*!x4*x5*!x6*x7*!x8*!x9;
   u6=x1*x2*!x3*!x4*x5*!x6*x7*!x8*x9;
   u7=!x1*!x2*!x3*x4*x5*x6*x7*!x8*x9;
   u_8=x1*!x2*!x3*x4*!x5*x6*!x7*!x8*!x9;
   u9=x1*x2*x3*!x4*x5*x6*x7*!x8*x9;
   u10=x1*x2*x3*!x4*x5*!x6*!x7*x8*!x9;
  
   
   if (u1>0) {digitalWrite(y1, HIGH);}
   else      {digitalWrite(y1, LOW);}
   if (u2>0) {digitalWrite(y2, HIGH);}
   else      {digitalWrite(y2, LOW);}
   if (u3>0) {digitalWrite(y3, HIGH);}
   else      {digitalWrite(y3, LOW);}
   if (u4>0) {digitalWrite(y4, HIGH);}
   else      {digitalWrite(y4, LOW);}
   if (u5>0) {digitalWrite(y5, HIGH);}
   else      {digitalWrite(y5, LOW);}
   if (u6>0) {digitalWrite(y6, HIGH);}
   else      {digitalWrite(y6, LOW);}     
   if (u7>0) {digitalWrite(y7, HIGH);}
   else      {digitalWrite(y7, LOW);}
   if (u_8>0) {digitalWrite(y8, HIGH);}
   else      {digitalWrite(y8, LOW);}
   if (u9>0) {digitalWrite(y9, HIGH);}
   else      {digitalWrite(y9, LOW);}
   if (u10>0) {digitalWrite(y10, HIGH);}
   else      {digitalWrite(y10, LOW);}    
}

Проверка программы Arduino и логического уравнения.

Риc 5. Число 4
Риc 6. Число 9

Риc 7. Число 8
Риc 8. Число 3

Риc 9. Подтверждение записи, отличной от числа

3. Разработать сеть из математических нейронов.

В соответствии с желаемыми входами и выходами мы имеем следующую схему


нейронной сети;
Ввод порогов. 1 y1
x1 y2

x2 y3

x3 y4

x4 y5

x5 y6

x6 y7

x7 y8

x8 y9

x9 y10

Риc 9. Схема нейронной системы

Веса и пороги указаны следующим образом:


 w1,1  w1,10   b1 
 
W  M 910      B   
 
w  w  b 
 9,1 9,10 
;  9

Входы и желаемые выходы в матричной форме:


Чтобы найти веса и пороги, для каждого выхода используется следующий код Matlab
перцептрона.
function [W, b]=perceptron1(X,Y)

%X : inputs; X=number of inputs x number of elements


size=(ni,ne)
%Y : desired outputs
[c,r]=size(X);

X=[X;ones(1,r)]; % Adding b (bias) = 1

a=round(0.6*rand(1)+0.2,1); % learning factor a = [0.2 0.8]


W=round(rand(1,c+1),1)-0.5; % randon values from -0.5 to
0.5
% The W has a one more value, is weigth of the bias
j=1;
while j<=r
u=W*X(:,j); % w1x1 +w2x2+x3w3+ ... +b
y=hardlim(u); % Activate function
e=Y(j)-y; % Calculte error
if e~=0
Wn=[W' X(:,j)]*[1;a*e]; %recalculate the weight
W(j+1)=W(j)+a*e*x
%Matrix mode
W=Wn';
if j>1
j=1;
end

else
j=j+1;
end

end
b=W(end);
W=W(1:end-1);

Для реализации системы была выбрана функция преобразования.


0, if u  0
 (u )  
1, if u  0
Были рассчитаны веса и пороговые значения функций. Матрица весов и порогов:

Мы знаем, что результат u равен следующему выражению:


N
u   wij x  b
j 0

 u1 
U      WX  B
u 
 10 

Уравнение для определения каждой цифры представлено следующим образом:

Наконец, у нас есть выравнивание выходов с функцией активации:


y j   (u j )
Реализация в Arduino

int in1 = 41;int in2 = 42;int in3 = 43;


int in4 = 44;int in5 = 45;int in6 = 46;
int in7 = 47;int in8 = 48;int in9 = 49;
int y1 = 1;int y2 = 2;int y3 = 3;int y4 = 4;
int y5 = 5;int y6 = 6;int y7 = 7;int y8 = 8;
int y9 = 9;int y10 = 10;
float x1=0;float x2=0;float x3=0;float x4=0;float x5=0;
float x6=0;float x7=0;float x8=0;float x9=0;
float u1=0;float u2=0;float u3=0;float u4=0;float u5=0;
float u6=0;float u7=0;float u_8=0;float u9=0;float u10=0;

void setup()
{
   pinMode(x1, INPUT);pinMode(x2, INPUT);pinMode(x3, INPUT);
   pinMode(x4, INPUT);pinMode(x5, INPUT);pinMode(x6, INPUT);
   pinMode(x7, INPUT);pinMode(x8, INPUT);pinMode(x9, INPUT);
   pinMode(y1, OUTPUT);pinMode(y2, OUTPUT);
   pinMode(y3, OUTPUT);pinMode(y4, OUTPUT);
   pinMode(y5, OUTPUT);pinMode(y6, OUTPUT);   
   pinMode(y7, OUTPUT);pinMode(y8, OUTPUT);
   pinMode(y9, OUTPUT);pinMode(y10, OUTPUT);   
}

void loop() {
   x1=digitalRead(in1);
   x2=digitalRead(in2);
   x3=digitalRead(in3);
   x4=digitalRead(in4);
   x5=digitalRead(in5);
   x6=digitalRead(in6);
   x7=digitalRead(in7);
   x8=digitalRead(in8);
   x9=digitalRead(in9);
   
   u1=3.2*x1+2.6*x2+1.1*x3+-0.7*x4+-0.4*x5+0.9*x6+0.7*x7+-
0.4*x8+0.3*x9+-8.6;
   u2=-0.4*x1+-0.8*x2+1.4*x3+0.8*x4+-0.8*x5+-1.1*x6+0.8*x7+-
0.8*x8+-0.8*x9+-2.7;
   u3=0.3*x1+-0.4*x2+0.2*x3+-0.2*x4+-0.3*x5+-0.4*x6+-
0.2*x7+0.2*x8+0.2*x9+-0.8;
   u4=1.6*x1+-0.6*x2+-0.7*x3+1.2*x4+1.1*x5+-0.5*x6+-
0.4*x7+0.6*x8+-0.4*x9+-4.2;
   u5=-0.4*x1+3.0*x2+1.8*x3+-0.8*x4+0.8*x5+-0.5*x6+0.3*x7+-
0.7*x8+-0.9*x9+-5.6;
   u6=3.0*x1+3.1*x2+-0.3*x3+-0.6*x4+2.7*x5+-0.5*x6+1.9*x7+-
0.1*x8+0.3*x9+-11.0;
   u7=-0.7*x1+-0.9*x2+-0.7*x3+3.3*x4+2.7*x5+1.9*x6+1.5*x7+-
0.7*x8+0.9*x9+-9.9;
   u_8=0.7*x1+-0.3*x2+-0.2*x3+0.2*x4+-0.4*x5+0.4*x6+-0.3*x7+-
0.2*x8+-0.3*x9+-1.1;
   u9=2.1*x1+1.7*x2+1.1*x3+-0.3*x4+0.8*x5+0.3*x6+0.3*x7+-
0.2*x8+0.4*x9+-6.6;
   u10=0.6*x1+0.1*x2+0.1*x3+-0.2*x4+0.1*x5+-0.1*x6+-
0.1*x7+0.2*x8+-0.2*x9+-1.1;

   
   if (u1>=0) {digitalWrite(y1, HIGH);}
   else      {digitalWrite(y1, LOW);}
   if (u2>=0) {digitalWrite(y2, HIGH);}
   else      {digitalWrite(y2, LOW);}
   if (u3>=0) {digitalWrite(y3, HIGH);}
   else      {digitalWrite(y3, LOW);}
   if (u4>=0) {digitalWrite(y4, HIGH);}
   else      {digitalWrite(y4, LOW);}
   if (u5>=0) {digitalWrite(y5, HIGH);}
   else      {digitalWrite(y5, LOW);}
   if (u6>=0) {digitalWrite(y6, HIGH);}
   else      {digitalWrite(y6, LOW);}     
   if (u7>=0) {digitalWrite(y7, HIGH);}
   else      {digitalWrite(y7, LOW);}
   if (u_8>=0) {digitalWrite(y8, HIGH);}
   else      {digitalWrite(y8, LOW);}
   if (u9>=0) {digitalWrite(y9, HIGH);}
   else      {digitalWrite(y9, LOW);}
   if (u10>=0) {digitalWrite(y10, HIGH);}
   else      {digitalWrite(y10, LOW);}
   
}
Схема подключения логических функций и настройки в Arduino