private void initialize() {

		EDAUtil.reset();

		EdaChromosome bestPreviousIndividual = this.initialIndividual!=null ?
				new EdaChromosome(this.initialIndividual.getPersonWorkLists()) : null;

		EdaChromosome initialEdaChromosome = null;
		
		if (bestPreviousIndividual == null) {
			
			initialEdaChromosome = new EdaChromosome();
		
		} else {
			
			initialEdaChromosome = 
					(EdaChromosome) bestPreviousIndividual.clone();
			
		}

		//magic number!
		int subProjectActivities = 15;
		
		rand = new Random();

		//sync random 
		EDAUtil.setRand(rand);
		population = new EdaChromosome[populationSize];
		selectedIndividuals = new EdaChromosome[(int)Math.ceil(
				populationSize*individualsProportionForEstimation)];

		//create population
		for (int i = 0; i < populationSize; i++) {

			population[i] = (EdaChromosome)initialEdaChromosome.clone();

			EDAUtil.shuffleSubArray(
					population[i].getProjectWorkUnitIndexes(), 
					subProjectActivities
					);

			if (i == 0) {

				population[i] = bestPreviousIndividual!= null ? 
						bestPreviousIndividual : population[i];

			}

			population[i].evaluate();
		}

	}