Declaratieve Talen/oplossingenTeam: verschil tussen versies

Uit Wina Examenwiki
Naar navigatie springen Naar zoeken springen
Geen bewerkingssamenvatting
Harm.de.weirdt (overleg | bijdragen)
Extra oplossing toevoegd
Regel 69: Regel 69:




</pre>
Andere mogelijke oplossing:
<pre>
verdeling(0, _, []).
verdeling(Teams, Studenten, MogelijkeTeams):-
AantalStudenten is Teams*Studenten,
numlist(1, AantalStudenten, StudentenLijst),
permutation(StudentenLijst, MogelijkePermutatie),
maakteams(MogelijkePermutatie, Teams, MogelijkeTeams),
aanvaardbareteams(MogelijkeTeams).
maakteams([], _, []).
maakteams(Permutatie, AantalTeams, [Team|OverigeTeams]):-
length(Team, AantalTeams),
append(Team, PermutatieRest, Permutatie),
maakteams(PermutatieRest, AantalTeams, OverigeTeams).
aanvaardbareteams(MogelijkeTeams):-
sorteerdeellijsten(MogelijkeTeams, DeelsGesorteerd),
sort(DeelsGesorteerd, GesorteerdeMogelijkeTeams),
lijstengelijk(MogelijkeTeams, GesorteerdeMogelijkeTeams).
sorteerdeellijsten([], []).
sorteerdeellijsten([Lijst|Rest], [GesorteerdeLijst|GesorteerdeDeelLijsten]):-
sort(Lijst, GesorteerdeLijst),
sorteerdeellijsten(Rest, GesorteerdeDeelLijsten).
lijstengelijk([], []).
lijstengelijk([El1|Rest1], [El2|Rest2]):-
El1 == El2,
lijstengelijk(Rest1, Rest2).
</pre>
</pre>


--[[Gebruiker:Greet|Greet]]
--[[Gebruiker:Greet|Greet]]

Versie van 30 dec 2011 14:38

LET OP Deze oplossing werkt alleen voor groepjes van 2 omdat het alle groepen genereerd die mogelijk zijn, duurt het te lang om grotere groepen te maken

Beschrijving predikaten

maakTeam geeft telkens S elementen uit de lijst terug. Stel lijst = [1,2,3,4] en we nemen S=2, dan zal de output [1,2] [1,4] [2,3] zijn.

maakTeams geeft telkens een combinatie van S elementen terug uit de lijst. Stel lijst = [1,2,3,4] en S=2, dan zal de output [[1,2],[3,4]],[[1,3],[2,4]],[[2,3],[1,4]],... zijn.

maak_schedule geeft W keer een uniek element uit de verdeling terug. Stel W=3, dan is de output een lijst met 3 elementen, namelijk 3 combinaties gegenereerd uit de verdeling.

aantalwerkjes telt de mogelijke lengtes van de verdelingen lijst, maakt er een lijst van en neemt een willekeurig element uit de lijst (elke verdeling is even lang).



% T teams en in elk team moeten S studenten
% Deel1: verdeling(T,S,Verdeling)

verdeling(T,S,Verdeling):- X is T*S,
	                   numlist(1,X,List),
			   findall(List2,(maakTeams(List,S,List2)),List3),				   list_to_set(List3,List4),
			   sorteer(List4,List5),
			   list_to_set(List5,List6),
			   member(Verdeling,List6).

maakTeams([],_,[]).
maakTeams(List,S,[TeamS|Teams]):-maakTeam(List,S,Team1),
			               sort(Team1,TeamS),
				       findall(X,(member(X,List),\+member(X,TeamS)),Overige),
      				       maakTeams(Overige,S,Teams).

maakTeam(_,0,[]).
maakTeam(List,S,[A|Team]):-
	               S>0,
		       T is S-1,
		       maakTeam(List,T,Team),
		       member(A,List),
	               \+ member(A,Team).

sorteer([X],[X]).
sorteer([X,Y|Xs],[[L1|L2]|List]):-sort(X,[L1|L2]),
	                          sort(Y,[M1|M2]),
				  (
				  (L1==M1;(member(M,L2),(member(M,M2))))->
			            sorteer([[L1|L2]|Xs],List)
				   ;
			            sorteer([[M1|M2]|Xs],List)
			           ).

%Deel 2
groepeer(T,S,W,Schedule):-
	findall(Schedule2,(maak_schedule(T,S,W,[],Schedule1),sort(Schedule1,Schedule2)),Schedule3),
	list_to_set(Schedule3,Schedule4),
	member(Schedule,Schedule4).

%Deel 3
maak_schedule(_,_,0,S,S).
maak_schedule(T,S,W,HSchedule,[Sch|Schedule]):-
	verdeling(T,S,Sch),
	\+member(Sch,HSchedule),
	NewW is W-1,
	maak_schedule(T,S,NewW,[Sch|HSchedule],Schedule).

aantalwerkjes(T,S,W):-
	findall(Y,(verdeling(T,S,List),length(List,X),Y is X+1),List2),
	list_to_set(List2,Set),
	member(W,Set).



Andere mogelijke oplossing:

verdeling(0, _, []).
verdeling(Teams, Studenten, MogelijkeTeams):-
	AantalStudenten is Teams*Studenten,
	numlist(1, AantalStudenten, StudentenLijst),
	permutation(StudentenLijst, MogelijkePermutatie),
	maakteams(MogelijkePermutatie, Teams, MogelijkeTeams),
	aanvaardbareteams(MogelijkeTeams).

maakteams([], _, []).
maakteams(Permutatie, AantalTeams, [Team|OverigeTeams]):-
	length(Team, AantalTeams),
	append(Team, PermutatieRest, Permutatie),
	maakteams(PermutatieRest, AantalTeams, OverigeTeams).

aanvaardbareteams(MogelijkeTeams):-
	sorteerdeellijsten(MogelijkeTeams, DeelsGesorteerd),
	sort(DeelsGesorteerd, GesorteerdeMogelijkeTeams),
	lijstengelijk(MogelijkeTeams, GesorteerdeMogelijkeTeams).

sorteerdeellijsten([], []).
sorteerdeellijsten([Lijst|Rest], [GesorteerdeLijst|GesorteerdeDeelLijsten]):-
	sort(Lijst, GesorteerdeLijst),
	sorteerdeellijsten(Rest, GesorteerdeDeelLijsten).

lijstengelijk([], []).
lijstengelijk([El1|Rest1], [El2|Rest2]):-
	El1 == El2,
	lijstengelijk(Rest1, Rest2).

--Greet