public Individual run() 
	{
		//problemInstance.print();
		// INITIALISE POPULATION
		
		//initialisePopulation();
		
		System.out.println("IN INITIATOR TESTER");
		initialisePopulation();
		TotalCostCalculator.calculateCostofPopulation(population,0,POPULATION_SIZE, loadPenaltyFactor, routeTimePenaltyFactor);
		Utility.sort(population);

		double min = population[0].costWithPenalty;
		double max = population[0].costWithPenalty;
		double total=0;
		
		for(int i=0;i<POPULATION_SIZE;i++)
		{
			if(population[i].costWithPenalty<min)
				min = population[i].costWithPenalty;
			if(population[i].costWithPenalty>max)
				max = population[i].costWithPenalty;
			
			total +=  population[i].costWithPenalty;
			
		}
		double infeasiblePercent=0;

		int invalid = 0;
		int infeasible = 0;
		for(int i=0; i<POPULATION_SIZE; i++)
		{
			if(population[i].validationTest()==false)
			{
				System.out.println("INVALID INDIVIDUAL");

				invalid++;
			}
			if(population[i].isFeasible==false)
			{
				infeasible++;
			}
			out.println("Printing individual "+ i +" : \n");
			population[i].print();
		}
		
		 infeasiblePercent= ((double)infeasible*100/POPULATION_SIZE);
		
		//System.out.printf("Max : %d Avg : %f Count : %d \n",Individual.max,(double)Individual.total/Individual.count,Individual.count);
		System.out.println("Best : "+min +" avg : "+(total/POPULATION_SIZE)+" worst : "+max+ "Infeasible : "+infeasiblePercent+"%  invalid : "+invalid);

		if(Solver.showViz==true)
		{
			Solver.visualiser.drawIndividual(population[0], "Best Initial");
			Solver.visualiser.drawIndividual(population[POPULATION_SIZE-1], "Worst Initial");
		}
		return population[0];
	}