domingo, setembro 11, 2005

Vai indo tudo nos eixos...

Enfim, o projecto tem vindo a evoluir perfeitamente dentro dos eixos: desenvolvi um cliente de WS que lança varias threads, sendo possível assim simular um efeito parecido ao caso real em que pudessemos ter muitos clientes a correr em máquinas diferentes em simultâneo. Como não tenho possibilidades (nem remotas) de poder vir a testar o trabalho em semelhantes condições, as threads em Java, servem perfeitamente para esse efeito.E o JAVA, como linguagem recente que é, já suporta threading de raíz, e assim, em vez de termos um único programa, que segue a sequência predeterminada das linhas do código, é possível termos diferentes cópias do mesmo programa, a correrem como que ao mesmo tempo (como o meu portátil só tem um processador, o multiprocessamento real é ilusório). Assim, pus várias threads a descarregar o vector população do WS, usando a função já conhecida DownloadPopulationVector. Quando o trabalho é completado ao fim do número de iterações especificado pelo WS, o vector é transmitido "de volta" ao WS, que assim actualiza o vector população que detém para o último que lhe foi transmitido pelo último cliente (que neste caso é uma thread). Os testes que fiz foram muito simples, usando sempre a função One-Max, testei até ao máximo de 3 threads, com um limite de 5 e 10 iterações entre ciclos envio/pedido do vector população. Fiz algumas experiências, incluindo colocar cada thread a arrancar depois de outra com um intervalo de dois segundos entre lançamentos sucessivos e os resultados estão perfeitamente dentro do esperado. Andei a variar o tamanho da população e o comprimento da população por forma a aumentar o tempo que leva para resolvar o problema. Mas como a função é a one-max, é extremamente simples de resolver. Penso que o trabalho só deverá começar a dar resultados úteis a partir do momento em que deverei começar a aplicação o algoritmo genético compacto a algum tipo de aplicação em que o tempo dispendido no cálculo da função de avaliação (em inglês, fitness) seja de tal forma oneroso que faça com que valha realmente a pena usar o resultado destre trabalho para algo de interesse no futuro.Começam é a surgir na minha mente algumas questões que realmente devem importar como por exemplo:

  • uma sugestão dada pelo artigo que estou a seguir na implementação refere que o vector, depois de processado, deve ser reenviado de volta à fonte apenas com as diferenças entre o vector original e o novo prestes a ser enviado. Ora pessoalmente em que consiste fazer a diferença entre o novo vector e o antigo em termos de tamanho ? Como a estrutura de dados que estou a usar é basicamente um array, de que forma codifico as diferenças entre dois arrays? De certeza não será enviando apenas as diferenças literalmente entre as posições do vector população que viram o seu valor de frequência ser alterado. Um exemplo para clarificar aquilo que estou a pensar:
    Suponhamos que originalmente o cliente descarrega do Web Service o seguinte vector população, correspondente a um problema em que se um cromossoma de cinco posições para uma população total de 20 elementos:

    10;10;10;10;10


    O cliente então começa a correr o algoritmo para um problema qualquer, que pode ser o one-max, e depois, ao terminar o número de iterações requerido envia o vector já com este aspecto:

    10;14;16;12;10


    A diferença "literal", posição a posição, entre os dois seria:


    0;4;6;2;0


    Em termos de memória, o efeito ganho em usar semelhante representação é nulo, de forma que, enviar o vector população só com as diferenças ou tal e qual como está, vai acabar por dar na mesma.

  • Outra forma de resolver o problema anterior seria enviar apenas as posições que foram alteradas, mas duvido que tal tenha algo de útil, porque duvido que sejam muitas as posições que fiquem idênticas entre o princípio e o fim do ciclo. E, mesmo utilizando semelhante esquema, teria que indicar os índices das posições efectivamente modificadas



Em princípio, ainda vou ver se descubro neste enorme manancial de informação que se chama internet duas coisas: uma possível solução para o problema anterior e encontrar um problema que use o CGA de forma que seja digno de ser implementado neste projecto, ou melhor, esse problema é que devia tornar o meu trabalho digno de obter alguma resultado prático. A ver vamos...