Een aantal lesgevers \(L_i\), \(i = 1,...,n\), geeft les aan een aantal groepen studenten \(S_j\), \(j = 1,...,k\). Gevraagd wordt om een lesrooster op te stellen dat zo weinig mogelijk lesuren gebruikt, waarbij uiteraard lessen in parallel kunnen worden gegeven, rekening houdend met de volgende beperkingen:
Voor de volgende gegevens: \((L_1, S_1)\), \((L_2, S_1)\), \((L_3, S_1)\), \((L_5, S_1)\), \((L_2, S_2)\), \((L_4, S_2)\), \((L_5, S_2)\), \((L_1, S_3)\), \((L_4, S_3)\) is het volgende schema een goed lesrooster:
Lesuur 1 | Lesuur 2 | Lesuur 3 | Lesuur 4 | |||
---|---|---|---|---|---|---|
\((L_2, S_1)\) | \((L_5, S_1)\) | \((L_3, S_1)\) | \((L_1, S_1)\) | |||
\((L_4, S_3)\) | \((L_1, S_3)\) | \((L_4, S_2)\) | ||||
\((L_5, S_2)\) | \((L_2, S_2)\) |
Ontwerp en implementeer een gretig algoritme voor het opstellen van een correct lesrooster, d.w.z. een lesrooster dat aan beide beperkingen voldoet, met zo weinig mogelijk lesuren. Hiervoor zijn een klasse Les
1, die een les voorstelt met gegeven lesgever en studentengroep, en een klasse Lesuur
2, die een lijst met lessen bijhoudt die in een lesuur worden gegeven, beschikbaar. Hiernaast is ook een interface Roosteraar
3 gegeven die een methode public List<Lesuur> planLessen(List<Les> lessen)
bevat. Deze methode neemt een lijst van lessen als input en geeft een lijst van lesuren terug, waarbij er rekening wordt gehouden met bovengenoemde beperkingen en het aantal lesuren zo laag mogelijk wordt gehouden.
Schrijf een klasse LesRoosteraar
die deze interface implementeert.
Zoek een tegenvoorbeeld dat aantoont dat dit algoritme niet steeds een optimaal lesrooster oplevert.
Gebruik eventueel de testklasse SimpleTest
4 om je oplossing lokaal te testen. Je kan hierin eenvoudig extra testgevallen toevoegen.