Declaratieve Talen/oplossingenMijnen: verschil tussen versies
Naar navigatie springen
Naar zoeken springen
Nieuwe pagina aangemaakt met '<pre> maxproductie(Leveringen,(G,A,B)):- findall((C,D),(leverAanMijnen(Leveringen,[],[],C,D)),List), findall((C,D,Max),(member((C,D),List),max(C,X),max(D,…' |
Andries 14/01/2012 |
||
Regel 85: | Regel 85: | ||
--[[Gebruiker:Greet|Greet]] | --[[Gebruiker:Greet|Greet]] | ||
Andere mogelijkheid: | |||
<pre> | |||
maxproductie(Leveringen,toestand(Pmax,mine(LevM1max),mine(LevM2max))) :- | |||
findall(toestand(P,mine(LevM1),mine(LevM2)), | |||
(verdeelOverMijnen(Leveringen,[],LevM1,[],LevM2), | |||
productie(LevM1,P1), | |||
productie(LevM2,P2), | |||
P is P1+P2), | |||
ScenLijst), | |||
sort(ScenLijst,SortedLijst), | |||
reverse(SortedLijst,NLijst), | |||
NLijst = [toestand(Pmax,mine(LevM1max),mine(LevM2max))|_], | |||
member(toestand(Pmax,mine(LevM1max),mine(LevM2max)),ScenLijst). | |||
% werk met accumulators.. | |||
verdeelOverMijnen([],L1,L1,L2,L2). | |||
verdeelOverMijnen([H|T],Acc1,Lev1,Acc2,Lev2):- | |||
length(Acc1,L1), | |||
length(Acc2,L2), | |||
(L2 < L1/2 -> | |||
verdeelOverMijnen(T,Acc1,Lev1,[H|Acc2],Lev2) | |||
; | |||
verdeelOverMijnen(T,[H|Acc1],Lev1,Acc2,Lev2) | |||
). | |||
% bereken de productie van de gegeven levering. | |||
productie([_],1):-!. | |||
productie([_-L1,_-L2],P):- | |||
list_to_set([L1,L2],Set), | |||
length(Set,Nb), | |||
P is 1 + Nb, | |||
!. | |||
productie([_-L1,_-L2,_-L3|Rest],P):- | |||
list_to_set([L1,L2,L3],Set), | |||
length(Set,Nb), | |||
productie([_-L2,_-L3|Rest],Poud), | |||
P is Poud + Nb, | |||
!. | |||
</pre> | |||
--[[Gebruiker:Andries|Andries]] |
Huidige versie van 14 jan 2012 16:05
maxproductie(Leveringen,(G,A,B)):- findall((C,D),(leverAanMijnen(Leveringen,[],[],C,D)),List), findall((C,D,Max),(member((C,D),List),max(C,X),max(D,Y),Max is X+Y),List2), maxList(List2,(A,B,G),G),!. leverAanMijnen([],A,B,A,B). leverAanMijnen([X|Xs],HmijnA,HmijnB,A,B):- length(HmijnA,C), length(HmijnB,D), ( C<(D/2)-> leverAanMijnen(Xs,[X|HmijnA],HmijnB,A,B) ; leverAanMijnen(Xs,HmijnA,[X|HmijnB],A,B) ). %basisgeval voor lijst met 3 of meer elementen, je moet hier ook in rekening brengen dat B en D ook ton opleveren. max([_-B,_-D,_-F],G):- ( \+B==D-> X = 3, ( \+D==F-> Y = 3 ; Y = 1 ) ; X = 2, ( \+ D==F-> Y = 2 ; Y = 1 )), G is (X+Y). %In het algemene geval moet je alleen testen op of de laatste in de rij (F) verschilt van zijn 2 vorige of alleen de vorige. max([_-B,C-D,E-F|Xs],G):- max([C-D,E-F|Xs],T), ( \+B==D-> ( \+D==F-> Y = 3 ; Y = 1 ) ; ( \+ D==F-> Y = 2 ; Y = 1 )), G is (T+(Y)),!. %Geval er zit maar 1 element in de lijst max([_X],1). %Geval er ziten maar 2 elemeent in de lijst max([_-B,_-D],G):-( \+ B==D-> G is 3 ; G is 2 ). %haal de maximumproductie uit de lijst maxList([(A,B,X)],(A,B,X),X). maxList([(_,_,X)|List],Mine,Max):- maxList(List,Mine1,Max1), ( X > Max1-> Max=X ; Max=Max1, Mine=Mine1 ).
--Greet
Andere mogelijkheid:
maxproductie(Leveringen,toestand(Pmax,mine(LevM1max),mine(LevM2max))) :- findall(toestand(P,mine(LevM1),mine(LevM2)), (verdeelOverMijnen(Leveringen,[],LevM1,[],LevM2), productie(LevM1,P1), productie(LevM2,P2), P is P1+P2), ScenLijst), sort(ScenLijst,SortedLijst), reverse(SortedLijst,NLijst), NLijst = [toestand(Pmax,mine(LevM1max),mine(LevM2max))|_], member(toestand(Pmax,mine(LevM1max),mine(LevM2max)),ScenLijst). % werk met accumulators.. verdeelOverMijnen([],L1,L1,L2,L2). verdeelOverMijnen([H|T],Acc1,Lev1,Acc2,Lev2):- length(Acc1,L1), length(Acc2,L2), (L2 < L1/2 -> verdeelOverMijnen(T,Acc1,Lev1,[H|Acc2],Lev2) ; verdeelOverMijnen(T,[H|Acc1],Lev1,Acc2,Lev2) ). % bereken de productie van de gegeven levering. productie([_],1):-!. productie([_-L1,_-L2],P):- list_to_set([L1,L2],Set), length(Set,Nb), P is 1 + Nb, !. productie([_-L1,_-L2,_-L3|Rest],P):- list_to_set([L1,L2,L3],Set), length(Set,Nb), productie([_-L2,_-L3|Rest],Poud), P is Poud + Nb, !.
--Andries