My Go program relies on machine learning to improve itself. An empirical approach
would be to have a population of versions of a Go program, let the versions compete against
each other, and choose the best versions to 'breed' and improve the population. Perhaps
use genetic algorithms to exchange 'material' between the versions.

The advantage of this approach is that it is empirical, one doesn't need to collect
training positions. The disadvantage is how long it would take even if the versions
compete on smaller size boards to some extent. Unless the population is large there's
a likelihood of inbreeding, the versions would only know how to play against the
way they play. So I didn't go down this route.

Instead my Go program is taught much like a human player is taught, against sample
problems and from collections of games. I have been typing in problems from books
I own - though my books tend to be old and what's considered good changes. I also
rely on game collections like ''GoGoD'.

There are challenges in using human Go games as they stand for teaching, one is the games will
contain mistakes. I'm hoping that the good moves will outweight the bad moves, but
also that reading ahead will also compensate for any bad moves considered in
particular positions.