January 15, 2021, 06:26:28 PM

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

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
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)
  11.                 XPos = Layer[0].Add("X")
  12.                 YPos = Layer[0].Add("Y")
  13.                 TXPos = Layer[0].Add("DX")
  14.                 TYPos = Layer[0].Add("DY")
  15.                 XDir = Layer[2].Add("MX")
  16.                 YDir = Layer[2].Add("MY")
  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


Comments : none...

 

SimplePortal 2.3.6 © 2008-2014, SimplePortal