
- •Содержание.
- •Введение.
- •Глава 1. Нейронечеткие методы вычислений
- •1.1. Основные положения метода нечеткого управления.
- •1.2. Нейронные сети в системах контроля и управления.
- •Глава 2. Алгоритм реализации нечёткого контроллера на основе сетей обратного распространения.
- •2.1. Нейронные сети с обратным распространением ошибки.
- •2.2. Алгоритм обучения с обратным распространением ошибки.
- •2.3. Алгоритм работы нечёткого контроллера.
- •2.4. Обучающий алгоритм для нечёткого контроллера.
- •Глава 3. Методы управления в компьютерно-интегрированном производстве.
- •3.1. Компьютерно-интегрированное производство.
- •3.2. Типовой технологический маршрут изготовления кмоп ис
- •Глава 4. Реализация программного обеспечения и результаты имитационного моделирования алгоритма нечёткого контроллера.
- •4.1. Реализация алгоритма нечёткого контроллера высокотемпературных операций.
- •Результаты имитационного моделирования.
- •4.3. Вывод.
- •Глава 5. Сегментация рынка контроллеров на основе нейронных сетей.
- •5.1. Общие положения.
- •5.2. Методика расчёта сегментации рынка.
- •5.3. Поиск сегментов рынка нечётких контроллеров.
- •5.4. Вывод.
- •Глава 6. Электробезопасность в помещениях вычислительных центров.
- •6.1. .Анализ вредных воздействий на организм человека при работе на эвм.
- •6.2. Электроопасность при работе с эвм.
- •6.3. Факторы влияющие на степень поражения электрическим током.
- •6.4. Медицинская помощь при поражении электрическим током.
- •6.5. Организационные и Технические мероприятия по безопасности эксплуатации.
- •6.6. Вывод.
- •Заключение.
- •Литература.
- •Глава 1-6.
- •Глава 7.
- •Глава 6.
- •Приложение.
Какую работу нужно написать?
Приложение.
Модуль обучения обычного алгоритма обратного распространения.
procedure TForm1.Button3Click(Sender: TObject);
Var Q,L,L1,Wr,I,J,K,C :Integer;
sDW,dW,nW,D :Real;
NetS,OutS,Out :Real;
Con,n,Target :Real;
O1,O2,O3,O4,O5:Real;
NN :String;
begin
{Датчик обучения}
Gauge1.Progress:=0;
Gauge2.Progress:=0;
If Edit9.Text='' Then Edit9.Text:='0';
Val(Edit9.Text,C,Err);
Gauge1.MaxValue:=C;
Gauge2.MaxValue:=100;
{Цикл обучения}
For L1:=1 TO Gauge1.MaxValue DO
Begin
Gauge1.Progress:=Gauge1.Progress+1 ;
Gauge2.Progress:=0;
For Q:=1 TO 100 DO
Begin
Gauge2.Progress:=Gauge2.Progress+1 ;
{Перебор входных обучающих векторов}
For L:=0 TO ListBox1.Items.Count-1 DO
Begin
Edit1.Text:=ListBox1.Items[L];
Edit2.Text:=ListBox2.Items[L];
Edit3.Text:=ListBox3.Items[L];
Edit4.Text:=ListBox4.Items[L];
Edit5.Text:=ListBox5.Items[L];
Edit6.Text:=ListBox6.Items[L];
Edit7.Text:=ListBox7.Items[L];
Edit8.Text:=ListBox8.Items[L];
Edit12.Text:=ListBox9.Items[L];
Edit13.Text:=ListBox10.Items[L];
Edit14.Text:=ListBox11.Items[L];
Edit15.Text:=ListBox12.Items[L];
Edit16.Text:=ListBox13.Items[L];
{Заполнение вх значений}
ZapolnIn;
{первый слой}
For I:=1 To 10 Do
Begin
Element[I,1].Out:=InV[I];
End;
{второй слой}
For I:=1 To 10 Do
Begin
NetS:=0;
For K:=1 To 10 Do NetS:=NetS+Element[K,1].Out*St12[K,I].Weght;
OutS:=1/(1+exp(-NetS));
Element[I,2].Out:=OutS;
End;
{третий слой}
For I:=1 To 10 Do
Begin
NetS:=0;
For K:=1 To 10 Do NetS:=NetS+Element[K,2].Out*St23[K,I].Weght;
OutS:=1/(1+exp(-NetS));
Element[I,3].Out:=OutS;
End;
{четвёртый слой}
For I:=1 To 10 Do
Begin
NetS:=0;
For K:=1 To 10 Do NetS:=NetS+Element[K,3].Out*St34[K,I].Weght;
OutS:=1/(1+exp(-NetS));
Element[I,4].Out:=OutS;
End;
{пятый слой}
For I:=1 To 3 Do
Begin
NetS:=0;
For K:=1 To 10 Do NetS:=NetS+Element[K,4].Out*St45[K,I].Weght;
OutS:=1/(1+exp(-NetS));
Element[I,5].Out:=OutS;
End;
{Конец прямого хода}
{Обратный ход}
{Коэф.скорости обучения}
V:=0;
If Edit10.Text='' Then Edit10.Text:='0';
Val(Edit10.Text,V,Err);
n:=V;
{Подстройка выходного слоя 5}
{Перебор выходных элементов}
For J:=1 To 3 Do
Begin
{Вычесление ошибки}
Out:=Element[J,5].Out;
Target:=OutV[J];
D:=Out*(1-Out)*(Target-Out);
Element[J,5].D:=D;
{Перебор элементов пред. уровня, настройка веса от него}
For I:=1 To 10 Do
Begin
{Поправка к весу}
dW:=n*D*Element[I,4].Out;
St45[I,J].WOld:=St45[I,J].Weght;
St45[I,J].Weght:=St45[I,J].Weght+dW;
End;
End;
{Подстройка выходного слоя 4}
{Перебор элементов 4-го слоя}
For J:=1 To 10 Do
Begin
sDW:=0;
Out:=Element[J,4].Out;
{Перебор элементов вых уровня и суммирование их D*Wold}
For K:=1 To 3 Do sDW:=SDW+St45[J,K].WOld*Element[K,5].D;
D:=Out*(1-Out)*sDW;
Element[J,4].D:=D;
{Перебор элементов пред. уровня(3), настройка веса от него}
For I:=1 To 10 Do
Begin
{Поправка к весу}
dW:=n*D*Element[I,3].Out;
St34[I,J].WOld:=St34[I,J].Weght;
St34[I,J].Weght:=St34[I,J].Weght+dW;
End;
End;
{Подстройка выходного слоя 3}
{Перебор элементов 3-го слоя}
For J:=1 To 10 Do
Begin
sDW:=0;
Out:=Element[J,3].Out;
{Перебор элементов вых уровня и суммирование их D*Wold}
For K:=1 To 10 Do sDW:=SDW+St34[J,K].WOld*Element[K,4].D;
D:=Out*(1-Out)*sDW;
Element[J,3].D:=D;
{Перебор элементов пред. уровня(2), настройка веса от него}
For I:=1 To 10 Do
Begin
{Поправка к весу}
dW:=n*D*Element[I,2].Out;
St23[I,J].WOld:=St23[I,J].Weght;
St23[I,J].Weght:=St23[I,J].Weght+dW;
End;
End;
{Подстройка выходного слоя 2}
{Перебор элементов 2-го слоя}
For J:=1 To 10 Do
Begin
sDW:=0;
Out:=Element[J,2].Out;
{Перебор элементов вых уровня и суммирование их D*Wold}
For K:=1 To 10 Do sDW:=SDW+St23[J,K].WOld*Element[K,3].D;
D:=Out*(1-Out)*sDW;
Element[J,2].D:=D;
{Перебор элементов пред. уровня(1), настройка веса от него}
For I:=1 To 10 Do
Begin
{Поправка к весу}
dW:=n*D*Element[I,1].Out;
St12[I,J].WOld:=St12[I,J].Weght;
St12[I,J].Weght:=St12[I,J].Weght+dW;
End;
End;
{Результаты }
O1:=Element[1,5].out;
O2:=Element[2,5].out;
O3:=Element[3,5].out;
Str(O1:10:4,s);
Label16.Caption:=s;
Str(O2:10:4,s);
Label17.Caption:=s;
Str(O3:10:4,s);
Label18.Caption:=s;
END;{ForL}
END;{ForQ}
{-----Save---------------------}
N3Click(Sender);
{------------------------------}
END;{ForL1}
Gauge1.Progress:=0;
Gauge2.Progress:=0;
end;
Модуль обучения алгоритма нечеткого контроллера.
procedure TForm1.Button3Click(Sender: TObject);
Var I,J,L1,Q,C,L,K:Integer;
DU :Real;
NetS,OutS,Out :Real;
Con,n,Target :Real;
O1,O2,O3,O4,O5:Real;
NN :String;
begin
Stop:=0;
{Датчик обучения}
Gauge1.Progress:=0;
Gauge2.Progress:=0;
If Edit9.Text='' Then Edit9.Text:='0';
Val(Edit9.Text,C,Err);
Gauge1.MaxValue:=C;
Gauge2.MaxValue:=100;
{Цикл обучения}
For L1:=1 TO Gauge1.MaxValue DO
Begin
Gauge1.Progress:=Gauge1.Progress+1 ;
Gauge2.Progress:=0;
For Q:=1 TO 100 DO
Begin
Gauge2.Progress:=Gauge2.Progress+1 ;
{Перебор входных обучающих векторов}
For L:=0 TO ListBox1.Items.Count-1 DO
Begin
Edit1.Text:=ListBox1.Items[L];
Edit2.Text:=ListBox2.Items[L];
Edit3.Text:=ListBox3.Items[L];
Edit4.Text:=ListBox4.Items[L];
Edit5.Text:=ListBox5.Items[L];
Edit6.Text:=ListBox6.Items[L];
Edit7.Text:=ListBox7.Items[L];
Edit8.Text:=ListBox8.Items[L];
{Заполнение вх значений}
ZapolnIn;
{первый слой}
For I:=1 To 5 Do
Element[I,1].Out:=InV[I];
{второй слой}
{Перебор елементов второго слоя}
For J:=1 To 17 Do
{Перевор элементов первого слоя}
For I:=1 To 5 Do
{Проверка наличия связи}
If St12[I,J].C=1 Then
Begin
Element[J,2].Net:=-sqr((Element[I,1].Out-Element[J,2].M)/Element[J,2].D);
Element[J,2].Out:=exp(Element[J,2].Net);
End;
{третий слой}
{Перебор элементов третьего слоя}
For J:=1 To 16 Do
Begin
{ставим выход в 1 (мах выхода колокола=1)}
Element[J,3].Out:=1;
{Перебор елементов второго слоя}
For I:=1 To 17 Do
{Проверка наличия связи}
If St23[I,J].C=1 Then
{Проверка на min}
If Element[I,2].Out<Element[J,3].Out Then
Element[J,3].Out:=Element[I,2].Out;
End;
{четвёртый слой}
{Перебор елементов четвёртого слоя}
For J:=1 To 10 Do
Begin
{Обнуляем сумму от предыдущих проходов}
Element[J,4].Net:=0;
{Перебор элементов третьего слоя}
For I:=1 To 16 Do
{Проверка наличия связи}
If St34[I,J].C=1 Then
Begin
{Суммирование выходов третьего слоя присоединённых к элементу 4-го слоя}
Element[J,4].Net:=Element[J,4].Net+Element[I,3].Out;
{Выбор min Между суммой и 1}
If Element[J,4].Net>1 Then
Element[J,4].Out:=1
Else
Element[J,4].Out:=Element[J,4].Net;
End;
End;
{пятый слой}
{Перебор елементов пятого слоя}
For J:=1 To 3 Do
Begin
{Обнуляем сумму от предыдущих проходов}
Element[J,5].Net:=0;
Element[J,5].DU:=0;
{Перебор елементов четвёртого слоя}
For I:=1 To 10 Do
{Проверка наличия связи}
If St45[I,J].C=1 Then
Begin
Element[J,5].Net:=Element[J,5].Net+Element[I,4].M*Element[I,4].D*Element[I,4].Out;
Element[J,5].DU:=Element[J,5].DU+Element[I,4].D*Element[I,4].Out;
End;
Element[J,5].Out:=Element[J,5].Net/Element[J,5].DU;
End;
{Конец прямого хода}
{Обратный ход}
{Коэф.скорости обучения}
V:=0;
If Edit10.Text='' Then Edit10.Text:='0';
Val(Edit10.Text,V,Err);
n:=V;
{Подстройка выходного слоя 5 и слоя4(центра и ширины дефудзификатора 4-го слоя)}
{Перебор выходных элементов}
For J:=1 To 3 Do
{Вычесление ошибки}
{Перебор элементов 4-го уровня}
Begin
Element[J,5].Q:=(OutV[J]-Element[J,5].Out);
For I:=1 To 10 Do
{Проверка наличия связи}
If St45[I,J].C=1 Then
Begin
Element[I,4].M1:=Element[I,4].M+n*(OutV[J]-Element[J,5].Out)*
(Element[I,4].D*Element[I,4].Out/Element[J,5].DU);
Element[I,4].D1:=Element[I,4].D+n*(OutV[J]-Element[J,5].Out)*
Element[I,4].Out*(Element[I,4].M*Element[J,5].DU-Element[J,5].Net)/
sqr(Element[J,5].DU);
{Одновременно рассчтаем ошибку в 4-ом слое}
Element[I,4].Q:=Element[J,5].Q*
Element[I,4].Out*(Element[I,4].M*Element[J,5].DU-Element[J,5].Net)/
sqr(Element[J,5].DU);
End;
End;
{Подстройка слоя 3}
{Перебор элементов 3-го слоя}
For J:=1 To 16 Do
{Перебор элементов 4-го слоя}
Begin
Element[J,3].Q:=0;
For I:=1 To 10 Do
{Проверка наличия связи}
If St34[J,I].C=1 Then
Begin
Element[J,3].Q:=Element[J,3].Q+Element[I,4].Q;
End;
End;
{Подстройка выходного слоя 2}
{Перебор элементов 2-го слоя}
For J:=1 To 17 Do
{Перебор элементов 1-го уровня}
Begin
Element[J,2].Q:=0;
{Перебор елементов 3-го слоя и проверка на =min}
For K:=1 To 16 Do
Begin
{Проверка наличия связи}
If St23[J,K].C=1 Then
If Element[K,3].Out=Element[J,2].Out Then
Element[J,2].Q:=Element[J,2].Q+Element[K,3].Q;
End;
Element[J,2].M1:=Element[J,2].M-n*Element[J,2].Q*Element[J,2].Out*
2*(Element[I,1].Out-Element[J,2].M)/
sqr(Element[J,2].D);
Element[J,2].D1:=Element[J,2].D-n*Element[J,2].Q*Element[J,2].Out*
2*sqr(Element[I,1].Out-Element[J,2].M)/
Element[J,2].D*sqr(Element[J,2].D);
End;
{Перенесение t+1 шага на t}
{Перебор элементов 4-го слоя}
For I:=1 To 10 Do
Begin
Element[I,4].M:=Element[I,4].M1;
Element[I,4].D:=Element[I,4].D1;
End;
{Перебор элементов 2-го слоя}
For I:=1 To 17 Do
Begin
Element[I,2].M:=Element[I,2].M1;
Element[I,2].D:=Element[I,2].D1;
End;
{Обнуление вычеслений}
{Перебор элементов 5-го слоя}
For I:=1 To 10 Do
Begin
Element[I,4].M1:=0;
Element[I,4].D1:=0;
End;
{Результаты }
O1:=Element[1,5].out;
O2:=Element[2,5].out;
O3:=Element[3,5].out;
Str(O1:10:4,s);
Label16.Caption:=s;
Str(O2:10:4,s);
Label17.Caption:=s;
Str(O3:10:4,s);
Label18.Caption:=s;
{------------Update------------}
Label16.Update;
Label17.Update;
Label18.Update;
{------------------------------}
END;{ForL}
END;{ForQ}
{-----Save---------------------}
N3Click(Sender);
{------------------------------}
END;{ForL1}
Gauge1.Progress:=0;
Gauge2.Progress:=0;
end;