Nadesłany przez Tomasz Lubiński, 27 lipca 2005 01:00
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.Pobierz pełne rozwiązanie.
Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.
Sztuczny neuron - nauka z nauczycielem - Delphi/sztuczny_neuron.pas:
//www.algorytm.org //uczenie sztucznego neuronu - uczenie z nauczycielem (c)2002 by Tomasz Lubiński unit sztuczny_neuron; interface uses Windows, Messages, Math, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; Edit5: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; Edit6: TEdit; Label8: TLabel; Label9: TLabel; Edit7: TEdit; Edit8: TEdit; Label10: TLabel; Edit9: TEdit; Label11: TLabel; Edit10: TEdit; Label12: TLabel; GroupBox1: TGroupBox; RadioButton1: TRadioButton; RadioButton2: TRadioButton; RadioButton3: TRadioButton; RadioButton4: TRadioButton; RadioButton5: TRadioButton; Label13: TLabel; GroupBox2: TGroupBox; Button1: TButton; Edit11: TEdit; Edit12: TEdit; Edit13: TEdit; Label14: TLabel; Label15: TLabel; Label16: TLabel; Button2: TButton; procedure FormPaint(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; x,w: Array [1..5] of Real; y,z,e,a,p,blad: Real; licznik: Integer; implementation {$R *.DFM} procedure TForm1.FormPaint(Sender: TObject); begin sleep(100); Canvas.MoveTo(32,60); Canvas.LineTo(197,250); Canvas.MoveTo(120,60); Canvas.LineTo(199,250); Canvas.MoveTo(216,60); Canvas.LineTo(201,250); Canvas.MoveTo(304,60); Canvas.LineTo(203,250); Canvas.MoveTo(392,60); Canvas.LineTo(205,250); Canvas.MoveTo(201,280); Canvas.LineTo(201,320); end; procedure TForm1.Button1Click(Sender: TObject); var i:Integer; begin a:=StrToFloat(Edit11.Text); p:=StrToFloat(Edit12.Text); blad:=StrToFloat(Edit13.Text); x[1]:=StrToFloat(Edit1.Text); x[2]:=StrToFloat(Edit2.Text); x[3]:=StrToFloat(Edit3.Text); x[4]:=StrToFloat(Edit4.Text); x[5]:=StrToFloat(Edit5.Text); w[1]:=StrToFloat(Edit6.Text); w[2]:=StrToFloat(Edit7.Text); w[3]:=StrToFloat(Edit8.Text); w[4]:=StrToFloat(Edit9.Text); w[5]:=StrToFloat(Edit10.Text); y:=0; for i:=1 to 5 do y:=y+x[i]*w[i]; if RadioButton1.checked then z:=0.8*y+1; if RadioButton2.checked then begin if y>0 then z:=1 else if y<0 then z:=-1 else z:=0; end; if RadioButton3.checked then z:=1/(1+exp(-y)); if RadioButton4.checked then z:=Tanh(y); if RadioButton5.checked then z:=exp(-y*y); Label1.Caption:='y = ' + FloatToStr(y); Label13.Caption:='z = ' + FloatToStr(z); licznik:=0; repeat licznik:=licznik+1; e:=p-z; for i:=1 to 5 do w[i]:=w[i]+a*x[i]*e; y:=0; for i:=1 to 5 do y:=y+x[i]*w[i]; Edit6.Text:=FloatToStr(w[1]); Edit7.Text:=FloatToStr(w[2]); Edit8.Text:=FloatToStr(w[3]); Edit9.Text:=FloatToStr(w[4]); Edit10.Text:=FloatToStr(w[5]); if RadioButton1.checked then z:=0.8*y+1; if RadioButton2.checked then begin if y>0 then z:=1 else if y<0 then z:=-1 else z:=0; end; if RadioButton3.checked then z:=1/(1+exp(-y)); if RadioButton4.checked then z:=Tanh(y); if RadioButton5.checked then z:=exp(-y*y); Label1.Caption:='y = ' + FloatToStr(y); Label1.Refresh; Label13.Caption:='z = ' + FloatToStr(z); Label13.Refresh; if licznik>1000 then if Application.MessageBox('Wykonano 1 000 operacji. Wykonac kolejne?', 'Uwaga', MB_YESNO) = IDNO then exit else licznik:=0; until Abs(e)<=blad end; procedure TForm1.Button2Click(Sender: TObject); var i:Integer; begin a:=StrToFloat(Edit11.Text); p:=StrToFloat(Edit12.Text); x[1]:=StrToFloat(Edit1.Text); x[2]:=StrToFloat(Edit2.Text); x[3]:=StrToFloat(Edit3.Text); x[4]:=StrToFloat(Edit4.Text); x[5]:=StrToFloat(Edit5.Text); w[1]:=StrToFloat(Edit6.Text); w[2]:=StrToFloat(Edit7.Text); w[3]:=StrToFloat(Edit8.Text); w[4]:=StrToFloat(Edit9.Text); w[5]:=StrToFloat(Edit10.Text); y:=0; for i:=1 to 5 do y:=y+x[i]*w[i]; if RadioButton1.checked then z:=0.8*y+1; if RadioButton2.checked then begin if y>0 then z:=1 else if y<0 then z:=-1 else z:=0; end; if RadioButton3.checked then z:=1/(1+exp(-y)); if RadioButton4.checked then z:=Tanh(y); if RadioButton5.checked then z:=exp(-y*y); Label1.Caption:='y = ' + FloatToStr(y); Label13.Caption:='z = ' + FloatToStr(z); e:=p-z; for i:=1 to 5 do begin w[i]:=w[i]+a*x[i]*e; end; y:=0; for i:=1 to 5 do y:=y+x[i]*w[i]; Edit6.Text:=FloatToStr(w[1]); Edit7.Text:=FloatToStr(w[2]); Edit8.Text:=FloatToStr(w[3]); Edit9.Text:=FloatToStr(w[4]); Edit10.Text:=FloatToStr(w[5]); if RadioButton1.checked then z:=0.8*y+1; if RadioButton2.checked then begin if y>0 then z:=1 else if y<0 then z:=-1 else z:=0; end; if RadioButton3.checked then z:=1/(1+exp(-y)); if RadioButton4.checked then z:=Tanh(y); if RadioButton5.checked then z:=exp(-y*y); Label1.Caption:='y = ' + FloatToStr(y); Label13.Caption:='z = ' + FloatToStr(z); end; end.