private void PooledThreadFunc(object state)
        {
            Random _random = new Random();

            try
            {
                LogEvent("Program started...");

                string fileName = "Cities.xml"; //the coordinates are kept in this file
                string atype    = "GEO";        //GEO or EUCL is the distance calculation type
                if (rbEUCL.Checked)
                {
                    atype = "EUCL";
                }

                int  minus           = 8;                                        //this corresponds to max number of males that can attached to the female
                bool isNeighbour     = false;                                    //for candidate list selection
                int  timeCycle       = Convert.ToInt32(txtTimeCycle.Text);       //how long the program should run
                int  spawnnumber     = Convert.ToInt32(txtSpawnNumber.Text);     //spawn number setting
                int  reductionnumber = Convert.ToInt32(txtReductionNumber.Text); //reduction number setting
                int  currentTime     = 0;

                Cities cityList = new Cities();
                cityList.OpenCityList(fileName);
                cityList.CalculateCityDistances(atype);//create the city list

                //create a default array that corresponds to the length of city list
                int[] start = new int[cityList.Count];
                for (int m = 0; m < cityList.Count; m++)
                {
                    start[m] = m;
                }

                //initialize the population
                var population = new List <Individual>();

                //initialize young males
                int malePopulationSize = 500;
                for (int k = 0; k < malePopulationSize; k++)
                {
                    int[] m = new int[1];                   //create an array with only 1 city
                    m[0] = _random.Next(0, cityList.Count); //choose a random number within the city list
                    population.Add(new Male(m));            //add the male into the population
                }

                //initialize young females
                int femalePopulationSize = 100;
                for (int fem = 0; fem < femalePopulationSize; fem++)
                {
                    int[] f;
                    if (!isNeighbour)
                    {
                        Shuffle(start, _random);                                      //shuffle the default array
                        int r = _random.Next(cityList.Count - minus, cityList.Count); //determine how many cities in this female
                        f = new int[r];                                               //initialize the female array in r length
                        Array.Copy(start, 0, f, 0, r);                                //copy the first r length from the default array to the female array
                    }
                    #region For Candidate List Only, isNeighbour=true
                    else
                    {
                        //candidate list
                        List <int> holdCities = new List <int>();
                        for (int k = 0; k < cityList.Count; k++)
                        {
                            holdCities.Add(k);
                        }

                        f = new int[cityList.Count];

                        //Generate a first element randomly
                        f[0] = _random.Next(0, cityList.Count);
                        holdCities.RemoveAt(holdCities.IndexOf(f[0]));

                        int selectedCloseCity      = int.MaxValue;
                        int selectedCloseCityIndex = 0;
                        int flag;
                        int baseCityIndex = 0;

                        for (int j = 1; j < cityList.Count; j++)
                        {
                            flag = 20;//number of close cities X 2

                            while (!holdCities.Contains(selectedCloseCity) && flag > 0)
                            {
                                //selected close city is from the last city in the f list
                                baseCityIndex     = f[j - 1];
                                selectedCloseCity = cityList[baseCityIndex].CloseCities[_random.Next(0, cityList[baseCityIndex].CloseCities.Count)];
                                flag--;
                            }

                            if (!holdCities.Contains(selectedCloseCity))
                            {
                                selectedCloseCity = holdCities[0];
                            }
                            selectedCloseCityIndex = holdCities.IndexOf(selectedCloseCity);
                            holdCities.RemoveAt(selectedCloseCityIndex);
                            f[j] = selectedCloseCity;
                        }

                        //remove some cities off randomly
                        int tobeDiscard = _random.Next(1, minus + 1);
                        while (tobeDiscard > 0)
                        {
                            int discardIndex = _random.Next(0, f.Length);
                            f = RemoveIndices(f, discardIndex);
                            tobeDiscard--;
                        }
                    }
                    #endregion

                    Individual female = new Female(f, int.MaxValue, minus); //create a female with default legacy value
                    population.Add(female);                                 //add the young female into the population
                }

                //Initialize the Simulation with all the values
                var sim = new Simulation(population, timeCycle, cityList, minus, spawnnumber, reductionnumber);

                //Start the Simulation while the conditions are true
                while ((!exit_thread) && (currentTime < timeCycle))
                {
                    sim.ExecuteEnvironment();
                    LogEvent("Time " + currentTime.ToString() + ": " + " Top fitness: " + sim.Population[0].Fitness.ToString() + " " + sim.Population[0].ToString());
                    currentTime++;
                }
            }
            catch (Exception ex)
            {
                LogEvent(ex.Message);
            }
            LogEvent("Program stopped.");
        }