It turned out the reason the ANN was performing similarly to the random agent was more simple than it seemed - the ANN agent was in fact instantiating Agent.class rather than ANNAgent.class, due to an inherited clone(). So after writing a new clone method I spent a couple of hours coding the training method, and another hour or two working out the bugs.
Then I spent about 4 hours watching the thing run again and again, trying to figure out the one last bug. It just didn't make sense...
...until I woke up at 7am with the answer. One missing section of the program's flow, all ready to go. So, with the answer in mind, I could finally rest peacefully, right? Could I buggery. I had to cover my window with a towel before I could nod off for another hour or so.
So, that done, today so far has been (and will be) spent on the document writing I wanted to start yesterday.