method train example = 
         (* find out which trainign radius to use *)
         let radius' =
            (* when a policy is set, that is used *)
            match radius_policy with
               Some policy -> policy generation
            | None ->radius 
         in
         let alpha' =
            (* Same as above for the learning ratio *)
            match alpha_policy with
               Some policy -> policy generation
            | None -> alpha
         in
         
         (* find the best matching node for the example *)
         let best = self#find_node example in
         
         (* move all the nodes in the neighborhood *)
         self#move_node best.x best.y alpha' example;
         for distance = 1 to radius' do
            let ratio = (1.0-. (float_of_int distance) /. (float_of_int radius')) **2.0in
            for x = 0 to distance-1  do
               self#move_node (best.x-x) (best.y-distance+x) (alpha' *. ratio) example;
               self#move_node (best.x-distance+x) (best.y+x) (alpha' *. ratio) example;
               self#move_node (best.x+x) (best.y+distance-x) (alpha' *. ratio) example;
               self#move_node (best.x+distance-x) (best.y-x) (alpha' *. ratio) example;
            done
         done;
         
         generation <- generation +1