Grammatical evolution  (see O'Neil, M. and 
        Ryan, C.  (2003,ISBN:1-4020-7444-1)) uses decoders to 
        convert linear (binary or integer genes) into programs.  
        In addition, automatic determination of codon precision 
        with a limited rule choice bias is provided.
        For a recent survey of grammatical evolution, 
        see Ryan, C., O'Neill, M., and Collins, J. J. (2018)
        <doi:10.1007/978-3-319-78717-6>.

An implementation of
        the representation-dependent gene level operations of grammar-based
        genetic programming with genes which are derivation trees
        of a context-free grammar: Initialization of a gene with a 
        complete random derivation tree, decoding of a derivation tree.
        Crossover is implemented by exchanging subtrees. Depth-bounds
        for the minimal and the maximal depth of the roots of the subtrees
        exchanged by crossover can be set. 
        Mutation is implemented by replacing a subtree by a random subtree. 
        The depth of the random subtree and the insertion node are 
        configurable. For details, 
        see Geyer-Schulz (1997, ISBN:978-3-7908-0830-X).

An implementation of 
        representation-dependent gene level operations for
        genetic algorithms with genes which represent permutations: 
        initialization of genes, mutation and crossover.
        The crossover operation provided is position-based crossover 
        (Syswerda, G., Chap. 21 in Davis, L. (1991, ISBN:0-442-00173-8). 
        For mutation, several variants are included: Order-based mutation
        (Syswerda, G., Chap. 21 in Davis, L. (1991, ISBN:0-442-00173-8), 
        randomized Lin-Kernighan heuristics
        (Croes, G. A. (1958) <doi:10.1287/opre.6.6.791> and
         Lin, S. and Kernighan. B. W. (1973) 
        <doi:10.1287/opre.21.2.498>), 
        and randomized greedy operators.
        A random mix operator for mutation selects a mutation variant 
        randomly.

This collection of gene representation-independent functions 
   implements the population layer of extended evolutionary and genetic 
   algorithms and its support. The population layer consists of functions 
   for initializing, logging, observing, evaluating a population of genes, 
   as well as of computing the next population. For parallel evaluation of a 
   population of genes 4 execution models - named Sequential, MultiCore, 
   FutureApply, and Cluster - are provided. They are implemented by 
   configuring the lapply() function. The execution model FutureApply can be 
   externally configured as recommended by Bengtsson (2021) 
   <doi:10.32614/RJ-2021-048>. Configurable acceptance rules and cooling 
   schedules (see Kirkpatrick, S., Gelatt, C. D. J, and Vecchi, M. P. (1983) 
   <doi:10.1126/science.220.4598.671>, and Aarts, E., and Korst, J. 
   (1989, ISBN:0-471-92146-7) offer simulated annealing or greedy randomized 
   approximate search procedure elements. Adaptive crossover and mutation 
   rates depending on population statistics generalize the approach of 
   Stanhope, S. A. and Daida, J. M. (1996, ISBN:0-18-201-031-7).