private Schedule[] crossover(final Schedule p1, final Schedule p2) {
		String section;
		final Schedule[] children = new Schedule[2];
		Map<String, Integer> ISChild1;// 1st childs internal schedule
		Map<String, Integer> ISChild2; //2nd chilss Internal Schedule
		final Schedule child1 = (Schedule) p1.clone();
		final Schedule child2 = (Schedule) p2.clone();

		ISChild1 = child1.getSchedule();
		ISChild2 = child2.getSchedule();

		int newSlotLoc = 0;
		final int k = Random.generateInt(cachedSortedSectionIds.length - 1) + 1;
		int j = Random.generateInt(k);
		for( ; j < k; j++ ){
			section = cachedSortedSectionIds[ j ];
			newSlotLoc = ISChild1.get(section);
			child1.move(section, ISChild2.get(section));
			child2.move(section, newSlotLoc);
		}

		if( Random.generateDouble() < MUTATIONRATE ){
			mutate(child1);
		}
		if( Random.generateDouble() < MUTATIONRATE ){
			mutate(child2);
		}

		Ranker.rank(child1);
		Ranker.rank(child2);
		children[ 0 ] = child1;
		children[ 1 ] = child2;
		return children;
	}