Programmeer Challenge Jeu Awalé |
---|
Dit jaar organiseert het bedrijf waar ik werk voor het eerst een programmeer Challenge. Bij deze programmeerwedstrijd is het de bedoeling dat engines van verschillende deelnemers het spel Awalé tegen elkaar spelen.
Het van oorsprong Afrikaanse spel Awalé zou wel eens het oudste bordspel ter wereld kunnen zijn. Zijn geschiedenis gaat duizenden jaren terug. Door het almaar groeiende aantal toeristen dat door Afrika trekt, wordt Awalé ook op andere continenten steeds bekender en populairder.
Spelregels
In het kort. Awalé is een bordspel dat begint met een bord met 2x6 velden gevuld met elk 4 zaden. Een beurt bestaat uit 2 delen, het zaaien en het eten. Zaaien doe je door alle zaden uit één veld te pakken en deze per stuk tegen de klok in te verdelen in de andere velden. Als in het veld waar je het laatste zaadje zaait zich aan de zijde van de tegenstander bevindt, dan moet je zaden uit dit veld eten als er twee of drie zaden op liggen. Zolang aan deze condities wordt voldaan, gaat men één voor één alle velden af met de wijzers van de klok mee om ook hier zaden te eten. Degene die als eerste meer dan 24 zaden heeft gegeten heeft gewonnen.Aard en doel van Awale
Het spel wordt gespeeld tussen twee tegenstanders die om beurten ‘zaden zaaien’ op het speelbord en (indien van toepassing) ‘eten’ van het speelbord.Het is de bedoeling van elke speler om meer zaden te eten dan de tegenstander. Het spel gaat net zo lang door tot dat een van beide spelers niet meer kan zaaien. De speler die gedurende het gehele spel de meeste zaden gegeten heeft is winnaar.
Als beide spelers evenveel zaden hebben gegeten is het spel remise.
Beginopstelling
Het speelbord bestaat uit twee zijden van elk zes velden. Elke speler heeft een zijde ter beschikking.De speelstukken bestaan uit 48 zaden met identieke waarde en eigenschappen.
Een veld is een locatie op het speelbord waarin zich 0 tot en met 48 zaden kunnen bevinden (het aantal zaden binnen een veld moet altijd een geheel getal zijn). Een veld grenst links en rechts aan één ander veld, met uitzondering van het eerste en laatste veld. Het meest linkse veld grenst aan de linkerkant met het veld van de tegenstander hier tegenover. Het meest rechtse veld grenst aan de rechterkant met het veld van de tegenstander hier tegenover.
Bij het begin van het spel is ieder veld gevuld met vier zaden.
Zaaien
De aan zet zijnde speler kiest een van zijn/haar gevulde velden en neemt alle zaden uit dit veld in zijn/haar hand. Daarna gaat hij/zij tegen de wijzers van de klok in langs alle velden en zaait in ieder veld één zaadje totdat alle in de hand genomen zaden gezaaid zijn. Mocht hierbij het startveld weer aangedaan worden, wordt hier niet gezaaid en wordt met zaaien vervolgd in het direct hierop volgende veld. Het is op deze manier mogelijk dat in een beurt meerdere malen één zaadje in één en hetzelfde veld wordt gezaaid.Als alle velden van de tegenstander leeg zijn en de aan zet zijnde speler heeft ten minste één mogelijkheid om een zet te doen waarbij ten minste één veld van de tegenstander wordt gevuld met ten minste één zaadje, dan is de speler verplicht deze zet te doen.
Eten
De fase waarin zaden gegeten mogen worden volgt iedere zet nadat de speler het zaaien heeft afgerond.Bij het bepalen of er zaden en (indien van toepassing) welke zaden gegeten worden gaat men als volgt te werk: men begint bij het veld, waar men in de zaaifase is geëindigd met zaaien van het laatste zaadje. Indien dit veld zich aan de zijde van de tegenstander bevindt, dan wordt dit veld leeg gegeten als er twee of drie zaden op liggen. Zolang aan deze condities wordt voldaan, gaat men één voor één alle velden af met de wijzers van de klok mee om ook hier zaden te eten.
Gegeten zaden worden uit het spel genomen. Er wordt bijgehouden hoeveel zaden door iedere speler gegeten worden.
Einde van het spel
Het spel is afgelopen wanneer een van beide spelers niet meer kan zaaien. Als de andere speler nog zaden op zijn zijde heeft, worden deze aan zijn totaal van gegeten zaden toegevoegd.Wanneer een identieke positie zich voor de tweede keer voordoet wordt het spel beëindigd. De zaden die zich dan nog op het bord bevinden worden buiten beschouwing gelaten.
Het schrijven van een engine
De engine moet geschreven worden in C# 1.1, 2.0, Java JDK 5 of 6. Dit is een console applicatie die opgestart wordt met als enige parameter de url naar de webservice van de gameserver.Van de gameserver krijgt één van de spelers het signaal dat de eerste zet gedaan mag worden. Na het doen van de eerste zet krijgt de andere partij te horen welke zet dit was en mag daarop antwoorden. De precieze specificaties van de webinterface zijn nog niet bekend. Zodra de exacte specs (waaronder de wsdl) bekend zijn worden ze hier uiteraard gepost. Maar ook zonder deze specs zijn er een genoeg interessante zaken te programmeren en te bediscussieren.
Er zijn verschillende methoden die je kunt gebruiken voor de AI van je Awalé engine. Voor programmeurs die nog nooit iets met AI gedaan hebben, volgen hier een paar technieken en links in de goede richting.
Minimax
Minimax is een manier om de beste volgende zet te bepalen. Meer hierover op http://en.wikipedia.org/wiki/Minimax_theoremOm de de zoekboom van minimax te beperken is kunnen alpha-beta pruning en een transposition table gebruikt worden.
Alpha beta pruning
Alpha beta pruning zorgt ervoor dat kansloze beslissingen niet verder doorgerekend worden. Meer hierover op http://en.wikipedia.org/wiki/Alpha-beta_pruningTransposition table
Het is mogelijk om met verschillende moves op dezelfde stelling uit te komen. Om dezelfde stelling (op een ander punt in de zoekboom) niet steeds opnieuw te evalueren kun je een transposition table gebruiken. Meer hierover http://en.wikipedia.org/wiki/Transposition_tableNeurale netwerken
Neurale netwerken zijn ontworpen naar analogie van het menselijk brein en kan getraind worden op vanalles en nog wat. Meer hierover http://nl.wikipedia.org/wiki/Neuraal_netwerkGenetisch programmeren
Genetisch programmeren is gebaseerd op het idee van evolutie. Je begint met willekeurige engines die tegen elkaar spelen. De winnaars gaan door naar de volgende generatie, bovendien creëer je nieuwe engines door eigenschappen van winnende engines met elkaar te combineren. Door steeds de winnaars door te laten gaan zullen de engines steeds beter worden. Meer hierover http://nl.wikipedia.org/wiki/Genetisch_algoritmePondering
Geen AI techniek, maar wel een mogelijkheid om jouw engine voordeel te geven tov de opponent. Met pondering wordt bedoeld dat je ook 'denkt' in de tijd van de tegenstanders. Elke engine wordt uitgevoerd op een eigen fysieke machine, dus je hebt de hele processor voor jezelf. Het zou zonde zijn deze niet te gebruikenMeedoen
Je kunt meedoen door je hier http://www.tjip-challenge.com/ik_doe_mee.html in te schrijven.De introductiebijeenkomst is al zaterdag 23 juni (aanstaande zaterdag), dus wees er snel bij.
Meer informatie vind je op deze site: http://www.tjip-challenge.com
Waarom dit topic
Het doel van dit topic is om de technische kanten van de wedstrijd te bespreken. De belangrijkste component is het bespreken van mogelijke strategieën, zodat dit een leerzaam topic over AI mbt bordspelen wordt. Daarnaast is het al een discussie op zich hoe je het beste een Awalé bord kunt representeren en hoe je daar efficiënt zetten op doorvoert. Hoe efficiënter, hoe meer zetten je vooruit kunt denken en daarmee haal je dus winst tov de tegenpartijupdate 16-07-2007
De nieuwe spelregels staan online. Hierin zijn een aantal puntjes opgenomen die in dit forum naar boven zijn gekomen.- De link naar de wsdl (2.2.1)(wsdl)
- Je mag je tegenstander alleen leeg eten als dat de enige mogelijke zet is (4.3.3)
- Code blijft eigendom van de deelnemer (5.3)
De finale is verzet naar zaterdag 29 september 2007.
ps. Er is toestemming van de crew.
[ Voor 6% gewijzigd door Sjaaky op 16-07-2007 15:09 ]