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:

  1. Een lesgever kan niet op hetzelfde moment aan twee studentengroepen lesgeven.
  2. Een groep studenten kan niet op hetzelfde moment les volgen bij twee lesgevers.

Voorbeeld

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 Les1, die een les voorstelt met gegeven lesgever en studentengroep, en een klasse Lesuur2, die een lijst met lessen bijhoudt die in een lesuur worden gegeven, beschikbaar. Hiernaast is ook een interface Roosteraar3 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 SimpleTest4 om je oplossing lokaal te testen. Je kan hierin eenvoudig extra testgevallen toevoegen.