Dag indeling:
Eerste dag:
Een representatie van de zoek nodes voor MiniMax bedenken.
Het implementeren van de regels van dammen, waaronder schuiven en slaan.
Het implementeren van MiniMax zonder echte heuristieke functie zodat deze gewoon zetten kan maken.
Tweede dag:
Het opzoeken van mogelijke tactieken op het internet.
Implementeren van de interface.
Derde dag:
Het schrijven van een Prolog file die de states omzet naar mutatieposities.
Het implementeren van een Alpha-Beta algoritme om Minimax te versnellen.
Vierde dag:
Nieuwe, verfijnderde heuristiek toevoegen.
Testen van MiniMax met en zonder Alpha-Beta pruning van de zoekboom in verschillende situaties en met en zonder de nieuwe heuristiek.
Vijfde dag:
Presenteren van de resultaten.
Verslag per dag.
Eerste dag:
We hebben ervoor gekozen om de zoek nodes te representeren als een lijst met de posities van de witte stukken, een lijst met de posities van de zwarte stukken en een atom die aangeeft welke zijde aan beurt is. Deze drie zetten we in volgorde in nog een lijst. Hier is voor gekozen omdat lijsten makkelijk en efficient in Prolog te manipuleren zijn.
Deze representatie hebben we gebruikt om de moves aan te maken. Hierbij moesten de moves opgedeeld worden in strike- en normal moves omdat bij dammen altijd geslagen moet worden als dat mogelijk is. Dit valt terug te vinden in de wrapper rond de moves, waar er ook voor gezorgd wordt dat meerdere stenen achter elkaar geslagen kunnen worden.
De MiniMax implementatie is een aanpassing op Bratko's code. Er zijn haakjes toegevoegd en predikaten uit elkaar getrokken om het beter te laten lopen. Een maximale diepte van het zoeken is ook toegevoegd, op de standaard manier.
Tweede dag:
We hebben vooral naar http://www.xs4all.nl/~dezlaren/opgaven/techniek.htm en http://www.damweb.nl/tech/regels.html gekeken om wat ideeen te krijgen voor heuristieken en voorbeeld probleempjes.
De interface heeft een recursieve wrapper gekregen rond playmove om de staat goed aan te passen in het geval dat wit meerder stukken achter elkaar slaat. Het laatste playmove predikaat is onderaan gezet om ervoor te zorgen dat als wit iets slaat, dat ook opgemerkt wordt. Omdraaien van de volgorde zou het programma in de war sturen.
We zijn erachter gekomen dat het apart implementeren van AL0 niet nodig is gezien dat MiniMax uit zichzelf al valkuilen zet, omdat de heuristieke functie telt hoeveel stukken er geslagen worden. Als er een valkuil gezet wordt, zijn er over het algemeen veel stukken die bij de tegenstander verloren gaan, dus een goede move, dus heeft deze de voorkeur.
Derde dag:
Het schrijven van de mutatieposities naar een file gebeurt in toUMIRTX.pl en legt zichzelf redelijk uit. Als de robot aangestuurd gaat worden kan hier nog eens naar gekeken worden omdat dan pas echt te zien is wat de handigste manier is. We zijn begonnen met het implementeren van de Alpha-Beta pruning uit Bratko, maar hier zitten nog wat kleine haken en ogen aan. Daarom hebben we dit vandaag niet afgekregen. Het probleem is dat er ergens een variabele wordt geïntroduceerd die vervolgens onze aanroep van findall/3 in de war gooit. Dit hebben we deze dag niet kunnen oplossen.
We hebben ook counters toegevoegd om het aantal states die bekeken worden te kunnen meten. Hierbij moet niet vergeten worden ze op de goede manier als dynamic te declareren en om ze goed te initialiseren voordat je ze gebruikt. Hier hebben we namelijk problemen mee gehad die moeilijk te tracen zijn.
Vierde dag:
Het probleem met het Alpha-Beta algoritme bleek te zijn dat er ergens een cut achterwege was gelaten die er wel had moeten staan. Nu het werkt zijn we begonnen met het testen. Ook is er een nieuwe heuristiek toegevoegd die het aantal hekstellingen van iedere speler telt. Helaas is dit algoritme op een heel inefficiënte manier recursief en daarom zou het ook niet aangeroepen moeten worden totdat de situatie op het bord voldoende versimpeld is. Hiervoor kijken we of beide speler minder dan acht stenen hebben, voordat we de heuristiek aanroepen.
Vervolgens zijn we begonnen met testen.
We hebben helaas geen tijd gehad om het zeer complexe probleem van een dynamische zoekdiepte aan te pakken, evenals het aansturen van de robot. Dit laatste vonden we niet zo jammer, aangezien we dit voor het schaakspel al hadden opgelost. Wel hadden we bedacht dat het waarschijnlijk het handigst zou zijn om soepele veertjes onder het dambord te monteren om het oppakken van stenen voor de robot te faciliteren. |