Trabalho II: Simulação de um Ecossistema de Raposas e Coelhos

Objectivo

Permitir que os alunos adquiram maior sensibilidade e conhecimento prático da paralelização de uma aplicação usando um dos paradigmas apresentado nas aulas.

Descrição

O problema que se pretende resolver consiste em simular a evolução, ao longo de várias gerações, de um ecossistema em que co-habitam duas espécies diferentes de animais cuja existência é mutuamente dependente: raposas e coelhos.

A simulação deve ser realizada sobre uma matriz com LIN linhas e COL colunas, onde as células da matriz representam o espaço do ecossistema sobre o qual as raposas e os coelhos se movimentam. Em cada geração, cada espaço pode estar livre ou ocupado. Um espaço pode ser ocupado por um coelho, por uma raposa ou por uma rocha. A matriz é inicializada com uma população inicial de coelhos, raposas e rochas colocados aleatoriamente. Ao longo das gerações, cada população evolui de acordo com um determinado conjunto de regras. A simulação consiste em partir das populações iniciais e ir construíndo as sucessivas gerações da populações de coelhos e raposas até um limite previamente estipulado.

Regras para os Coelhos

Regras para as Raposas

Regras para as Rochas

Critério para Seleccionar Espaços Adjacentes

Resolução de Conflitos

Implementação

Comece por implementar uma versão sequencial do problema e apenas depois deve tentar implementar uma primeira versão paralela. Pode desenvolver versões paralelas para memória partilhada e/ou distribuída. Uma primeira estratégia poderá ser ter cada processo responsável por calcular as movimentações (nova geração) de uma parte da matriz. Notar que no final de cada geração pode ser necessário sincronizar informação com os processos adjacentes sobre os coelhos e/ou raposas que se movimentaram do espaço de um processo para o espaço dos processos adjacentes. Note ainda que a divisão da matriz pode ser feita de forma estática dividindo-a na horizontal, na vertical ou em ambas as dimensões. A divisão estática da matriz tem o problema da carga poder ser diferente para cada processo ao longo do tempo. Um melhor balanceamento da carga poderá ser conseguido através da divisão dinâmica do espaço da matriz sempre que se atinge determinado número de gerações.

Input

A aplicação a desenvolver deverá ler do standard-input um conjunto de linhas sucessivas com os valores dos parâmetros de configuração e estado inicial do ecossistema, com a seguinte ordem:

Um exemplo de input:
3
6
3
100
10 10
ROCHA 0 0 
COELHO 0 2
ROCHA 0 5 
COELHO 2 5
RAPOSA 9 9

Output

Como resultado a aplicação deverá escrever para o standard output a descrição das populações finais, seguindo o mesmo formato de descrição dos objectos que representavam a descrição das populações iniciais. Segue-se um exemplo de output, que não tem relação com a simulação do exemplo de input.

MATRIZ 10 10
ROCHA 0 0 
ROCHA 0 5 
COELHO 1 2
COELHO 2 2
COELHO 2 5
RAPOSA 2 9
RAPOSA 5 2
RAPOSA 5 9
COELHO 7 5

O Que Entregar?

Um ficheiro .tar que inclua: O código deve compilar e executar nas máquinas disponibilizadas para o efeito. Uma boa estruturação e legibilidade do código será valorizada.

Prazos

O trabalho deve ser entregue via web até às 12h horas do dia 5 de Janeiro de 2011, sendo a sua demonstração feita na semana seguinte em horário a definir.