@Override
	public AlgorithmOutput start() {
		//Give students a random order
		if(!labs.isEmpty()){
			Collections.shuffle(students);
			//Sort students into labs
			for(Student s: students){
				s.combineLabs();
				if(s.getCombinedLabs().isEmpty()){
					s.setFlaggedForLabs(true);
					s.setReasonForFlagging("Student has no first, second, or third lab choices.");
					flagged.add(s);
				}
			}
			for(Timeslot t:labs)
				t.sortAssigned();

			sortLabs();

		}
		if(!tutorials.isEmpty()){
			for(Student s: students){
				s.combineTuts();
							if(s.getCombinedTuts().isEmpty()){
							s.setFlaggedForTuts(true);
							s.setReasonForFlagging("Student has no first, second, or third lab choices.");
								if(!flagged.contains(s))
									flagged.add(s);
							}
			}
			if(!labs.isEmpty()){
				TutorialChecker tc = new TutorialChecker(students);
				students = tc.getStudents();
			}
			sortTuts();
		}
		generateAlgorithmOutput();
		//Return output
		return output;
	}