ADDED: initializations.
TODO: mutation
ADDED: a working(but naive) version