Ya encontré el problema:
en ruleta(), devuelves a menudo como cromosoma "" (cromosoma vacío).
Cuando devuelves uno de estos, al entrar en cruce() se buscan subcadenas.
La llamada a substr casca con out_of_range si el indice inicial está fuera de la cadena. En la cadena vacía, al acceder como índice a 'punto' que se supone mayor que 0, casca.
Por cierto, es mejor si pones la línea 13 así:
Código C:
Ver original#define NUM_ALE ((float)rand() / ((float)RAND_MAX+1))
para que no se queje :)