public override SwarmParticleMesh UpdateSwarmPositions(SwarmParticleMesh particles)
        {
            SwarmParticleMesh newMesh = new SwarmParticleMesh(particles);

            for (int i = 0; i < particles.GetRowCount(); i++)
            {
                for (int j = 0; j < particles.GetColumnCount(); j++)
                {
                    List<SwarmParticle> neighbourhood = particles.GetListFromCell(i, j);
                    if (neighbourhood.Count > 0)
                    {

                        neighbourhood.OrderBy(n => n.GetCurrentFitness());
                        SwarmParticle fittestNeighbour = neighbourhood.Last();
                        neighbourhood.Remove(fittestNeighbour);
                        foreach (var particle in neighbourhood)
                        {
                            UpdateParticle(particle, fittestNeighbour);
                            newMesh.AddParticle(particle);
                        }
                        UpdateParticle(fittestNeighbour, fittestNeighbour);
                        newMesh.AddParticle(fittestNeighbour);
                    }
                }
            }
            return newMesh;
        }
        public SwarmParticleMesh(SwarmParticleMesh oldParticleMesh)
        {
            CellSize = oldParticleMesh.GetCellSize();
            GridHeight = oldParticleMesh.GetGridHeight();
            GridWidth = oldParticleMesh.GetGridWidth();

            RowCount = oldParticleMesh.GetRowCount();
            ColumnCount = oldParticleMesh.GetColumnCount();

            InitialiseMesh();
        }