public void optimise()
	{
		int iter = 0; // Iteration count
		int preNumCells = 0; // Number of network cells in the previous
							 // iteration
		boolean proceed; // Loop stopping condition variable

		// Add the initial number of cells to the network
		addCells(numInitCells);

		// Iterate until a stopping condition is met
		do
		{
			iter++;

			// Perform clonal selection and network cell interactions
			clonalSelection();
			networkInteractions();

			// Save the cells in the current iteration in the DataManager
			dataManager.addGeneration(this, cellList);

			// System.out.println("OptAinet.optimise() -  iter: " + iter +
			// " out of: " + maxIter);

			// If maximum iteration reached, or there has been no change in the
			// number
			// of cells in the network since the last iteration, then terminate
			// the loop
			// Else continue looping, making a note of the number of cells in
			// the
			// network for comparison in the next iteration, and add a number of
			// new
			// cells to the network depending given by the divRation parameter
			if((iter == maxIter) || (preNumCells == cellList.size()))
			{
				proceed = false;
			}
			else
			{
				proceed = true;
				preNumCells = cellList.size();
				addCells((int) Math.round(cellList.size() * divRatio));
			}
		} while (proceed);

		// Save the final iteration and outcome of the network in the
		// DataManager
		dataManager.addFinalGeneration(this, cellList);

		// Print out the details of each cell in the network, givin all the
		// dimension values followed by the cell's fitness according to the
		// optimistaion function
		/*
		 * for (int i = 0; i < cellList.size(); i++) { for (int j = 0; j <
		 * numDims; j++) { System.out.print(cellList.get(i).getDimension(j) +
		 * " "); } System.out.println(cellList.get(i).getFitness()); }
		 * 
		 * System.out.println("From datamanager;");
		 * dataManager.printGeneration(this, iter-1);
		 */
	}