Algoritmo Genético no problema do cavalo

Definição do cromossomo:
O cromossomo do cavalo foi mais complexo que o canhão. Criei uma classe chamada CASA, onde eu registro dois inteiros, ou um par de coordenadas, e uma classe chamada Gene, onde eu registro uma lista N de casas. No caso de um tabuleiro de xadrez, registramos 64.

Definição da população inicial
A população fica a critério do usuário, sendo editável no inspector. O ideal é que ela seja múltiplo de 4, pois não foram feitos testes para outras situações.

Função de aptidão (fitness)
Cada cavalo possui um registro de repetição das casas. Aí o rank deles fica do menor pro maior. O que repetiu menos casas, tem um rank 0, o que repetiu mais, dentre N indivíduos, tem rank N-1

Método de seleção
Com N indivíduos, nos pegamos N/2, dentre os primeiros colocados.

Método de cruzamento
Para a metade restante da população, repetimos os genes, e para a segunda, não há um cruzamento, mas herança com mutação. Ocorre como descrito no tópico abaixo.

Porém, é muito fácil substituir por, ou adicionar um método de cruzamento por cross over, aonde você gera um indivíduo aleatório, e cruza as casas do gene dele com as casas do gene do pai.

Método de mutação
A mutação é feita na segunda metade da população, aonde deletamos todos os "cromossomos", ou casas até um ponto aonde elas não se repitam, e geramos aleatoriamente novas casas. Se um cavalo andou N casas até repetir a primeira, deletamos todas as outras 64-N casas após, e geramos novas casas aleatórias.

Condição de parada
A condição de parada é dada pelo usuário. Devido á natureza do exercício, eu preferi deixar a reprodução controlada para analisar possíveis erros. É necessário apertar Z, apertar F, esperar os cavalos se moverem, depois R, depois repetir o ciclo até estar satisfeito com o resultado.

É possível alterar a velocidade dos cavalos caminhando, é só aumentar o valor do MoveDelayer (Sim, ele chama delayer, mas acaba acelerando. Ele divide o tempo de espera entre cada passo :p)

Isso é facilmente modificável para atender um padrão automático.

Observações:
O código de movimentação foi meio maluco. Eu fiz um diagrama no papel pra compreender todas as possibilidades de restrição de movimento, e eu posso disponibilizá-los se alguém quiser. Mas é uma ideia bem simples e boba:

Um cavalo pode se mover para quatro casas diferentes, dada uma posição (x,y), desde que x ou y sejam maiores que 1 ((x,y)>(1,1)) e menores que 6 ((x,y)<(6,6)).