fitness function and termnate function are PRIVATE