-
Notifications
You must be signed in to change notification settings - Fork 6
/
paisagem.hpp
164 lines (152 loc) · 7.93 KB
/
paisagem.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
#ifndef PAISAGEM_H
#define PAISAGEM_H
#include "individuo.hpp"
#include<vector>
#include<algorithm>
#include<cstdlib>
#include<cmath>
///** Dimensão maxima do mapa, usada para rotinas de fragmentação TBI */
#define dim 10000 /*Em algum momento pode ser alterado para um argumento do
construtor. No momento não é prioritário. */
//Isto aqui não está aparecendo no doxygen
using namespace std;
/** \brief A classe paisagem implementa o mundo onde os agentes estão.
*
* Esta classe é responsável pela criação dos indivíduos, por manter o relógio do mundo, e por estabelecer a comunicação entre os indivíduos \sa \ref paisagem::update */
class paisagem
{
private:
//propriedades privadas
/** Tamanho do lado da paisagem */
const double tamanho;
/** Número de indivíduos no começo da simulação */
const unsigned long N;
/** Vetor dos indivíduos da populacao */
vector <individuo*> popIndividuos;
/** Número de pixels do lado da paisagem */
const int numb_cells;
/** Tamanho do lada de cada pixel da imagem usada para a classificação da paisagem */
const double cell_size;
/** Forma da paisagem (0 = circular, 1 = quadrada)*/
const int landscape_shape;
/** Tipo de condição de contorno (0 = absortiva, 1 = periódica, 2 = reflexiva) */
const int boundary_condition;
/** Matriz de pixels da paisagem, assume os valores 0 quando o pixel está na matriz e 1 quando está no habitat */
int landscape[dim][dim];//[linha][coluna] temporariamente substituido or valor fixo
/** Matriz com a determinação do fragmento a que cada pixel pertence (0 para matriz; 1, 2, 3, ... para fragmentos */
int patches[dim][dim];
/** Número de fragmentos da paisagem, desconsiderando-se a matriz. */
int numb_patches;
/** Ponteiro para o vetor contendo a área de cada fragmento */
double* patch_area;
/** Posição dos indivíduos no início da simulação (0 = origem; 1 = aleatória com distribuição uniforme na paisagem; 2 = aleatória com distribuição normal na paisagem)*/
const int initialPos;
//metodos privados
void populating(
/** Raio no qual os indivíduos percebem vizinhos. Deve ser menor que o tamanho do mundo */
const double raio,
/** Número de indivíduos no começo da simulação */
const int N,
/** Ângulo de visada dos indivíduos da população */
const double angulo_visada,
/** Passo de caminhada dos indivíduos da população */
const double passo,
/** Taxa de movimentação dos individuos da população */
const double move,
/** Taxa de nascimento de um indivíduo no habitat favorável e sem vizinhos */
const double taxa_basal,
/** Taxa de mortalidade dos indivíduos */
const double taxa_morte,
/** Inclinação da curva de denso-depedência para natalidade */
const double incl_b,
/** Inclinação da curva de denso-depedência para mortalidade */
const double incl_d,
/** Constante que indica quantas vezes a mortalidade basal na matriz é maior que no habitat */
const double death_m,
/** Tipo de densidade (0 = GLOBAL, 1 = LOCAL) */
const int dens_type
);
/** Atualiza a lista de vizinhos de um indivíduo */
void atualiza_vizinhos(individuo * const ind) const;
/** Informa o indivíduo o tipo de habitat (matriz ou habitat) correspondente à sua atual posição, atualizando \ref individuo::tipo_habitat */
void atualiza_habitat(individuo * const ind) const;
/** Informa o indivíduo o fragmento correspondente à sua atual posição, atualizando \ref individuo::patch_label */
void atualiza_patch(individuo * const ind) const;
/** Aplica a condição de contorno após a movimentação */
bool apply_boundary(individuo * const ind); //const; // metodo para aplicação da condicao de contorno
public:
//vector <individuo*> popIndividuos;
/** Contador de quanto tempo já transcorreu no mundo simulado */
double tempo_do_mundo;
//metodos publicos
/** Construtor da classe paisagem */
paisagem(
/** Raio no qual os indivíduos percebem vizinhos. Deve ser menor que o tamanho do mundo */
const double raio,
/** Número de indivíduos no começo da simulação */
const int N,
/** Ângulo de visada dos indivíduos */
const double angulo_visada,
/** Passo de caminhada dos indivíduos */
const double passo,
/** Taxa de movimentação dos indivíduos */
const double move,
/** Taxa de nascimento de um indivíduo no habitat favorável e sem vizinhos */
const double taxa_basal,
/** Taxa de morte dos indivíduos */
const double taxa_morte,
/** Inclinação da curva de denso-depedência para natalidade */
const double incl_b,
/** Inclinação da curva de denso-depedência para mortalidade */
const double incl_d,
/** Número de pixels do lado da paisagem */
const int numb_cells,
/** Tamanho do lada de cada pixel da imagem usada para a classificação da paisagem */
const double cell_size,
/** Forma da paisagem (0 = circular, 1 = quadrada)*/
const int land_shape,
/** Tipo de densidade ("g" = GLOBAL, "l" = LOCAL) */
const int density_type,
/** Constante que indica quantas vezes a mortalidade basal na matriz é maior que no habitat */
const double death_mat,
/** Posição dos indivíduos no início da simulação (0 = origem; 1 = aleatória com distribuição uniforme na paisagem; 2 = aleatória com distribuição normal na paisagem)*/
const int inipos,
/** Condição de contorno (0 = absortiva, 1 = periódica, 2 = reflexiva)*/
const int bound_condition,
/** Vetor de cobertura de habitat na paisagem */
int scape[]
); //construtor
/** Atualiza as */
void update();//atualizador
/** Seleciona o individuo com menor tempo até o proximo evento para realizar uma ação */
int sorteia_individuo();
/** Após a seleção do indivíduo que realizará a ação, sorteia uma das três ações possíveis de acordo com suas respectivas taxas e retorna a ação sorteada para a paisagem
* (0 = morte, 1 = nascimento, 2 = movimentação) */
int sorteia_acao(const int lower){return this->popIndividuos[lower]->sorteia_acao();}
/** Realiza a ação sorteado do indivíduo selecionado. Além disso informa se o indivíduo sai da paisagem por emigração */
bool realiza_acao(int acao, int lower);//vai pegar os tempos de cada individuo e informa qual foi o escolhido e manda ele fazer */
/** Atualiza o contador de tempo, somando o tempo para o evento do indivíduo selecionado */
void atualiza_tempo(const int lower){this->tempo_do_mundo = this->tempo_do_mundo + this->popIndividuos[lower]->get_tempo();}
/** Retorna o número total de indivíduos na paisagem */
const int conta_individuos() const{return popIndividuos.size();}
/** Retorna um vetor contendo todos os indivíduos na paisagem */
individuo* get_individuos(int i) const {return popIndividuos[i];}
/** Retorna o número de espécies existentes na paisagem \ref TBI */
const int conta_especies() const;
/** Retorna o tamanho da paisagem (definido no construtor) */
const double get_tamanho() const {return this->tamanho;}
/** Calcula a distância entre dois indivíduos */
double calcDist(const individuo* a1, const individuo* a2) const;
/** Calcula a densidade de vizinhos de um indivíduo */
double calcDensity(const individuo* ind1) const;
/** Retorna false se o indivíduo estava no ambiente no passo de tempo 0, e true se ele nasceu durante a simulação.
* Usado para pintar os indivíduos nascidos de um cor diferente dos individuos originais */
const bool nascido(individuo * const ind) const {return ind->get_id() > this->N;}
/** Função recursiva utilizada para encontrar os freagmentos da paisagem */
void find_patches(int x, int y, int current_label);
/** Retorna o número de fragmentos da paisagem */
int get_numb_patches(){return numb_patches;}
/** Retorna a área de um dado fragmento da paisagem */
double get_patch_area(int i) const {return this->patch_area[i];}
};
#endif // PAISAGEM_H