Ik ben nu in Prolog '4 op een rij' aan het schrijven, en wilde het minimax algorithme schrijven.
Ik krijg echter steeds de error:
en snap niet hoe ik het kan oplossen.
Mijn code tot nu toe is:
evalueer(Bord, Waarde) werkt trouwens ook nog niet optimaal, maakt nu alleen gebruik van of iemand bijna wint of bijna verliest, en hoeveel stenen iemand in de middelste kolom heeft, hier ga ik nu waarschijnlijk even aan werken, met minimax zie ik het even niet meer zitten.
Een Bord is gerepresentateerd als twee lijsten (Lwit en Lzwart), die elk een verzameling coordinaten hebben (dus als in: [(1,2),(1,3)] ) op een bord van 7 bij 7. Een zet is gelijk aan een kolomnummer.
De rest lijkt me redelijk voor zich spreken
Heeft iemand een idee hoe ik dit op kan lossen?
Ik krijg echter steeds de error:
code:
1
2
3
| ERROR: Arguments are not sufficiently instantiated Exception: (29) beter_dan(6, 2, 7, _G16579, wit, _G16581, _G16582) ? creep Exception: (19) beste_zet(3, [7], [ (5, 1), (4, 2), (4, 1)]+[ (7, 2), (7, 1)], zwart, _G15713, _G15714) ? creep |
en snap niet hoe ik het kan oplossen.
Mijn code tot nu toe is:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
| % minimax(N): Kies een zet volgens het minimax algoritme met cut-off diepte N. % De diepte wordt geteld in het aantal zetten, waarbij elke zet bestaat uit een % steen die door een speler gezet wordt. minimax(N, Bord, Kleur, Zet) :- minimax_hulp(N, Bord, Kleur, Zet, _Waarde). minimax_hulp(_N, Bord, _Kleur, _Zet, Waarde) :- \+ legale_zet(Bord, _X), evalueer(Bord, Waarde). minimax_hulp(0, Bord, _Kleur, _Zet, Waarde) :- % !, evalueer(Bord, Waarde). minimax_hulp(N, Bord, Kleur, BesteZet, Waarde) :- N>0, findall(X, legale_zet(Bord, X), LlegaleZetten), beste_zet(N, LlegaleZetten, Bord, Kleur, BesteZet, Waarde). beste_zet(N, [BesteZet], Bord, Kleur, BesteZet, Waarde) :- % !, maak_bord(Bord, Kleur, BesteZet, NieuwBord), NewDepth is N-1, andere_speler(Kleur, AndereKleur), minimax_hulp(NewDepth, NieuwBord, AndereKleur, _Zet, Waarde). beste_zet(N, [Head|LlegaleZetten], Bord, Kleur, BesteZet, BesteWaarde) :- LlegaleZetten \= [], maak_bord(Bord, Kleur, Head, NieuwBord), NewDepth is N - 1, andere_speler(Kleur, AndereKleur), minimax_hulp(NewDepth, NieuwBord, AndereKleur, _BestOfHead, WaardeHead), beste_zet(N, LlegaleZetten, Bord, Kleur, BestOfTail, WaardeTail), beter_dan(Head, WaardeHead, BestOfTail, WaardeTail, AndereKleur, BesteZet, BesteWaarde). beter_dan(Eerstezet, Eerstewaarde, _Tweedezet, Tweedewaarde,'wit', Eerstezet, Eerstewaarde) :- Eerstewaarde > Tweedewaarde. beter_dan(_Eerstezet, Eerstewaarde, Tweedezet, Tweedewaarde,'zwart', Tweedezet, Tweedewaarde) :- Eerstewaarde > Tweedewaarde. beter_dan(_Eerstezet, Eerstewaarde, Tweedezet, Tweedewaarde,'wit', Tweedezet, Tweedewaarde) :- Eerstewaarde =< Tweedewaarde. beter_dan(Eerstezet, Eerstewaarde, _Tweedezet, Tweedewaarde,'zwart', Eerstezet, Eerstewaarde) :- Eerstewaarde =< Tweedewaarde. |
evalueer(Bord, Waarde) werkt trouwens ook nog niet optimaal, maakt nu alleen gebruik van of iemand bijna wint of bijna verliest, en hoeveel stenen iemand in de middelste kolom heeft, hier ga ik nu waarschijnlijk even aan werken, met minimax zie ik het even niet meer zitten.
Een Bord is gerepresentateerd als twee lijsten (Lwit en Lzwart), die elk een verzameling coordinaten hebben (dus als in: [(1,2),(1,3)] ) op een bord van 7 bij 7. Een zet is gelijk aan een kolomnummer.
De rest lijkt me redelijk voor zich spreken
Heeft iemand een idee hoe ik dit op kan lossen?
edit:
PHP tags gebruikt
PHP tags gebruikt
[ Voor 3% gewijzigd door Masterdam op 14-06-2003 16:05 ]