No es habitual que se modifique el operador de cruzamiento utilizado en una ejecución. No me queda claro cuál sería la necesidad, ni cómo identificarían situaciones donde sea necesario/conveniente modificar el operador ("según en qué generación está o cuanto tiempo haya pasado").
De cualquier manera, no es complicado aplicar más de un operador dependiendo de un parámetro, o inclusive aplicar uno de dos (o de varios) en forma probabilística. Simplemente hay que definir un operador por parte del usuario que en caso que el parámetro (o el número aleatorio sorteado) tenga un determinado valor se invoque a un operador de cruzamiento y en otro caso a otro diferente.Esto también se puede hacer "a fuego" (en el archivo req.cc) en el for que ejecuta cross(*sols[i],*sols[i+1]);
Saludos
SN