I am building a simulation where you have 'Agents' distributed over a rather large landscape. Because the number of Agents is small, compared to the size of the landscape, I use the PIC approach where the landscape is divided into rather large cells and every cell can contain multiple agents - in contrast to a classical grid based approach. This should speed up spatial analysis.
I am asking whether there is a way to improve the code I came up with:
Agents contain an iterator to the node in the cell and a ptr to the cell containing the node
class Agent;
typedef std::list <Agent*> CELL;
class Agent {
public:
//...stuff...
CELL::iterator cell_iter;
CELL*cell_ptr;
};
class Grid {
public:
Grid(int dimx,int dimy,int cellsize);
CELL *GetCell(double x,double y);
private:
std::vector <std::vector<CELL>> grid_;
int dimx_,dimy_,cellsize_,ncellx_,ncelly_;
};
To add a new individual:
std::list <Agent> population;
//..stuff...
Agent seed(pos_x,pos_y,seed_type,10.1); // create a local agent
population.push_back(std::move(seed));
Agent *agent=&population.back()
CELL *cell=GetCell(agent->x_,agent->y_); // get the cell for the agents pos
cell->push_back(agent); // add the agents ptr to the cell
agent->cell_ptr=cell; // save the agents cell to the agent
agent->cell_iter=--cell->end(); // save an iterator to the actual node
To delete an individual
auto iter=population.begin();
//...stuff...
(*iter).cell_ptr->erase((*iter).cell_iter); // erase the ptr to the agent from the cell
iter=population.erase(iter);