Evolutionary algorithms in theory and practice