sexta-feira, agosto 26, 2005

Depois do descanso...

...pois é, após cerca de 13 dias de paragem por causa de ser o mês de Agosto, com o meu aniversário pelo meio e mais umas quantas ocorrências muito dificilmente iria ter tempo e disponibilidade mental para voltar a pegar nisto.
Da última vez que tinha pegado nisto estava com uns problemas de, ao, utilizar o One-Max, porque raio é que a população (ou melhor, o vector população) não convergia para frequências (estou a usar frequências absolutas) idênticas ao valor da população (estive a experimentar com cromossomas de comprimento 10 e população 40). Estou a fazer o cliente ir buscar um VP (vector-população) ao WS (Web Service), e correr apenas uma iteração do CGA (Compact Genetic Algorithm), de modo, que podia ir acompanhando passo a passo a intercomunicação entre o cliente e o servidor. Aqui um pequeno reparo: ao contrário de pôr o número máximo de iterações a ser executado em cada ciclo de obter/enviar a ser indicado pelo servidor, como era suposto a princípio, estou a fornecer esse limite directo no código do cliente. Por agora, o servidor de WS limita-se a fazer "eco" do VP que o cliente lhe envia, mandando, sem quaisquer alterações, de novo, o VP que tinha acabado de receber. Até agora, ainda não pus mais do que um cliente a correr ao mesmo tempo. Espero vir a fazê-lo em breve, com a ajuda do Multi-Threading de Java.
Mas,como estava dizendo, a dificuldade que vinha tento prendia-se com o facto de a população convergir precocemente antes do que era suposto, por exemplo, para um VP de 10 posições e população de tamanho 40, começa normalmente com:

20;20;20;20;20;20;20;20;20;20

mas depois em vez de dar no fim

40;40;40;40;40;40;40;40;40;40

estava a dar:

20;28;20;36;26;35;19;20;20;32

Achei estranho, e decidi investigar, descobri então, que eram gerados dois indivíduos do vector população, em cada iteração, estavam sempre a ser gerados os mesmos indivíduos a partir do vector população. Tal devia-se ao facto de o gerador de o números aleatórios estar sempre a ser inicializado com a mesma seed, o que fiz para resolver foi pôr uma seed diferente de cada vez que o algoritmo corre, seed essa dada pela hora do sistema, através da função System.currentTimeMillis(). Assim resolveu os problemas, pelo menos, por enquanto. Os meus passos seguintes deverão ser em princípio compreender melhor o Axis, para pôr o WS a devolver dois objectos em vez de apenas um, que é o necessário para se obter não só o VP mas o também o parâmetro m que indica o número de gerações que o cliente deve correr antes de devolver o VP ao servidor.