private void initialize() {
		
		Ant initialAnt = null;
		
		if (this.initialIndividual != null) {
			
			initialAnt = 
					(Ant) new Ant(initialIndividual.getPersonWorkLists());
		
		} else {
			
			initialAnt = new Ant();
		
		}

		//other initializations
		rand = new Random();
		indexes = new int[subProjectNumber*subProjectActivities];
		ACOUtil.linearFillArray(indexes);
		
		probabilities = new double[indexes.length];
		
		trails = new double[indexes.length][indexes.length];
		
		heuristics = new double[indexes.length][indexes.length];
		
		//only subprojectActivities visible
		reachable = new int[subProjectActivities]; 

		//setting trails and heuristics
		for (int i = 0; i < indexes.length; i++) {
			
			heuristics[i][i] = 0;
			trails[i][i] = initTrail;
			
			for (int j = i+1; j < indexes.length; j++) {
				
				trails[i][j] = initTrail;
				trails[j][i] = initTrail;

				//HEURISTICS
				double activityDuration = initialAnt.getPersonWorkLists().
						get(i/subProjectNumber).
						get(j/subProjectActivities).
						getWorkLoad();
				
				/**
				 * IF SHORT ACTIVITY DURATION PRIORITIZED:
				 * shortDurationPrioritized = 1.0/activityDuration, β > 1
				 * IF LONG ACTIVITY DURATION PRIORITIZED:
				 * shortDurationPrioritized = 1.0/activityDuration, β < 1
				 * If β > 1, high pressure on heuristics that may not be sufficient!
				 * The user should be aware of that.
				 * @author Karlo Knezevic, karlo.knezevic@fer.hr
				 */
				
				//SHORT ACTIVITY DURATION PRIORITIZED
				double shortDurationPrioritized = 
						activityDuration>0 ? 1.0/activityDuration : 0;

				heuristics[i][j] = Math.pow(shortDurationPrioritized, β);
				heuristics[j][i] = heuristics[i][j];
			
			}
		}

		ants = new Ant[colonySize];

		best = (Ant) initialAnt.clone();

		for (int i = 0; i < ants.length; i++) {
			ants[i] = (Ant) initialAnt.clone();
		}

	}