Declaratieve Talen/oplossingenMijnen
Naar navigatie springen
Naar zoeken springen
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