public Individual orderCross(Individual a, Individual b) {
		int numChromosomes = a.genotype.size();
		if (verbose) System.out.println(numChromosomes);
		
		
		List<Object> offspringGenotype = new ArrayList<Object>(Collections.nCopies(numChromosomes, -1));
		
		// Generate random cut interval
		int startCut = rand.nextInt(numChromosomes);
		int endCut = rand.nextInt(numChromosomes);
		/*
		if (startCut > endCut) {
			int tmp = startCut;
			startCut = endCut;
			endCut = tmp;
		}
		*/
		if (verbose) {
			System.out.printf("startCut:%d, endCut:%d\n",startCut,endCut);
			System.out.println("before copy");
			System.out.println(offspringGenotype);
		}
		// Copy the cut sections to the new individuals, wrapping over at end
		int numCopied = 1;
		offspringGenotype.set(endCut,a.genotype.get(endCut));
		for (int i = startCut; i != endCut; i = (i + 1) % numChromosomes) {
			offspringGenotype.set(i,a.genotype.get(i));
			numCopied++;
		}
	
		if (verbose) {
			System.out.println("after copy");
			System.out.println(offspringGenotype);
		}
		// Copy the remaining chromosomes
		// TODO: contains in individual probably won't work, need to implement equals etc\
		int chromosomesRemaining = numChromosomes - numCopied;
		int setIndex = (endCut + 2 > numChromosomes) ? 0 : endCut + 1;
		int getIndex = setIndex;
		while (chromosomesRemaining > 0) {
			Object chromosome = b.genotype.get(getIndex);
			if (!offspringGenotype.contains(chromosome)) {
				offspringGenotype.set(setIndex, chromosome);
				setIndex = (setIndex + 2 > numChromosomes) ? 0 : setIndex + 1;
				chromosomesRemaining--;
			}
			getIndex = (getIndex + 2 > numChromosomes) ? 0 : getIndex + 1;
		}
		
		return new Individual(offspringGenotype);
	}