Declare Visual()
Declare Summ()
Declare.f Activation(x.f)
Declare Weight()
Declare ReSumm(Boolean)
Declare Obychalka()
Structure result
result.f
error.f
weight_delta.f
EndStructure
Global Dim Layer_0.result(3)
Global Dim Layer_1.result(4)
Global Dim Layer_2.result(2)
Global Dim Layer_3.result(1)
Global Dim LayerW_1.f(3,4)
Global Dim LayerW_2.f(4,2)
Global Dim LayerW_3.f(2,1)
Global fix_min.f = 1
Global fix_max.f = 0
If OpenWindow(0, 0, 0, 700, 400, "NS", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CheckBoxGadget(0,5,90, 170,20,"пешеход намерен переходить",#PB_CheckBox_ThreeState)
CheckBoxGadget(1,5,190,170,20,"ПОЛИЦИЯ",#PB_CheckBox_ThreeState)
CheckBoxGadget(2,5,290,170,20,"зеленый светофор",#PB_CheckBox_ThreeState)
ButtonGadget(3,540,175,100,20,"УСТУПИТЬ")
ButtonGadget(4,540,205,100,20,"НЕ УСТУПАТЬ")
ButtonGadget(5,540,300,100,20,"ОБУЧЕНИЕ")
TextGadget(6,340,330,300,20,"Задача: уступить пешеходу только при полиции", #PB_Text_Center)
Weight()
Summ()
Visual()
Repeat
Select WaitWindowEvent(#True)
Case #PB_Event_Gadget
Select EventGadget()
Case 0
Summ():Visual()
Case 1
Summ():Visual()
Case 2
Summ():Visual()
Case 3
ReSumm(1):Summ():Visual()
Case 4
ReSumm(0):Summ():Visual()
Case 5
Obychalka():Visual()
EndSelect
Case #PB_Event_CloseWindow
Exit = #True
EndSelect
Until Exit
EndIf
Procedure.f Activation(result.f)
result = 1/(1+Pow(3,-result))
ProcedureReturn result
EndProcedure
Procedure Weight()
For i = 0 To 3
For index = 0 To 2
LayerW_1(index,i) = i-1.5
Next
Next
For i = 0 To 1
For index = 0 To 3
LayerW_2(index,i) = i-0.5
Next
Next
For i = 0 To 0
For index = 0 To 1
LayerW_3(index,i) = 1
Next
Next
EndProcedure
Procedure Visual()
If StartDrawing(WindowOutput(0))
For X = 0 To 2
For Y = 0 To 3
If LayerW_1(X,Y)>0
For i=0 To 20
Line(200,100+X*100,100,Y*100-50-X*100+i,RGB(0,0,LayerW_1(X,Y)*255))
Next
Else
For i=0 To 20
Line(200,100+X*100,100,Y*100-50-X*100+i,-RGB(LayerW_1(X,Y)*255,0,0))
Next
EndIf
Next
Circle(200,100+X*100,25,RGB(0,0,0))
Circle(200,100+X*100,20,RGB(Layer_0(X)\result*255,Layer_0(X)\result*255,Layer_0(X)\result*255))
Next
For X = 0 To 3
For Y = 0 To 1
If LayerW_2(X,Y)>0
For i=0 To 20
Line(300,50+X*100,100,Y*100+99-X*100+i,RGB(0,0,LayerW_2(X,Y)*255))
Next
Else
For i=0 To 20
Line(300,50+X*100,100,Y*100+99-X*100+i,-RGB(LayerW_2(X,Y)*255,0,0))
Next
EndIf
Next
Circle(300,50+X*100,25,RGB(0,0,0))
Circle(300,50+X*100,20,RGB(Layer_1(X)\result*255,Layer_1(X)\result*255,Layer_1(X)\result*255))
Next
For X = 0 To 1
For Y = 0 To 0
If LayerW_3(X,Y)>0
For i=0 To 20
Line(400,150+X*100,100,Y*100+50-X*100+i,RGB(0,0,LayerW_3(X,Y)*255))
Next
Else
For i=0 To 20
Line(400,150+X*100,100,Y*100+50-X*100+i,-RGB(LayerW_3(X,Y)*255,0,0))
Next
EndIf
Next
Circle(400,150+X*100,25,RGB(0,0,0))
Circle(400,150+X*100,20,RGB(Layer_2(X)\result*255,Layer_2(X)\result*255,Layer_2(X)\result*255))
Next
Circle(500,200,25,RGB(0,0,0))
Circle(500,200,20,RGB(Layer_3(0)\result*255,Layer_3(0)\result*255,Layer_3(0)\result*255))
StopDrawing()
EndIf
EndProcedure
Procedure Obychalka()
For i = 0 To 100000
Fix = Random(7)
Select Fix
Case 0
SetGadgetState(0,0)
SetGadgetState(1,0)
SetGadgetState(2,0)
Summ():ReSumm(0)
Case 1
SetGadgetState(0,1)
SetGadgetState(1,0)
SetGadgetState(2,0)
Summ():ReSumm(0)
Case 2
SetGadgetState(0,1)
SetGadgetState(1,1)
SetGadgetState(2,0)
Summ():ReSumm(1)
Case 3
SetGadgetState(0,1)
SetGadgetState(1,1)
SetGadgetState(2,1)
Summ():ReSumm(0)
Case 4
SetGadgetState(0,0)
SetGadgetState(1,1)
SetGadgetState(2,1)
Summ():ReSumm(0)
Case 5
SetGadgetState(0,0)
SetGadgetState(1,0)
SetGadgetState(2,1)
Summ():ReSumm(0)
Case 6
SetGadgetState(0,1)
SetGadgetState(1,0)
SetGadgetState(2,1)
Summ():ReSumm(0)
Case 7
SetGadgetState(0,0)
SetGadgetState(1,1)
SetGadgetState(2,0)
Summ():ReSumm(0)
EndSelect
Next
SetGadgetState(0,0)
SetGadgetState(1,0)
SetGadgetState(2,0)
Summ()
EndProcedure
Procedure Summ()
For i = 0 To 2
Layer_0(i)\result = GetGadgetState(i)
Next
For i = 0 To 3
Layer_1(i)\result = 0
For index = 0 To 2
Layer_1(i)\result = Layer_1(i)\result + (LayerW_1(index,i)*Layer_0(index)\result)
Next
Layer_1(i)\result = Activation(Layer_1(i)\result)
Next
For i = 0 To 1
Layer_2(i)\result = 0
For index = 0 To 3
Layer_2(i)\result = Layer_2(i)\result + (LayerW_2(index,i)*Layer_1(index)\result)
Next
Layer_2(i)\result = Activation(Layer_2(i)\result)
Next
For i = 0 To 0
Layer_3(i)\result = 0
For index = 0 To 1
Layer_3(i)\result = Layer_3(i)\result + (LayerW_3(index,i)*Layer_2(index)\result)
Next
Layer_3(i)\result = Activation(Layer_3(i)\result)
Next
EndProcedure
Procedure ReSumm(Boolean)
Accuracy.f = 0.1
For i = 0 To 0
Layer_3(i)\error = Boolean - Layer_3(i)\result
Layer_3(i)\weight_delta = Layer_3(i)\error * (Layer_3(i)\result * (1 - Layer_3(i)\result))
For index = 0 To 1
LayerW_3(index,i) = LayerW_3(index,i) + Layer_3(i)\weight_delta * Layer_2(index)\result*Accuracy
Layer_2(index)\error = LayerW_3(index,i) * Layer_3(i)\weight_delta
Next
Next
For i = 0 To 1
Layer_2(i)\weight_delta = Layer_2(i)\error * (Layer_2(i)\result * (1 - Layer_2(i)\result))
For index = 0 To 3
LayerW_2(index,i) = LayerW_2(index,i) + Layer_2(i)\weight_delta * Layer_1(index)\result*Accuracy
Layer_1(index)\error = LayerW_2(index,i) * Layer_2(i)\weight_delta
Next
Next
For i = 0 To 3
Layer_1(i)\weight_delta = Layer_1(i)\error * (Layer_1(i)\result * (1 - Layer_1(i)\result))
For index = 0 To 2
LayerW_1(index,i) = LayerW_1(index,i) + Layer_1(i)\weight_delta * Layer_0(index)\result*Accuracy
Next
Next
EndProcedure