January 15, 2021, 06:26:28 PM

### Author Topic: [bmx] AnnLib Example Code #1 by AntonyWells [ 1+ years ago ]  (Read 558 times)

#### BlitzBot

• Jr. Member
• Posts: 1
##### [bmx] AnnLib Example Code #1 by AntonyWells [ 1+ years ago ]
« on: June 29, 2017, 12:28:42 AM »
Title : AnnLib Example Code #1
Author : AntonyWells
Posted : 1+ years ago

Description : Demonstrates how the network can be trained to 'chase' a fellow 'dot'.

It takes four double inputs, (x,y) (dx,dy) and produces a 2d vector output (mx,my)

The network uses backpropagation learning, which uses error correction based delta learning.

Code :
Code: BlitzMax
1. #DEMO_DotChaser
2.
3. Type NeuralNetwork_Chaser Extends NeuralNetworkBackProp
4.
5.         Field XPos:Neuron, YPos:Neuron, TXPos:Neuron, TYPos:Neuron
6.         Field XDir:Neuron, YDir:Neuron
7.
8.         Method New()
9.
10.                 InitBackProp(8)
17.                 InitNetwork()
18.
19.
20.         End Method
21.
22.
23.
24.         Method TrainNetwork:Double()
25.
26.                 For i = 0 Until 300
27.
28.                         sx:Double = Rnd(0, 1)
29.                         sy:Double = Rnd(0, 1)
30.                         dx:Double = Rnd(0, 1)
31.                         dy:Double = Rnd(0, 1)
32.
33.                         mx:Double = 0.5 + (dx - sx) * 0.5
34.                         my:Double = 0.5 + (dy - sy) * 0.5
35.
36.                         XPos.Output = sx
37.                         YPos.Output = sy
38.                         TXPos.Output = dx
39.                         TYPos.Output = dy
40.
41.                         XDir.Target = 1.0 - mx
42.                         YDir.Target = 1.0 - my
43.
44.                         For j = 0 Until 250
45.
46.                                 Run()
47.                                 LearnBP()
48.
49.                         Next
50.
51.
52.                 Next
53.
54.         End Method
55.
56.         Method DebugLayer(i:Int, dx:Float, dy:Float)
57.
58.                 DrawText("Layer:" + i, dx, dy)
59.
60.                 dy:+20
61.
62.                 For n = 0 Until Layer[i].NC
63.
64.                         DrawText "N.Output=" + Layer[i].N[n].Output + " Err:" + Layer[i].N[n].Err,dx,dy
65.                         dy:+20
66.                         If Layer[i + 1] <> Null
67.                         For n2 = 0 Until Layer[i + 1].NC
68.
69.                                 DrawText "W" + n2 + ":" + Layer[i].N[n].Weight[n2], dx, dy
70.
71.                                 dy:+20
72.                         Next
73.                         EndIf
74.
75.                         DrawText ("N.F=" + F(Layer[i].N[n].Output), dx, dy)
76.
77.                         dy:+20
78.
79.                 Next
80.
81.         End Method
82.
83. End Type
84.
85.
86. SeedRnd MilliSecs()
87. Local dots:Int = 1000
88.
89. Global mDot:Dot[dots]
90.
91. Local ldot:Dot = Null
92.
93. For i = 0 Until dots
94.
95.         mDot[i] = New Dot
96.         If ldot <> Null
97.
98.                 mDot[i].Target = ldot
99.
100.         End If
101.         ldot = mDot[i]
102.
103. Next
104.
105. Local mouseDot:Dot = New Dot
106.
107. Local pd:Dot = mDot[dots - 1]
108. pd.Target = mouseDot
109.
110.
111. Type Dot
112.
113.         Field ChaserBrain:NeuralNetwork_Chaser = New NeuralNetwork_Chaser
114.         Field X:Double, Y:Double
115.
116.         Field Target:Dot
117.
118.         Method New()
119.
120.                 x = Rnd(0, GraphicsWidth())
121.                 y = Rnd(0, GraphicsHeight())
122.
123.         End Method
124.
125.         Method Update()
126.
127.                 If Target = Null Return
128.
129.                 ChaserBrain.XPos.Output = X / Double(GraphicsWidth())
130.                 ChaserBrain.YPos.Output = Y / Double(GraphicsHeight())
131.
132.                 ChaserBrain.TXPos.Output = Target.X / Double(GraphicsWidth())
133.                 ChaserBrain.TYPos.Output = Target.Y / Double(GraphicsHeight())
134.
135.                 ChaserBrain.Run()
136.
137.                 Print "Err:" + ChaserBrain.Error(2)
138.
139.                 X:+(-1.0 + ChaserBrain.XDir.Output * 2.0) * 4
140.                 Y:+(-1.0 + ChaserBrain.YDir.Output * 2.0) * 4
141.
142.         End Method
143.
144. End Type
145.
146.
147.
148. While Not KeyDown(KEY_ESCAPE)
149.
150.         Cls
151.
152.         mouseDot.x = MouseX()
153.         mouseDot.y = MouseY()
154.
155.         SeedRnd 234
156.
157.         For i = 0 Until dots
158.
159.
160.                 If MouseDown(1)
161.
162.                         mDot[i].Update()
163.
164.                 End If
165.
166.                 SetColor Rnd(0, 255), Rnd(0, 255), Rnd(0, 255)
167.
168.                 DrawRect mDot[i].X - 8, mDot[i].Y - 8, 16, 16
169.
170.         Next
171.
172.         SetColor 255, 255, 255
173.
174.         DrawRect mouseDot.x - 8, mouseDot.y - 8, 16, 16
175.
176.         Flip
177.
178. Wend