private void cloneCells()
	{
		NetworkCell currentCell; // Current network cell being cloned
		NetworkCell clones[] = new NetworkCell[numClones]; // Clonal pool
		int best; // Array index of the current best clone in the clonal pool

		// All cells in the network undergo cloning, mutation and selection
		// Only the clones of the cell are mutated, with the parent remaining
		// unchanged, thus this is an elitest strategy

		for (int i = 0; i < cellList.size(); i++)
		{
			currentCell = cellList.get(i);
			best = 0; // Set the best clone to be the first by default

			// A set number of clones is produced dependent on the numClones
			// parameter. All clones are mutated proportionally to fitness and
			// evaluated against the optimistaion function. A note is made of
			// the
			// clone with the highest fitness in the clonal pool

			for (int j = 0; j < numClones; j++)
			{
				clones[j] = (NetworkCell) currentCell.clone();
				clones[j].mutate();
				clones[j].evaluate();

				if(clones[j].getFitness() > clones[best].getFitness())
				{
					best = j;
				}
			}

			// If the best clone produced has a better fitness than its parent
			// cell
			// then the clone replaces the parent in the network. If it is not,
			// then
			// the parent remains in the network

			if(clones[best].getFitness() > currentCell.getFitness())
			{
				cellList.set(i, clones[best]);
			}
		}
	}