[Wedstrijd]CodeCup 2021 - Zuniq

Pagina: 1
Acties:

Acties:
  • +5 Henk 'm!

  • Vaan Banaan
  • Registratie: Februari 2001
  • Niet online

Vaan Banaan

Heeft ook Apache ontdekt

Topicstarter
Afbeeldingslocatie: https://tweakers.net/i/hdAyqreFC_uFQQsALcpnM5xnsTw=/full-fit-in/4000x4000/filters:no_upscale():fill(white):strip_exif()/f/image/MzJXnHNqIIauPUGCZwGn5AIL.png?f=user_large

CodeCup is een jaarlijkse programmeerwedstrijd, ontstaan uit de Nederlandse Informatica Olympiade, waarbij deelnemers een programma schrijven dat een spel kan spelen. Die programma's nemen het dan tegen elkaar op in een toernooi.
Dit jaar draait het om Zuniq, een pen-and-paper variant van Dots and Boxes
Website: https://www.codecup.nl/intro.php

Over het spel

Zuniq wordt gespeeld met 2 spelers op een 6 x 6 raster
De spelers moeten om en om een horizontale of verticale lijn tussen 2 punten zetten.
Degene die de laatste lijn zet, is de winnaar

Een lijn kan dus horizontaal zijn (bijvoorbeeld A2h)
of verticaal (bijvoorbeeld C4v)
Je bent vrij om ergens een lijn te zetten, het hoeft niet ergens op aan te sluiten
In de afbeelding hiernaast hebben de spelers de lijnen A2h, B3h, C1v, C4v, E3h, E5h en E5v gezet
Afbeeldingslocatie: https://tweakers.net/i/WzAOeKeZ8BlXH8nEbwXtO3eQAIk=/full-fit-in/4000x4000/filters:no_upscale():fill(white):strip_exif()/f/image/KmTpSwWmczIfuKQluiG1qp5u.png
Als gedurende het spel een lijn gezet wordt, wat een gesloten gebied maakt, wordt het aantal vakjes in dat gebied geteld.
Binnen een gesloten gebied (als dat meer dan 1 vakje is) mag je geen lijnen meer zetten
Afbeeldingslocatie: https://tweakers.net/i/nc-ZUbmPcg3kqGCRpSksd8Kh7Q0=/full-fit-in/4000x4000/filters:no_upscale():fill(white):strip_exif()/f/image/ajgdSrmCwj4lm7ZAiHJJWV8F.png
Ook mag daarna niet nog een gebied van eenzelfde grootte afgesloten worden.

A3v, A6v, C5v, E4v en E6v (oranje) zijn ongeldige zetten geworden.

Wel mag je een gebied van andere grootte afsluiten
Bijvoorbeeld
A2v (blauw) -> gebied van 2 vakjes
D6v (groen) -> gebied van 3 vakjes
Afbeeldingslocatie: https://tweakers.net/i/mL0ojtaSYo6V65rFEXhpPBgs18k=/full-fit-in/4000x4000/filters:no_upscale():fill(white):strip_exif()/f/image/R6oQyDmtAV1P4bkOWlUVZ8VG.png
Het spel eindigt als er geen lijnen meer gezet kunnen wordenAfbeeldingslocatie: https://tweakers.net/i/oMFaofMIUvep33dG3abydE0cCSY=/full-fit-in/4000x4000/filters:no_upscale():fill(white):strip_exif()/f/image/Kp3RduXsZcfTRw54Ul70uwE5.png
De winnaar krijgt 100 punten, de verliezer 50
Als je denkt dat je gaat winnen, kun je voor extra punten ook nog een uitroepteken achter je zet meegeven.
Maar als je dan toch verliest, krijg je helemaal geen punten.

Bovenstaand voorbeeld is ook als voorbeeld spel op de site te bekijken.

Talen waarin je mee kan doen

Pascal, C, C++, Java, Javascript, Python, Haskell en OCaml
C# wordt dus niet ondersteund

Competitie

De finale is op 23 januari 2021

Je kunt op elk moment een (nieuwe) versie van je programma opsturen.
Die krijgt maximaal 30 seconden CPU denktijd, op een 3.1GHz XEON CPU, single threaded met max 256MB geheugen.

Elke 3 weken wordt een testcompetitie gehouden, waaraan je inzending meedoet.
Zo kun je alvast testen hoe goed je programma het ten opzichte van anderen doet.

De eerstvolgende testcompetitie is op 22 augustus
Daarna (vermoedelijk) 12 september, 3 oktober, 24 oktober, 14 november, 5 december en 2 januari

Om lokaal versies tegen elkaar te laten spelen is er caia
Dit is beschikbaar voor OSX en Linux.
Voor Windows 10 is er een Cygwin versie of moet je met Subsystem for Linux aan de slag.

500 "The server made a boo boo"


Acties:
  • 0 Henk 'm!

  • Vaan Banaan
  • Registratie: Februari 2001
  • Niet online

Vaan Banaan

Heeft ook Apache ontdekt

Topicstarter



Ook dit spel lijkt weer bedrieglijk simpel, maar is het niet.
Om iets te maken, wat een beetje presteert, zul je er een hoop tijd in moeten steken, het is zeker niet te vergelijken met iets als de Advent Of Code series

Vorig jaar ben ik nog 2de geworden met Gomoku (beginnersgeluk?), maar dit jaar hang ik nog wel even laag in de middenmoot ben ik bang.
Soultaker heeft overigens in 2011 met DVONN gewonnen

Uiteindelijk komt het er bij elk spel op neer, om je tactiek en beslissingsboom zo snel / intelligent / klein mogelijk te maken.

Het spel van dit jaar lijkt geschikt voor Monte Carlo Tree Search,
dat is waar Google's AlphaGo een aantal jaar geleden het nieuws mee haalde.
Tenminste dat was mijn eerste gedachte.
Aangezien je niet snel ziet, of een zet goed is of niet, heb ik geen idee hoe ik een evaluatie in een minimax (variant) kan stouwen.

Ik heb nu voor het eerst een mcts functie in mijn bot gebouwd.
Die heeft de testcompetitie van 1 augustus gespeeld, maar was nog niet echt een succes.
Sowieso verlies ik nog altijd van de testspeler, die je inzendingen valideert.

[ Voor 95% gewijzigd door Vaan Banaan op 15-08-2020 12:46 ]

500 "The server made a boo boo"


Acties:
  • 0 Henk 'm!

  • Bolukan
  • Registratie: Oktober 2002
  • Laatst online: 06-07 21:04
2^60 bordsituatie, 1.152.921.504.606.850.000 combinaties, zal wel te veel zijn voor bruto-force ja.

Acties:
  • 0 Henk 'm!

  • Vaan Banaan
  • Registratie: Februari 2001
  • Niet online

Vaan Banaan

Heeft ook Apache ontdekt

Topicstarter
Nou het is eigenlijk 60! en zelfs dat nog niet eens.
Met dit spel heb je maximaal 41 zetten, alleen heb je in het begin wel max 60 x 59 x 58 x 57 (afgesloten gebied van 1) x 56 x 55 x 54 of 53 (iets wat niet meer afgesloten mag worden) enzovoort.
In ieder geval veeeeel te veel mogelijkheden.

Met de wedstrijd van vorig jaar (soort van 5 op een rij) had je bij elke zet wel een grof idee of die zet slim was of niet.
Daarom ging, van wat ik heb gelezen, de betere spelers (en ik ook) voor Alpha Beta pruning met o.a. een transposition table (om dubbele stellingen niet nog een keer te berekenen)
En in mijn geval ook nog eens sortering na elke zet, om de boom flink te snoeien.

Met dit spel heb ik niet het gevoel dat je vooraf kan bepalen of een zet goed is of niet. Maar je hebt wel 30 seconden CPU tijd, dat is lekker veel.
Vandaar dat ik met de Monte Carlo Search Tree aan de slag ben gegaan. Had ik alleen maar over gelezen, maar het viel me nog mee om te programmeren.

Bij het begin van het spel gaat dat als volgt:
  • Je begint met een root node: 0 simulaties, 0 gewonnen
  • Je kiest een willekeurige zet (expansion) daar maak je een node van in de boom, ook weer 0 simulaties, 0 gewonnen
  • Dan doe je weer een rits random zetten, tot het spel is afgelopen (simulation)
  • Voor de nodes van de net gemaakte expansion tot de root (nu nog maar 2 nodes diep) doe je een +1 voor aantal simulaties en voor de gewonnen potjes bij de node(s) met zet van de tegenstander (is nu alleen nog maar de desbetreffende expansion node) een +1 gewonnen
    Dat is de back propagation
Dat doe je dan bij de eerste zet voor alle 60 mogelijkheden (als je mag beginnen), zodat de root node volledig expanded is.
En dan treedt het briljante deel van mcts in werking: de selection
Omdat de root node volledig expanded is, kan die een zet verder gaan "denken". Maar welke child node is nu het beste?
Over een goede keuze wordt nog steeds veel onderzoek gedaan en heet Upper Bound Confidence in Trees, ik gebruik de pure (originele) formule: Wi / Si + C * sqrt(log(Sp) / Si)
Wi = gewonnen potjes child
Si = gesimuleerde potjes child
C = exploration parameter
Sp = Aantal gesimuleerde potjes parent (in het begin is dat de root)

Op de expanded nodes laat je die formule los:
  • met Wi / Si kun je de beste winst factor van een node berekenen (exploitation)
  • Maar omdat je maar wat random simulaties doet, wil je ook wel andere zetten bekijken (exploration) Mischien had een node pech en een kneus random simulation, maar is die stiekem toch wel ok.
    Daarvoor is C * sqrt(log(Sp) / Si)
    Met de C kun je de agressie instellen. Met een kleine C zal die meer exploiten (dieper de boom in), met een hoge meer exploren (waardoor je boom sneller breder wordt)
    Een balans hierin is de waarde sqrt(2)
  • De node met de hoogste waarde is de "dat lijkt me wel een goede zet" en met die ga je weer een expansion en een simulation doen.
Dat doe je dan zo vaak mogelijk en uiteindelijk kies je de root-child met de meeste simulaties als beste zet.
Dat hoeft dus niet de node te zijn met de meest gewonnen potjes en dat maakt het hele principe lastig te doorgronden.

Het mooie van dit ding is, dat je boom asymmetrisch opgebouwd wordt. Maar dat je niet, zoals met alpha-beta, een diepte hoeft te gokken of klooien met iterative deepening, sorteringen of andere kunstgrepen.
Voorwaarde is wel, dat je veel simulaties moet kunnen doen binnen de gestelde tijd, zodat een zet niet al te gok-de-goals wordt,
Naarmate het spel vordert, zal dit algoritme automagisch richting ideale zet(ten) neigen.

Verder heb ik de simulation niet helemaal random gemaakt, dat heet overigens Policy, maar mag in mijn programma geen naam hebben.
Het is in ieder geval geen artificial-neural-network-deep-supervised-reinforcement-learning-glazen-bol-hocus-pocus-agent-heuristics
Het lastige is, als je de simulation "slim" probeert te maken, er bevooroordeelde zetten kunnen ontstaan. Dat werkt het algoritme juist tegen, dus random doet het eigenlijk nog het best goed. Alleen wordt je boom snel onmeunig groot.
-edit- de policy is juist de hocus-pocus en bepaalt je selection strategie, kom ik nu achter tijdens het lezen van weer vanalles en nog wat.

Overigens had ik een ongelooflijke domme fout gemaakt in die formule.
Hij deed ruim een miljoen simulaties (over het hele spel) maar was nog steeds te dom was om te kakken.
Nu ik deze bug heb opgelost heb ik ook voor het eerst van de testspeler gewonnen (die valideert je programma)
YEAH!!

[ Voor 13% gewijzigd door Vaan Banaan op 12-08-2020 10:52 ]

500 "The server made a boo boo"


Acties:
  • 0 Henk 'm!

  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 22:25
Leuke challenge! Beetje kamertje verhuren, maar dan anders. Lijkt me ook een mooie case voor reinforcement learning: Wikipedia: Reinforcement learning

Je kan het algoritme vaak genoeg tegen zichzelf laten spelen om het zo te trainen. Ook de reward structure is overzichtelijk, al kan het natuurlijk zijn dat eerst iets weggeven later meer oplevert.

Acties:
  • 0 Henk 'm!

  • Bolukan
  • Registratie: Oktober 2002
  • Laatst online: 06-07 21:04
Het lijkt toch echt een impartial game, dus 2^60. De volgorde van de streepjes maakt echt niet uit.

PS: In het voorbeeld kan toch bijvoorbeeld E2v of E2h worden gespeeld? Oftewel het gebied van 9 splitten in 4 en 5?

[ Voor 27% gewijzigd door Bolukan op 13-08-2020 08:20 ]


  • BSTNjitRam
  • Registratie: November 2004
  • Laatst online: 22:55
Bolukan schreef op woensdag 12 augustus 2020 @ 19:52:
Het lijkt toch echt een impartial game, dus 2^60. De volgorde van de streepjes maakt echt niet uit.
2^60 impliceert dat er elke zet 2 opties zijn. Echter zijn er 60 posities waar de eerste streep gezet kan worden. Doordat die daarna niet meer mogelijk is, zijn er voor de 2e streep nog 59 posities over. Echter zijn deze posities dmv rotaties en spiegelingen uiteraard veel verder terug te brengen (A1h is technisch gezien dezelfde openingsmove als E6v maar dan 90 graden geroteerd).
Bolukan schreef op woensdag 12 augustus 2020 @ 19:52:
PS: In het voorbeeld kan toch bijvoorbeeld E2v of E2h worden gespeeld? Oftewel het gebied van 9 splitten in 4 en 5?
Uit de regels van de startpost:
Binnen een gebied (als dat meer dan 1 vakje is) mag je geen lijnen meer zetten

Wishlist Backpack Survivors op Steam !


  • Bolukan
  • Registratie: Oktober 2002
  • Laatst online: 06-07 21:04
Ah op die manier. Ik doelde op het maximaal aantal bordposities. Zoals hieronder.
NB: Die regel had ik over het hoofd gelezen. Een 9 splitsen in 4 en 5 is dus illegaal.

zet# bordmogelijkhedenontspiegeld
011
1609
21.770243
334.2204.323
4487.63561.314
55.461.512683.014
650.063.860etc
7386.206.920
82.558.620.845
914.783.142.660
1075.394.027.566
11342.700.125.300
121.399.358.844.975
135.166.863.427.600
1417.345.898.649.800
1553.194.089.192.720
16149.608.375.854.525
17387.221.678.682.300
18925.029.565.741.050
192.044.802.197.953.900
204.191.844.505.805.490
217.984.465.725.343.800
2214.154.280.149.473.100
2323.385.332.420.868.600
2436.052.387.482.172.400
2551.915.437.974.328.300
2669.886.166.503.903.500
2788.004.802.264.174.700
28103.719.945.525.635.000
29114.449.595.062.769.000
30118.264.581.564.861.000
31114.449.595.062.769.000
32103.719.945.525.635.000
3388.004.802.264.174.700
3469.886.166.503.903.500
3551.915.437.974.328.300
3636.052.387.482.172.400
3723.385.332.420.868.600
3814.154.280.149.473.100
397.984.465.725.343.800
404.191.844.505.805.490
412.044.802.197.953.900
42925.029.565.741.050
43387.221.678.682.300
44149.608.375.854.525
4553.194.089.192.720
4617.345.898.649.800
475.166.863.427.600
481.399.358.844.975
49342.700.125.300
5075.394.027.566
5114.783.142.660
522.558.620.845
53386.206.920
5450.063.860
555.461.512
56487.635
5734.220
581.770
5960
601
Totaal1.152.921.504.606.850.000
2^60 =1.152.921.504.606.850.000

[ Voor 18% gewijzigd door Bolukan op 14-08-2020 23:22 ]


Acties:
  • 0 Henk 'm!

  • Vaan Banaan
  • Registratie: Februari 2001
  • Niet online

Vaan Banaan

Heeft ook Apache ontdekt

Topicstarter
Ehm je krijgt maar 256MB geheugen, dus die aantallen boeien me totaal niet :)
En Monte Carlo + transposition table is overigens andere koek dan bij een MiniMax(variant) boom. Daar ga ik me nog even niet aan wagen.

Ik krijg iets van 1,5 miljoen expanded nodes (dus simulaties) weggestouwd binnen de tijd.
Ben nu een beetje aan het experimenteren met hetvolgende:
Doe je elke zet ongeveer 1,5 seconden, of de eerste x zetten quasi random en ga je de laatste y zetten lange tijd broeden op een uitkomst?
Had al een versie die elke ronde steeds iets meer zoekt, maar zo'n burst halverwege / driekwart lijkt het tegen de validatiespeler net iets beter te doen.
Ik denk dat ik eerst maar zelf eens een manager ga schrijven, zodat ik versies tegen elkaar kan laten spelen.

En later ga ik nog eens uitzoeken hoe ik, als een potje al vrij ver gevorderd is, delen kan ontdekken die er niet toe doen. Dat wil zeggen: er zijn nog een paar muurtjes in een stukje veld over, die niet meer helemaal dichtgezet kunnen worden.
Dan maakt het eigenlijk niet zoveel uit welk muurtje je zet. Meestal is het aantal toch hetzelfde.
Ik denk dat daar de meeste winst zit, maar dat idee moet bij mij nog even pruttelen.

500 "The server made a boo boo"


Acties:
  • 0 Henk 'm!

  • Bolukan
  • Registratie: Oktober 2002
  • Laatst online: 06-07 21:04
Tijd verdelen waar de meeste waarde (om het verschil te maken richting winnen) is te behalen. Ik denk ook dat 20 x 1,5 sec niet optimaal is, Heb je nagedacht over een voorbereid openingsboek?

Acties:
  • 0 Henk 'm!

  • Vaan Banaan
  • Registratie: Februari 2001
  • Niet online

Vaan Banaan

Heeft ook Apache ontdekt

Topicstarter
Ja, maar openingbook komt bij mij altijd op de laatste plaats == nog nooit van gekomen.
Dat wil ik dit jaar anders doen, ik ben met deze competitie al vanaf dag 1 (begin juli) aan het brainstormen..
Maar er zijn nog zat optimalisaties mogelijk, die zal ik toch moeten aanspreken als het openingbook uitgeput raakt.

PS: de sourcecode mag max 1.44MB groot zijn en moet in 1 file staan. En niets van/naar bestanden lezen of schrijven, memory only (256MB)

Morrar schreef op woensdag 12 augustus 2020 @ 09:25:
...Lijkt me ook een mooie case voor reinforcement learning: Wikipedia: Reinforcement learning,,,,
Ik heb een haat-liefde verhouding met algoritmes op Wikipedia.
Op die Wiki ben ik al tig-keer vastgelopen vanwege allerlei verwijzingen, die weer verwijzen naar een verwijzing waar ik allemaal de ballen verstand van heb. Het is zo overweldigend en abstract dat ik er steeds memory overload van krijg.
Q-learning, Bellman equation, Stochastic environments, Markov Decision Processes, WTFBBQ en weet ik wat.
En dan ook nog zonder een regel pseudocode. Het is dat ik wiskunde altijd leuk heb gevonden, anders had ik dat allang opgegeven.
Hier bijvoorbeeld wordt het allemaal net even wat makkelijker uitgelegd met plaatjes en code :) Dan lees ik daarna de wiki nog wel eens door, als ik er aan toe ben.

Sowieso wordt dat dan een offline simulatie, die meerdere dagen zal moeten lopen, om er iets bruikbaars uit te laten komen.
En dat moet dan op een of andere manier nog in die ene sourcefile en mag niet al te groot zijn.
Wel weer handig voor een openingsboek, maar voor mij nu allemaal nog te hoog gegrepen voor de online competitie.

[ Voor 75% gewijzigd door Vaan Banaan op 15-08-2020 23:34 ]

500 "The server made a boo boo"


Acties:
  • +1 Henk 'm!

  • boreus
  • Registratie: December 2011
  • Laatst online: 08-07 10:49
Ik ben vooral druk geweest zo vroeg mogelijk(*) het eindspel door te kunnen rekenen. Met een winnende score vaak rond 106 lijkt dat redelijk gelukt, als ik vergelijk met de resultaten van de vorige testronde.

(*) Lastig om het goede moment te kiezen; vrij pijnlijk als je te vroeg alles gaat doorrekenen.

Opening en middenspel heb ik nog niet echt goede ideeën voor.

Succes allemaal morgen!

Acties:
  • +1 Henk 'm!

  • Vaan Banaan
  • Registratie: Februari 2001
  • Niet online

Vaan Banaan

Heeft ook Apache ontdekt

Topicstarter
Tof dat je meedoet!
Dat moment van flink doorrekenen is inderdaad lastig. Ik reken nu net voorbij de helft van het spel flink door, maar dat is het ook niet altijd.
Deze testronde ben ik toch ook aardig gestegen, sta nu 7de overall (8ste met unofficials meegerekend).

Ik ben nog aan het brainstormen over het eindspel.
Mijn huidige versie doet nog veel te veel onnodige combinaties, waardoor ik geen enkel spel heb gewonnen met meer dan 102 punten.
Bijvoorbeeld:
Afbeeldingslocatie: https://tweakers.net/i/YI3IyUGs-8i1Gh77upFkr9_bn4Y=/full-fit-in/4000x4000/filters:no_upscale():fill(white):strip_exif()/f/image/RZzpMPp64Ci5IuQenFqyPUMh.png?f=user_large
Hier vallen enorm veel combinaties af.
De 1-tjes zijn allemaal stukjes veld, waar nog maar 1 muur gezet kan worden. Welke boeit niet, dat zijn altijd in totaal nog maar 3 zetten.
De roze muren zijn ook altijd 3 zetten. En als je de 2 grijze muren eerder zet, hou je nog maar een combi van 2 roze muren over.

Hier moet dus al makkelijk een eindspel uit te peuteren zijn. Met dan inderdaad een score van 106/107
In ieder geval zie je ook al veel eerder, of dit potje sowieso wel te winnen valt.

500 "The server made a boo boo"


Acties:
  • 0 Henk 'm!

  • boreus
  • Registratie: December 2011
  • Laatst online: 08-07 10:49
Mijn eindspel berekening moet het nu hebben van optimalisatie en caching. Dat kost ook wat geheugen (ging slecht bij de test competitie; voortaan met ulimit -v 250000 testen).

Qua opening heb ik nu een lijstje met standen waarin ik weet dat ik kan winnen en daar probeer ik dan naar toe te spelen.

De huidige nummer 1 scoort af en toe 110 punten, dus er is nog wel ruimte voor verbetering.
(Er zit ook iemand bij die bluft af en toe 110 punten. Ik heb de nummer 1 geen 0 punten zien scoren.)

Jouw idee lijkt me wel wat, maar ik heb het gevoel dat het nog niet genoeg is voor 110 punten.

Ik ga mijn zoekfuncties opschonen, omdat ik denk dat daar nog wel winst te halen is met een goede heuristiek voor de volgende zet. Momenteel geeft mijn programma het een beetje op als hij door heeft dat de tegenstander een winst kan forceren, dus daar moet ook nog wat aan gedaan worden.

Acties:
  • 0 Henk 'm!

  • Vaan Banaan
  • Registratie: Februari 2001
  • Niet online

Vaan Banaan

Heeft ook Apache ontdekt

Topicstarter
Ik heb net een fabeltastische optimalisering gevonden: de tijd.
Met ver doorrekenen houd ik rekening met de verstreken tijd, maar ik kom er nu net achter dat ik de wall-time heb gebruikt.
Oftewel: ook de tijd die de tegenstander gebruikt |:( :X 8)7 :'(

In deze testcompetitie heeft mijn programma dus een behoorlijke rits potjes gespeeld met 13-15 seconde rekentijd, MAN wat is dit frustrerend. AAAGGHHH

En ik dacht al bij het valideren van mijn inzendingen: waarom heeft dat ding nog zoveel tijd over? Nou ja, gewonnen is gewonnen. En door... :|
Aan de andere kant heb ik nu van alle spelers een grove indicatie, wanneer zij er vol voor gaan.

500 "The server made a boo boo"


  • Vaan Banaan
  • Registratie: Februari 2001
  • Niet online

Vaan Banaan

Heeft ook Apache ontdekt

Topicstarter
Met de testcompetitie van vandaag weer een plekje gestegen.
Maar de beste spelers hebben wel heel veel meer punten.

In dit spel ben je overigens wel zwakker als je moet beginnen.
Gewonnen
1ste zetlaatste
Winnaar1419 (alles)
2de1219 (alles)
ik (6de)1017

Ik denk dat mijn mcts-random-mover niet heel veel sneller meer kan.
In ieder geval heeft die bij verloren potjes vaak nog geen flauw idee dat die kansloos is, terwijl de tegenstander al wel weet dat die heeft gewonnen.
Komende weken ga ik dus maar gegevens verzamelen van de gespeelde potjes van de afgelopen testcompetities.
Mogelijk is er iets te halen uit het aantal overgebleven geldige zetten per beurt of zo (even / oneven)
Dat heb ik al heel vroeg laten varen, maar misschien is daar toch nog iets van een heuristic voor te bakken.

[ Voor 83% gewijzigd door Vaan Banaan op 12-09-2020 15:46 ]

500 "The server made a boo boo"


Acties:
  • 0 Henk 'm!

  • boreus
  • Registratie: December 2011
  • Laatst online: 08-07 10:49
Weinig tijd gehad om er mee bezig te zijn, maar wel even een app en een API opgezet:

https://dewildeit.nl/zuniq/
https://dewildeit.nl/swag...3/api-docs/swagger-config

Er staat een sample scriptje bij dat je (met wellicht enige aanpassing) kunt gebruiken om tegen je eigen bot te spelen. Ik kwam er daardoor achter dat mijn bot toch wel echt heel dom gaat spelen op het moment dat hij vindt dat de stand verloren is.
Vaan Banaan schreef op maandag 24 augustus 2020 @ 22:04:
Ik heb net een fabeltastische optimalisering gevonden: de tijd.
Met ver doorrekenen houd ik rekening met de verstreken tijd, maar ik kom er nu net achter dat ik de wall-time heb gebruikt.
Oftewel: ook de tijd die de tegenstander gebruikt |:( :X 8)7 :'(

In deze testcompetitie heeft mijn programma dus een behoorlijke rits potjes gespeeld met 13-15 seconde rekentijd, MAN wat is dit frustrerend. AAAGGHHH

En ik dacht al bij het valideren van mijn inzendingen: waarom heeft dat ding nog zoveel tijd over? Nou ja, gewonnen is gewonnen. En door... :|
Aan de andere kant heb ik nu van alle spelers een grove indicatie, wanneer zij er vol voor gaan.
Heel herkenbaar dit :P
Goeie om te loggen voor wat extra info, de wall-clock time :)

Verder helaas geen updates gedaan voor de afgelopen ronde van oktober. Nu nog een paar kleine optimalisaties toegevoegd en random playouts zo lang het nog niet haalbaar is om alles door te rekenen.
Vaan Banaan schreef op zaterdag 12 september 2020 @ 13:46:
...
In dit spel ben je overigens wel zwakker als je moet beginnen.
...
Dat merk ik ook. Mijn eigen bot wint als 2e speler ook ruim 90% van de tijd (tegen zichzelf).

Nu probeer ik de situatie tijdens het spel om te draaien, door een kleine voorkeur te geven aan de zetten die het aantal mogelijke zetten voor mijn tegenstander even maakt. Een klein verschil helaas en ik heb net alweer van de validatie bot verloren als 2e speler :(

[ Voor 15% gewijzigd door boreus op 17-10-2020 19:10 . Reden: Toevoeging ]


Acties:
  • 0 Henk 'm!

  • Vaan Banaan
  • Registratie: Februari 2001
  • Niet online

Vaan Banaan

Heeft ook Apache ontdekt

Topicstarter
Nou, dat was een heel rare testronde.
Ik heb afgelopen 2 testrondes niets kunnen doen en toch is die oude versie gestegen van de 6de naar de 4de plaats?

@boreus Jouw versie heeft dit keer niet eens de finale gehaald?
Daar lijkt me een bug ingeslopen, of geheugenproblemen

Maartens sputnik, is waarschijnlijk gekelderd vanwege geheugenproblemen (volgens post op het forum daar). Ik heb zelfs een potje van hem gewonnen, terwijl hij de overwinning had geclaimd. Dat heb ik bij hem nog niet eerder gezien....

500 "The server made a boo boo"


Acties:
  • 0 Henk 'm!

  • boreus
  • Registratie: December 2011
  • Laatst online: 08-07 10:49
Sputnik deed het weer prima deze ronde. Mijn probleem was inderdaad geheugen. Tegenwoordig test ik altijd met ulimit -v 245000 en dat lijkt voldoende. Overstappen van een map naar een unordered_map scheelde ook flink.

Op dit moment verwacht ik op de 7e plek te blijven. Om hoger te eindigen moet ik wel echt iets anders gaan doen. Interessant vind ik wel dat Abdessamad El Kasimi tegen mij (en anderen) met zwart wel 110 punten haalt, maar met wit niet kan winnen.

Je kunt op dewildeit.nl/zuniq spelen tegen mijn bot trouwens. Zou leuk zijn als er meer bots zouden zitten. Met deze Dockerfile draai ik hem:
code:
1
2
3
4
5
6
7
8
FROM ubuntu:latest
RUN apt-get update && apt-get install -y openssl curl jq
RUN curl -L -o /websocat.deb https://github.com/vi/websocat/releases/download/v1.6.0/websocat_1.6.0_ssl1.1_amd64.deb && \
    apt-get install /websocat.deb && \
    rm /websocat.deb
ADD play.sh bot /
WORKDIR /
CMD while true; do ./play.sh ./bot; sleep 10; done

play.sh:
code:
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
#!/bin/bash

set -x

CMD=$1
BASE=${2:-https://dewildeit.nl/zuniq}
SOCK=${3:-wss://dewildeit.nl/zuniq/socket}

if [ ! -x "$CMD" ]
then
  echo "CMD is not executable"
  exit 1
fi

MATCH_KEY=`echo -n gina_; openssl rand -hex 8`
echo "Match key $MATCH_KEY"

PLAYER_KEY=`curl "$BASE/matches" -H "Content-type: application/json" -d '{"matchKey":"'$MATCH_KEY'"}' | jq -r .playerKey`
echo "Player key $PLAYER_KEY"

while [ `curl "$BASE/matches/$MATCH_KEY" | jq -r .currentPlayer` == "0" ]
do
    sleep 5
done

websocat --ping-interval 1000 -vvv "$SOCK?matchKey=$MATCH_KEY&playerKey=$PLAYER_KEY" "cmd:$CMD"

Acties:
  • 0 Henk 'm!

  • Vaan Banaan
  • Registratie: Februari 2001
  • Niet online

Vaan Banaan

Heeft ook Apache ontdekt

Topicstarter
Ik ben ook weer op mijn oude plek gezet (6de)
De tactieken van alle spelers zijn volgens mij heel divers.
Van een aantal sterke spelers kan mijn programma winnen, maar van andere "slechte" spelers zijn beide potjes kansloos verloren.

Beginnen en winnen blijft inderdaad lastig.
Ook de beste spelers verliezen meerdere keren als ze mogen beginnen, maar winnen wel (bijna) alles als de ander begint. En soms op hun duimpie (108+)
Ik vermoed dat het iets met het aantal mogelijkheden te maken heeft, of wat te snoeien of zo.

Voorlopig hoef ik met mijn Monte Carlo Tree Search nooit iets te snoeien, aangezien ik nog niet eens aan 50 MB aan stellingen ben gekomen. (k ben in C vanaf het begin behoorlijk aan het bitneuken geweest, een node is 56 bytes voor het bord, een aantal pointers en win / verlies status)
Dat lijkt totaal overbodig te zijn geweest, maar goed.

Inmiddels heb ik wel een aantal ideeën voor optimalisatie, maar dat is er nog niet helemaal van gekomen deze testcompetitie.
Heb toch nog iets geprobeerd met lookup tables, maar dat is echt een drama met Monte Carlo. Stats kloppen van geen meter meer en zonder evaluatie kun je een node ook niet als "al doorgerekend" beschouwen.
Ik heb dat maar snel weer opgegeven.
Enige vooruitgang is dat mijn programma nu over het algemeen een zet eerder ziet dat die gaat winnen (of verliezen)
Maar blijkbaar hebben andere spelers ook verbeteringen doorgevoerd, aangezien het geen effect heeft op mijn plaats in de ranglijst.
Dus vrolijk verder optimaliseren. Ik heb nog een heel ander idee, waar ik nog winst denk te kunnen behalen. Hopelijk voor de volgende testcompetitie klaar....

[ Voor 22% gewijzigd door Vaan Banaan op 19-11-2020 01:03 ]

500 "The server made a boo boo"


Acties:
  • +2 Henk 'm!

  • Vaan Banaan
  • Registratie: Februari 2001
  • Niet online

Vaan Banaan

Heeft ook Apache ontdekt

Topicstarter
Ok, de een na laatste testcompetitie is gespeeld.
Vanaf nu worden er 2 servers ingezet, waardoor dit keer 46 (van de inmiddels 47) spelers konden meedoen. Waarvan 9 NIO

Eindelijk heb ik een hash functie met mcts voor elkaar gekregen. Dat vond ik toch wel een enorme hersenbreker voor het goed werkte.
Daarna nog allerlei educated guesses gedaan als je moet beginnen met agressie, tijden en nodes snoeien (is met mcts eigenlijk net niet de bedoeling)

Maar het resultaat mag er wezen: 3de plaats! :*)
Wit (eerste zet): 10x verloren
Zwart: 1x verloren tegen nr. 20 :'(

Tomek Czajka gaat dit jaar zo te zien met 2 vingers in zijn neus winnen (3 jaar op rij en in totaal dan voor de 7de keer) Wat een baas is dat zeg...
(toch nog 10x verloren bij eerste zet, maar ook regelmatig winnen met 110, dus veel bonuspunten)
Op de 2de plek komt Joost Houben even als compleet nieuwe speler laten zien hoe het moet. (ook alleen 10x verloren bij eerste zet)
Dat was wel mijn WTF moment van vandaag.

Ik kan nog een beetje pielen met tijden en agressie. Hopelijk dat ik daarmee nog net een paar potjes meer kan winnen als ik moet beginnen. Maar dat is echt natte vingerwerk aan het worden.
Verder is mijn trukendoos op dit moment even leeg.

-edit-
Blijkbaar heet dat pielen in AI termen: Domain Knowledge.
En blijkbaar deed ik pogingen met Progressive Bias en Progressive Unpruning. Maar dan de houtje touwtje vorm. :P

In wezen is het allemaal hetzelfde als een Heuristic
Bij mcts noemen ze het anders, omdat die waarde bij geen/weinig simulaties de dominante factor moet zijn voor de "kies-de-beste-volgende" en genegeerd kan worden bij veel simulaties (meer simulaties == meer de werkelijke waarde)
Oftewel: Waarde heuristic / (#simulaties + 1)

Ok, dan ga ik me daar nog op storten. Ik heb inmiddels tig tellertjes and what not, dus eens kijken of daar iets van te bakken is...
9 januari is de laatste testcompetitie, dus de laatste kans om nieuwe dingen uit te proberen en bij te schaven.
En dan 23 januari de finale.

[ Voor 29% gewijzigd door Vaan Banaan op 29-12-2020 02:04 ]

500 "The server made a boo boo"


Acties:
  • 0 Henk 'm!

  • PinjoTweaker
  • Registratie: November 2007
  • Niet online
Oef, dit spel is inderdaad moeilijker dan ik dacht. Ik heb een eerste versie in python gemaakt vlak voor de laatste test competitie, maar die is van de mat geveegd. Ik hoopte eigenlijk al een beetje onderaan de middenmoot te komen. Ook alle andere python spelers staan onderaan de lijst.

M'n verbetering gaat er vooral in zitten om het programma om te schrijven naar c++ en om er voor te zorgen dat het programma geen fouten meer maakt.

[ Voor 3% gewijzigd door PinjoTweaker op 01-01-2021 11:15 ]


Acties:
  • 0 Henk 'm!

  • KabouterSuper
  • Registratie: September 2005
  • Niet online
PinjoTweaker schreef op vrijdag 1 januari 2021 @ 11:14:
M'n verbetering gaat er vooral in zitten om het programma om te schrijven naar c++ en om er voor te zorgen dat het programma geen fouten meer maakt.
Jammer dat je geen Pypy mag gebruiken. Qua snelheid lijkt dat veel meer op c++. In een andere wedstrijd draaide mijn code met Pypy 6 keer zo snel als met python zelf.

When life gives you lemons, start a battery factory


Acties:
  • 0 Henk 'm!

  • Vaan Banaan
  • Registratie: Februari 2001
  • Niet online

Vaan Banaan

Heeft ook Apache ontdekt

Topicstarter
Waar mijn programma in het begin de fout in ging, is dat sommige muren die ongeldig zijn geworden, later soms wel weer gezet mogen worden.
Bijvoorbeeld:
code:
1
2
3
4
5
6
7
8
9
10
11
.-.-.
|   |
. . .
|    <- ongeldig als 4 al gevuld is
.-.-.

.-.-.
|1| |
.-. .
|    <- mag nu wel als 3 nog niet gevuld is  
.-.-.


@PinjoTweaker Mocht je toch nog een poging willen wagen, dan hier een aantal tips / tactieken

Je kunt iets doen met even / oneven.
Het spel heeft dus maximaal 41 zetten (muren) met maximaal 6 afgesloten gebieden.
Bijvoorbeeld:
code:
1
2
3
4
5
6
7
8
9
10
11
.-.-.-.-.-.        .-.-.-.-.-.       .-.-.-.-.-.
| |                |   10    |       |    7    |
. .-.-.-.-.        . .-.-.-.-.       . .-.-.-.-.
|  6      |        |         |       |   |  8  |
.-.-.-.-.-.        .-.-.-.-.-.       .-.-.-. .-.
|    5    |   of   |    5    |  of   |         |
.-.-.-.-.-.        .-.-.-.-.-.       .-.-.-.-.-.
| 2 |  3  |        | 2 |  3  |       | 2 |  3  |
.-.-.-.-.-.        .-.-.-.-.-.       .-.-.-.-.-.
|1|    4  |        |1|    4  |       |1|    4  |
.-.-.-.-.-.        .-.-.-.-.-.       .-.-.-.-.-.

Het maakt bij dit spel dus niet zoveel uit het groot de gebieden zijn, maar meer hoe VEEL gebieden er afgesloten zijn. (en hoe)
In bovenstaande voorbeelden heb je 6 gesloten gebieden en zou je door te beginnen dus altijd* hebben gewonnen (41 zetten, laatste zet is dan dus altijd van speler 1)

Hetzelfde geldt bij aantal gesloten gebieden == oneven, dan wint degene altijd* die als laatste begint:
Bijvoorbeeld:
code:
1
2
3
4
5
6
7
8
9
10
11
.-.-.-.-.-.        .-.-.-.-.-. 
|                  |         | 
.-.-.-.-.-.        . .-.-.-.-. 
|                  |  15     | 
.-.-.-.-.-.        . .-.-.-.-. 
|    5    |   of   |         | 
.-.-.-.-.-.        .-.-.-.-.-. 
| 2 |  3  |        | 2 |  3  | 
.-.-.-.-.-.        .-.-.-.-.-. 
|1|    4  |        |1|    4  | 
.-.-.-.-.-.        .-.-.-.-.-.


* HELE DIKKE ALS:
Alleen als gebieden GEEN ONEVEN aantal "ontbrekende losse muren binnen afgesloten gebied" bevat.
code:
1
2
3
4
5
.-.-.-.-.       .-.-.
|   4   |  !=   |   |
.-.-.-.-.       . 4 .
                |   |
                .-.-.

In die laatste 4 "ontbreekt" één muur voor die dicht ging.

In het voorbeeld hieronder maakt het niet uit: (even aantal zetten ontbrekende losse muren)
code:
1
2
3
4
5
6
7
.-.-.-.                 .-.-.-.
|     | max. 2 muren    |     | max. 4 muren
. .6. . ontbreken       . . . . ontbreken
|     | binnen gebied   |  9  | binnen gebied
.-.-.-.                 . . . . 
                        |     |
                        .-.-.-.


Daardoor wordt de winst bij dit spel:
Beginnen:
Aantal dichte gebieden + totaal aantal "ontbrekende muren in afgesloten gebieden" == even: Gewonnen
Omgekeerd, als 2de beginnen:
Aantal dichte gebieden + totaal aantal "extra" == oneven: Gewonnen

-edit-
Omdat er nog maar 3 weken tijd is tot de finale, deze tip:
6 afgesloten gebieden heb ik maar een enkele keer gezien in de testcompetities

Bij de betere spelers zie je dat speler 1, tot ongeveer halverwege het spel, zo veel mogelijk kleine stukjes van het veld probeert af te "breken" om zo het aantal afgesloten gebieden even te maken (meestal 4)
Speler 2 probeert dat te verhinderen door dan op de rand muren te zetten.
Dat afbreken van de gebieden door speler 1, kan speler 2 makkelijk(er) tegengehouden.
Dat is volgens mij DE reden, dat speler 2 altijd van speler 1 kan winnen en niet andersom.

[ Voor 22% gewijzigd door Vaan Banaan op 02-01-2021 02:00 ]

500 "The server made a boo boo"


Acties:
  • 0 Henk 'm!

  • PinjoTweaker
  • Registratie: November 2007
  • Niet online
Ik heb nu een boel problemen gefixt. En volgens m'n unittest win ik nu altijd van een random agent. En ook voor het eerst Test Player A verslagen, wat volgens mij ook een random agent is.
Waar mijn programma in het begin de fout in ging, is dat sommige muren, die niet mogen, later weer wel mogen.
Ja, daar zat ik ook over na te denken. Ik denk dat in sommige gevallen hier een optimalisatie voor mogelijk is. Als een muur een ruimte van 3 afsluit en er zijn al ruimtes van 1, 2 en 3 dan kan je nooit een muur daar neer zetten. Maar als er alleen een ruimte van 3 is afgesloten dan kan die in doe toekomst nog wel. Namelijk als 2 losse ruimtes.
Je kunt iets doen met even / oneven.
Ik heb iets simpels geprobeerd door er voor te zorgen dat het aantal mogelijke zetten dat overblijft altijd even is. Maar dit hield geen rekening met de gebieden die nog afgesloten konden worden, dus dat was denk ik een slechte benadering.

Met het "aantal gebieden + het aantal extra muren in afgesloten gebieden" kan ik hopelijk nog wel wat. Maar eerst voor zorgen dat het allemaal sneller loopt!

Acties:
  • 0 Henk 'm!

  • Vaan Banaan
  • Registratie: Februari 2001
  • Niet online

Vaan Banaan

Heeft ook Apache ontdekt

Topicstarter
Als je van PlayerA beide potjes kunt winnen, moet je wel ergens rond plaats 20-25 kunnen komen.
Alleen op snelheid zou je dan nog ergens tussen 15 en 20 kunnen eindigen, maar dan houdt het wel op denk ik.
Ik heb iets simpels geprobeerd door er voor te zorgen dat het aantal mogelijke zetten dat overblijft altijd even is. Maar dit hield geen rekening met de gebieden die nog afgesloten konden worden, dus dat was denk ik een slechte benadering.
Met even / oneven heb ik tot in den treuren van alles mee geprobeerd, totdat het kwartje dus viel met aantal gesloten gebieden / nog niet gezette muren daarbinnen.

Ik ben er verder nog steeds niet helemaal uit, wanneer muren op de rand te zetten en wanneer juist niet.
(Met de laatste testcompetitie heb ik een behoorlijk aantal mogelijke zetten niet eens doorgerekend, wat dus toevallig wel heel goed uitpakte)

Daar valt misschien nog meer winst uit kan halen (met een heuristic?), maar al die tellertjes en slimmigheden maken mijn programma steeds weer een stukje trager.
Dus elke optimalisatie / slimmigheid moet ook steeds meer snelheidsverlies compenseren.

500 "The server made a boo boo"


Acties:
  • 0 Henk 'm!

  • PinjoTweaker
  • Registratie: November 2007
  • Niet online
Uiteindelijk 18de geworden dit keer met een pure mcts in c++. Daar ben ik al erg tevreden mee omdat ik nog tot gisteravond bezig was om allerlei pointer errors op te lossen. Toen dat eenmaal klaar was gebruikte het programma nog 350mb op het hoogtepunt. Maar daar blijkt met mcts een makkelijke oplossing voor te zijn, namelijk om nodes pas uit te klappen na een bepaald aantal bezoeken (https://stackoverflow.com/a/35666246/4054971). Effectief doe ik nu 2 simulaties per node voordat ik een node expand.

Wat mij trouwens verbaasd is dat een mcts met random simulaties al vanaf de eerste zet doorheeft dat beginnen als tweede een voordeel heeft. Als ik als eerste begin heb ik zo'n 45% kans op winst en als tweede zo'n 65%. Wel gek dat dat niet optelt tot 100% trouwens 🧐.

En door de echte toppers wordt ik nog gewoon 2 keer verslagen. En blijkbaar zien zij dat ook al 10 beurten voor het einde aankomen.

Ik ga nu aan de slag met een goeie heuristiek. Bedankt voor de tips! Ik ben er bijna uit hoe ik het kan aanpakken.

Acties:
  • 0 Henk 'm!

  • Vaan Banaan
  • Registratie: Februari 2001
  • Niet online

Vaan Banaan

Heeft ook Apache ontdekt

Topicstarter
Heel goed gedaan!
Ik kon tegen jou in de enige swiss round van vandaag niet van je winnen toen ik moest beginnen.
Dus even kijken waar je vorige test was geëindigd.
42ste plaats.... Whut !? :X 8)7 Helemaal in de war...

Boreus heeft behoorlijk huisgehouden met 4de plaats (zit zelfs in de 10000 punten groep) _/-\o_
Zonde van die ene timeout.... was dan waarschijnlijk zelfs 3de geworden!

Ik ben dit keer gezakt naar de 9de plaats
Die percentages 45 / 65 zie ik inderdaad ook ongeveer in het begin.
Dit keer 19 potjes verloren als ik moest beginnen (zelfs een keer van nr.48 :?) en weer maar 1 als ik als laatste moest.

Voor de finale dus ergens toch echt iets zien te verbeteren als ik moet beginnen.
En als ik als 2de start: gewoon dik bluffen en direct de overwinning claimen voor de bonuspunten :+

500 "The server made a boo boo"


Acties:
  • 0 Henk 'm!

  • frankm1309
  • Registratie: Januari 2021
  • Laatst online: 31-12-2022
Ik doe al een aantal rondjes mee, en eindig continu rond de 18e plaats. (betekent gelukkig wel dat ik telkens beter word, gezien de stijging van het aantal deelnemers.....)
@PinjoTweaker jij bent deze keer 17e geworden :-D. ik 18e.

Ik heb geëxperimenteerd met monte carlo tree search en minimax en een combinatie van die twee.
Ik kom er niet veel verder mee op dit moment. minimax geeft zekerder resultaten, maar die komen te laat om met de betere spelers mee te komen. Monte carlo geeft sneller redelijke percentages winstkansen (die ik dan vrolijk claim als overwinning), maar zit er ook wel eens naast. Dat levert een nul, waarmee je je eigen glazen behoorlijk in gooit.

Wat behoorlijk frustrerend is op dit moment: al mijn probeersels om het nog net ff beter te krijgen, leiden tot een trager programma en slechtere resultaten :(

Nog twee weken om een en ander te proberen. Met jouw suggesties hier @Vaan Banaan kan ik nog wel weer even vooruit. Tx!

Acties:
  • 0 Henk 'm!

  • boreus
  • Registratie: December 2011
  • Laatst online: 08-07 10:49
Eindelijk is het me gelukt om MCTS werkend te krijgen. Dat heeft ook wel een mooi resultaat opgeleverd in de afgelopen testcompetitie. Qua 110 punten halen: ik claim gewoon de overwinning als ik ruim de helft van de random playouts win. Soms levert dat een 0 score op, maar gelukkig in de afgelopen competitie niet.

Aangezien ik nog niet zo lang een werkende MCTS heb, hoop ik ergens nog 395 punten vandaan te kunnen halen voor de eindronde.

Qua strategische inzichten in het spel is het bij mij nu vrijwel helemaal 0. Voordat MCTS werkte, probeerde ik te zorgen dat het aantal mogelijke zetten even/oneven werd, maar dat is er voorlopig weer uit.

Nu ga ik eerst zorgen dat ik niet meer van Matthijs verlies.
Hier moet toch iets tegen te doen zijn.
https://www.codecup.nl/showgame.php?ga=169960

Acties:
  • 0 Henk 'm!

  • Vaan Banaan
  • Registratie: Februari 2001
  • Niet online

Vaan Banaan

Heeft ook Apache ontdekt

Topicstarter
Standaard mcts werkt verrassend goed zonder enige kennis.
Met wat heuristic gegok, is mijn laatste versie eigenlijk alleen maar slechter geworden. (met gestrekt been er in, ziet die een aantal tactieken niet meer)
Dat moet dus genuanceerder, of misschien maar helemaal laten varen.

@boreus
Jelle (19de) https://www.codecup.nl/showgame.php?ga=168715
en Tom (20ste) https://www.codecup.nl/showgame.php?ga=169660
Zo frustrerend....
Een goede strategie als je moet beginnen is met zo veel verschillende spelers gewoon heel lastig.
-edit-
Ga er overigens maar vanuit dat Tomek zijn troefkaart nog moet spelen en zomaar nog 500 punten vooruit springt (met openingsboek of ander slim algoritme)

[ Voor 13% gewijzigd door Vaan Banaan op 12-01-2021 23:41 ]

500 "The server made a boo boo"


Acties:
  • 0 Henk 'm!

  • cotix
  • Registratie: Mei 2015
  • Laatst online: 25-06 19:45
Vaan Banaan schreef op dinsdag 12 januari 2021 @ 23:34:
Standaard mcts werkt verrassend goed zonder enige kennis.
Met wat heuristic gegok, is mijn laatste versie eigenlijk alleen maar slechter geworden. (met gestrekt been er in, ziet die een aantal tactieken niet meer)
Dat moet dus genuanceerder, of misschien maar helemaal laten varen.
Jup, ik heb hier hetzelfde. Tientalle uren in slimme heuristics, verbeteringen dmv domeinkennis of andere tweaks en hij performed eigenlijk alleen maar slechter dan 'puur' mcts

Acties:
  • 0 Henk 'm!

  • boreus
  • Registratie: December 2011
  • Laatst online: 08-07 10:49
Er komt morgen nog een testronde!

https://www.codecup.nl/competitionlist.php

Acties:
  • 0 Henk 'm!

  • PinjoTweaker
  • Registratie: November 2007
  • Niet online
Thanks voor de heads up!

Ik had echt nog een extra test competitie nodig dus dat was boffen. Alleen jammer dat ik er pas vanmiddag achter kwam. De hele avond besteed aan mijn master plan om een heuristiek in te bouwen om er uiteindelijk achter te komen dat het daardoor niet beter wordt. Aargh.

Nu maar een versie ingestuurd die waarschijnlijk ietsje sneller is.

Acties:
  • 0 Henk 'm!

  • frankm1309
  • Registratie: Januari 2021
  • Laatst online: 31-12-2022
iedereen nog snel de laatste puntjes op de i gezet :-D
en nu hangt de hele boel al een tijdje.... balen! :(

Acties:
  • 0 Henk 'm!

  • Vaan Banaan
  • Registratie: Februari 2001
  • Niet online

Vaan Banaan

Heeft ook Apache ontdekt

Topicstarter
Hier ook hetzelfde probleem. Last minute optimalisering pogingen borked mijn versie steeds weer.
Maar achteraf kan ik concluderen dat nog geen enkele versie volledig bugvrij heeft gespeeld.
Note to self: Volgende keer TOCH WEL unit tests maken, de code brij wordt alleen maar erger ;(

-edit- Een extra testronde.... compleet over het hoofd gezien. :'(

-edit- 21 januari:
hehe eindelijk, alle fouten eruit (in ieder geval geen crashes, timeouts en foute zetten meer) Nu nog het geheugen, want dat begint behoorlijk krap te worden.
PinjoTweaker schreef op zaterdag 9 januari 2021 @ 17:46:
....Toen dat eenmaal klaar was gebruikte het programma nog 350mb op het hoogtepunt. Maar daar blijkt met mcts een makkelijke oplossing voor te zijn, namelijk om nodes pas uit te klappen na een bepaald aantal bezoeken (https://stackoverflow.com/a/35666246/4054971). Effectief doe ik nu 2 simulaties per node voordat ik een node expand.
.....
Ik ga nu aan de slag met een goeie heuristiek. Bedankt voor de tips! Ik ben er bijna uit hoe ik het kan aanpakken.
Ik ga met een laatste stuiptrekking een combi proberen.
Door van compleet doorgerekende stellingen alle andere zetten weg te knikkeren, hoop ik het geheugen nog net binnen de perken te houden.
En dan hoop ik met die aantallen een heuristic te kunnen fabrieken.
Geen idee of het wat wordt, nog 2 avonden om het werkend zien te krijgen.
Maar met de hand tactieken verzinnen, gaat wel definitief overboord.
-edit-
Whoa, dat had werkelijk totaal GEEN effect. Niet te geloven hoe goed standaard mcts werkt.
Ik heb nu wel een versie die soms van mijn beste versie tot nu toe (kerstversie) kan winnen als die moet beginnen, dus er lijkt toch nog ergens vooruitgang geboekt.
Maar misschien is die daardoor weer blinder tegen andere spelers, het blijft allemaal maar lastig.

[ Voor 83% gewijzigd door Vaan Banaan op 22-01-2021 10:38 ]

500 "The server made a boo boo"


Acties:
  • 0 Henk 'm!

  • boreus
  • Registratie: December 2011
  • Laatst online: 08-07 10:49
Mijn grootste verbeteringen zijn meestal ook alleen een snellere random playout of een andere optimalisatie, zodat mcts dieper komt. Al die andere "briljante" ideeën zijn ook heel lastig te testen, maar blijken na een nachtelijke testronde vaak ook helemaal niet te helpen.

Hoewel mijn versie van afgelopen maandag al in een aantal nachtelijke testrondes is verslagen, is het toch erg spannend om überhaupt nog een nieuwe versie in te sturen. Het gaat ook steeds maar om een procentje winst. De tegenstanders zullen ook niet stil zitten, dus er wel iets verbeterd worden natuurlijk.

Vandaag in ieder geval van ca. 200k random playouts naar ca. 210k random playouts per seconde gegaan (vanaf leeg bord). Hoe snel gaat dat bij jullie?

Acties:
  • 0 Henk 'm!

  • Vaan Banaan
  • Registratie: Februari 2001
  • Niet online

Vaan Banaan

Heeft ook Apache ontdekt

Topicstarter
4096 in 0.14 seconden, dus dat zal rond de 29K liggen.
Ik doe blijkbaar een hoop extra checks en andere dingen dan.
Maar mijn versie is nog steeds niet stabiel, krijg af en toe nog steeds segfaults.

500 "The server made a boo boo"


Acties:
  • 0 Henk 'm!

  • boreus
  • Registratie: December 2011
  • Laatst online: 08-07 10:49
Alle checks gaan hier volledig het raam uit tijdens de random playout.

Segfaults vanwege een memory (u)limit, of een bug ergens? Voor mij scheelde de overstap van map naar unordered_map een beetje qua geheugen gebruik, maar niet genoeg om van 350MB naar 250MB te gaan vrees ik.

Acties:
  • 0 Henk 'm!

  • PinjoTweaker
  • Registratie: November 2007
  • Niet online
Ook mijn briljante idee haalde niets uit. M'n theorie was dat aan het eind alleen [het aantal kamers] + [het aantal ongebruikte muren in die kamers] bepaalt wie er wint. Als dat even is wint de even speler, als dat oneven is wint de oneven speler. (Met dank aan Vaan Banaan, voor het oorspronkelijke idee). Dus m'n theorie was dat je alle mogelijke combinaties van eind kamers kunt uitrekenen, en dan voor elke mogelijke set van regio's tijdens het spel kunt uitrekenen welke set van eind kamers nog mogelijk is. En dan wil je natuurlijk dat er zo veel mogelijk sets van eind kamers zijn die in jouw voordeel zijn.

Maar na flink veel moeite en c++ geralatereede problemen bleek het slechter te werken.

Dus nu ben ik ook over gegaan op het zo snel mogelijk uitrekenen van random playouts. Grappig om te zien hoe veel verbetering daar nog in mogelijk is. Begin deze week duurde 1 random playouts nog 8 microseconde en nu 4,5. Dus ook ongeveer 200.000 per seconde.

1 verbetering die een halve microseconde opleverde was om zetten uit te sluiten die nooit meer kunnen. Bijvoorbeeld als de zet een kamer afsluit van 3, maar er ook al kamers van 1, 2 en 3 zijn. Dan kan die zet nooit meer.

Nu ben ik nog een competitie aan het uitvoeren om de juiste constante voor de mcts te vinden. Eerder gebruikte ik 2, maar rond de 1 lijkt beter te werken voor mij.

Ik ben heel erg benieuwd hoe de competitie gaat. Hopelijk gebruik ik niet teveel memory of teveel tijd ofzo. Dag zou allemaal goed moeten gaan maar je weet maar nooit.

Edit:
Aantal zettenper seconde is trouwens op m'n eigen computer. Weet niet wat het op de competitie computer is.

[ Voor 6% gewijzigd door PinjoTweaker op 23-01-2021 11:49 ]


Acties:
  • 0 Henk 'm!

  • boreus
  • Registratie: December 2011
  • Laatst online: 08-07 10:49
Zojuist mijn submission gedaan. Mijn submission ID is meer dan 100 hoger dan de vorige, dus men heeft niet stil gezeten deze week.
1 verbetering die een halve microseconde opleverde was om zetten uit te sluiten die nooit meer kunnen. Bijvoorbeeld als de zet een kamer afsluit van 3, maar er ook al kamers van 1, 2 en 3 zijn. Dan kan die zet nooit meer.
Zoiets heb ik ook, alleen leverde dat me maar 5% winst op.
Lijkt me leuk om morgen wat meer details te delen.

Succes allemaal morgen!

Acties:
  • 0 Henk 'm!

  • frankm1309
  • Registratie: Januari 2021
  • Laatst online: 31-12-2022
zin in morgen!
ben erg benieuwd of de laatste loodjes nog enig gewicht in de schaal gaan leggen.
56 spelers morgen. zou mooi zijn als de top 15 voor me in het verschiet ligt.
Hij is sneller, maar hoeveel sneller?
Met al die random playouts is het moeilijk versies te tweaken en tunen.
Een boel is op hoop van zegen.

We'll see

Acties:
  • 0 Henk 'm!

  • Vaan Banaan
  • Registratie: Februari 2001
  • Niet online

Vaan Banaan

Heeft ook Apache ontdekt

Topicstarter
Hehe, eindelijk de (hopelijk) laatste fouten opgelost.
Mijn probleem is dus geheugen. Om dat te besparen, heb ik een hash functie ontworpen, en iets wanneer de GC iets kan weggooien (Ik ben die C dinosaurus, dus dat moet je allemaal zelf schrijven)
Maar ik was ook nog steeds met een idee uit augustus bezig.
Afbeeldingslocatie: https://tweakers.net/i/YI3IyUGs-8i1Gh77upFkr9_bn4Y=/full-fit-in/4000x4000/filters:no_upscale():fill(white):strip_exif()/f/image/RZzpMPp64Ci5IuQenFqyPUMh.png?f=user_large
Ik heb nu dus een hashfunctie gemaakt die ook al die gekleurde 1 muurtjes meehashed en daarna alleen een oneven / even toggle hashed.
Het maakt dan dus niet meer uit welke muur in welk gebied je zet.

Verder kies ik daar dan ook alleen maar uit als het aantal zetten oneven is. (in bovenstaand voorbeeld: 3 zetten)
Als het aantal even zou zijn, zou de tegenstander er ook een kunnen kiezen en is het bord weer gelijk (en ook qua hash)
Mocht de tegenstander toch van even -> oneven gaan, dan maak ik een nieuwe node. De kans is groot dat die dan als beste stap de boel weer even probeert te maken (want dat was daarvoor ook al zo)
Bij die even stap vindt die namelijk weer de oude hash van 2 beurten terug met de hele subtree.

En het werkt ook voor bijvoorbeeld zo'n vierkantje van 2x2 vakjes, die je niet afgesloten wil hebben. (en 1 t/m 3 zijn al dicht)
code:
1
2
3
4
5
. - . - .     . - . - .     . - . - .
|   |   |     |       |     |       
.   .   .  =  . - .   .  =  . - . - .
|   |   |     |   |   |     |   |   |
.   .   .     .   .   .     .   .   .

Het maakt nu niet uit welke muurtjes je in welke volgorde zet, de hash is uiteindelijk voor alle te verzinnen varianten hetzelfde. Dus alle nodes komen bij dezelfde hashnode en gaat dan weer verder

Dat werkt nu eindelijk allemaal.
Eerder had ik dat alleen tegen mijn eigen versies getest.
Maar ik moet nog steeds iets met de gokfactor voor 10 bonuspunten, dus ik dacht: laat ik dat ding eens tegen de speler3 van de caiaio bundel spelen.
Resultaat: timeout, crash enzovoort.

- 03:30uur mijn definitieve inzending gedaan.
Zaten nog 9 uploads tussen mijn 01:00uur en mijn laatste versie.
Ben dus niet de enige nachtbraker. Lekker fanatiek allemaal!

Iedereen veel succes!

[ Voor 3% gewijzigd door Vaan Banaan op 23-01-2021 03:35 ]

500 "The server made a boo boo"


Acties:
  • 0 Henk 'm!

  • boreus
  • Registratie: December 2011
  • Laatst online: 08-07 10:49
Het nachtwerk lijkt niet voor niets! Heel spannend ook nog in de top zo halverwege de competitie. Aan het eind heeft iedereen de lastige wedstrijden dus dan wordt het interessant. Je ziet nu wel dat je gewoon heel consistent je bonuspunten moet pakken. Bij mij is er daarbij wel een risico op 0 punten, wat tot nu toe alleen tijdens de swiss ronde gebeurd is.

Edit: shit what happened?
https://www.codecup.nl/showgame.php?ga=178128

[ Voor 9% gewijzigd door boreus op 23-01-2021 09:53 ]


Acties:
  • 0 Henk 'm!

  • Vaan Banaan
  • Registratie: Februari 2001
  • Niet online

Vaan Banaan

Heeft ook Apache ontdekt

Topicstarter
Boreus: gefeliciteerd met je 6de plaats! d:)b

Wat een climax, 2 na laatste ronde 2x van jou gewonnen en in de 1 na laatste ronde jou net voorbij.
En dan de laatste ronde met een 0 sneuvelen tegen Matthijs, dus ik ben uiteindelijk toch 7de geworden.
(zie overigens het patroon tegen Matthijs)
https://www.codecup.nl/showgame.php?ga=180133 (ik 0)
https://www.codecup.nl/showgame.php?ga=176696 (jij ook 0)
https://www.codecup.nl/showgame.php?ga=179900 (Tomek zijn enige 0, dat heeft hem uiteindelijk zelfs de overwinning van dit jaar gekost!)
Dus misschien iets teveel gegokt, maar zonder die 110 claims was ik nog lager uitgekomen.

[ Voor 16% gewijzigd door Vaan Banaan op 23-01-2021 17:42 ]

500 "The server made a boo boo"


Acties:
  • 0 Henk 'm!

  • boreus
  • Registratie: December 2011
  • Laatst online: 08-07 10:49
Vaan Banaan schreef op zaterdag 23 januari 2021 @ 12:00:
Boreus: gefeliciteerd met je 6de plaats!

Wat een climax, 2 na laatste ronde 2x van jou gewonnen en je daardoor net voorbij.
En dan de laatste ronde sneuvelen tegen Matthijs, dus ik ben uiteindelijk 7de geworden.
Jij ook met nagenoeg dezelfde plaats :)
Je stond lekker lang bovenaan in het begin.
boreus schreef op dinsdag 12 januari 2021 @ 11:59:
(...) Nu ga ik eerst zorgen dat ik niet meer van Matthijs verlies.
Hier moet toch iets tegen te doen zijn.
https://www.codecup.nl/showgame.php?ga=169960
Niet gelukt om er iets tegen te doen dus.
Ik heb nog geluk gehad dat dit mijn enige 0 is en dat het tijdens de swiss round gebeurde.

Tomek en Abdessamad hebben een stukje geschreven op het forum daar waar ze uitleggen hun aanpak was.

Mijn aanpak was in het begin vooral optimalisatie met bits, want het bord paste zo mooi in een 64 bits integer. Daarmee heb ik een minmax geïmplementeerd die vooral veel cache gebruikte (uiteindelijk een max. gezet op 5,6M entries in een unordered_map). Dat leverde 106, 107, soms 108 punten op. T/m december was dat gecombineerd met een beginfase waarin ik per zet random playouts deed met een kleine bonus als het aantal mogelijk zetten even/oneven werd.

Pas in januari lukte het me om MCTS te implementeren (3e poging). Daarmee kon ik ook bij een bepaalde winstkans de overwinning gaan claimen. Dat heeft iedereen wel een beetje gedaan geloof ik, aan de nullen zo nu en dan te zien. De minmax fase is gebleven, maar ik heb geen tijd gehad om deze te versterken met de kennis uit de MCTS fase.

Grappig detail was nog wel dat ik de benodigde winstkans voor een claim op de overwinning een stuk lager instelde als mijn tegenstander met A1h of A1v begon. Nog niet gekeken of dat nog punten heeft opgeleverd.

Gisteravond had ik nog een interessante keuze voor de selectie van de winnende zet aan het eind van de MCTS:
1. Selecteer de node met de hoogste value (wins / n), of
2. doe een soort 1 niveau diepe minmax op de node values.

Aanpak 1 leek het iets beter te doen tegen zwakkere tegenstanders. Aanpak 2 was iets sterker tegen aanpak 1. Daarom heb ik aanpak 1 maar ingestuurd.

Acties:
  • 0 Henk 'm!

  • Vaan Banaan
  • Registratie: Februari 2001
  • Niet online

Vaan Banaan

Heeft ook Apache ontdekt

Topicstarter
Ik heb het met een graaf gedaan:
code:
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
/* Codecup 2021 Zuniq competition program
 *
 * The program uses the board as a graph
 *
 * Vertices are the grid cells + "outside-the-board-border" cells
 * Edges are the walls (perpendicular)
 *
 * Example: board grid of 4 x 3
 *
 *         vertical edges              horizontal edges
 *       (horizontal walls):           (vertical walls):
 *
 *        1    2    3    4              1    2    3    4
 *
 *          v0   v1   v2                  v0   v1   v2
 * A      . |  . |  . |  .        A     .    .    .    .
 *          |e0  |e1  |e2              e9   e11  e13  e15
 *     v3   v4   v5   v6   v7        v3---v4---v5---v6---v7
 * B      . |  . |  . |  .        B     .    .    .    .
 *          |e3  |e4  |e5              e10  e12  e14  e16
 *     v8   v9  v10  v11  v12        v8---v9--v10--v11--v12
 * C      . |  . |  . |  .        C     .    .    .    .
 *          |e6  |e7  |e8
 *         v13  v14  v15                 v13  v14  v15
 *
 * edge e0 is wall: A1h, e1: A2h, etc.
 * edge e9 is wall: A1v, e10: B1v, etc.
 *
 * NOTE: The competition uses a 6 x 6 grid which has (5 * 6) + (6 * 5) = 60 walls (or perpendicular edges)
 *       lookup tables and structs are mostly uint64_t cramped with bit shifted values
 *

Achteraf zou 1 vertex voor alle "outside-the-board"-cells misschien makkelijker zijn, maar goed...
Daarbij zijn alle border edges: bridge-edges (of cut-edges).
Met zetten van muren (of in mijn geval weghalen van edges) controleer ik of er muren bijkomen die het veld in stukken kan knippen, of stukken afsluiten. https://iq.opengenus.org/find-all-bridges-in-graph
Verder tel ik van elke edge (muur) hoeveel vertices (vakjes) er aan beide zijden zitten.
Dat inderdaad ook allemaal in 64bit.
Als een muur iets afsluit, heb ik alle andere "afsluit" edges met diezelfde waarde in een 64bit zitten, die worden dan ongeldig.

De hash
Voor het berekenen van een hashwaarde gebruik ik de zobrist hash methode Wikipedia: Zobrist hashing
Elke edge (muur) is een zobrist, een voor de speler toggle, voor elke grootte (25) gesloten vak en een even/oneven "loose" toggle

Elke zet maakt die muur een fixed-state edge
Zoals PinjoTweaker ook al deed: muren in een gebied die zeker-te-weten-helemaal-nooit-meer geldig worden, krijgen ook de status fixed-state muur.
En de muren van al die losse afgebroken stukjes veld zijn vaak ook fixed-state met alleen dus een even/oneven aantal zetten toggle.
De hash bereken ik dan door steeds de nieuwe fixed-state edges en player / loose toggle te hashen (rolling hash)

De mcts tree:
Ik heb de tree zo gemaakt dat de edges daarvan mcts-"edgenodes" worden en de nodes mcts-"hashnodes"
De structuur blijft dan node->edge->node->edge->node
De edgenodes zijn je zetten en bevatten de zet en stats (lokaal), de hashnodes zijn je nodes en bevatten ook stats (overall), maar zitten in een hashtabel
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
- EN WEER TREE TRANSPOSITION IDEE
          ____  move
         |    | #sim
 32 bytes|node| #win             EIGENLIJK IS DIT DE EDGE
 (25)    |____| *next_sibling
            |   *zobrist_node
            |
       _____V_____  hash
      |           | #sim
      | zobrist   | #win
48byte|  hash     | *first child
(45)  |  node     | *last child
      |           | unexplored_moves
      |___________| winner, player, child_count,
        /        \  child_game_over_count, child_expansion_count
       /          \
      /            \
   __/_    ____    _\__
  |    |  |    |  |    |
  |node|->|node|->|node|
  }____|  }____|  }____|

Allemaal heel mooi en aardig:
Met 2 miljoen edgenodes en een hashtable van 999983 (priem) hashnodes had ik al meer dan genoeg nodes voor het spel op de competitie server. (grofweg 115MB)
Hierbij zit ook Garbage Collection die gegarandeerd alleen oude / onnodige hashes en nodes laat overschrijven (eerdere en/of andere moves)

Het board
Het board zelf gebruikt bij mij iets meer dan 2kB, die moet ik bij elke zet opnieuw berekenen. Dat verklaart dus mijn "laag" aantal simruns/sec (29K) bij leeg bord.
Die grootte komt grotendeels, omdat ik van alle 60 muren 2x (beide zijden) een "graaf" heb met muren die via de vakjes nog bereikt kunnen worden (120x struct(64bit + nog wat chars) = 16bytes * 120= 1920 bytes)
Dat zou ook dynamisch moeten kunnen, omdat er per zet steeds minder overblijven.
Dat zou ik dan voor de betere zetten / tot bepaalde diepte nog in een of andere cache achtige structuur kunnen stouwen (nog ongeveer 140MB over) Volgens mij heb ik daar iets van Boreus over gelezen met wat in c++ een map heet?
Hmm, goed idee! Dat kan ik voor de volgende testcompetie... Oh wait... }:O
-edit- wacht eens even, ik heb dat eigenlijk al gemaakt voor de mcts hashnodes (Open addressing variant). Waarom valt dat kwartje nu pas!? |:(

Het spel: tijden, victory claim, agressiviteit
Als ik begin, gebruikte ik 0.9 + 0.08 * round seconde tijd
Tot round / depth 13 sla ik alle randmuren over als het mijn beurt was (in de mcts-tree) Dat is natte vinger pruning geweest.
Bij stat >= 50% op of na round 19, claim ik de winst. (3 x misgegokt)
Meestal vind die zelf de endstate tussen ronde 25 en 31. (107 - 104), meestal 29 (105)
Als ik als laatste begin, gebruikte ik 0.07 * round seconde voor de eerste 9 zetten (18 rounds) en 5.5 - 0.25 * (round - 20) voor de 2de helft.
Bij stat >= 62% winst op of na round 20 -> victory claim (1x misgegokt)
Daar is de endstate tussen round 24 - 32, meestal round 30 (105)
De c waarde bij de mcts-tree heb ik op 0.5 + child_game_over_count / child_count gezet. Het idee was om sneller breed te gaan als de hashnode (overall) slechter blijkt. Maar dat was bijna altijd te laat om nog effect te hebben.

Lang verhaal kort: ik heb weer enorm veel geleerd!
Met een extra hashtable met board positions, had ik mogelijk tijdwinst kunnen halen.
Met halverwege al 100000-en runs moet dat wel sneller zijn, dan steeds elke keer bij alle zetten het board bij te werken. Dat wordt dan eens uitzoeken welke hashtable variant ook bij een hoge load factor nog presteert Wikipedia: Hash table
Gecombineerd met de tip van PinjoTweaker: bij expansion nog niet in de cache, maar pas bij de eerste keer dat de zet bij een selection wordt gekozen (2de simulatie)

[ Voor 22% gewijzigd door Vaan Banaan op 24-01-2021 14:11 ]

500 "The server made a boo boo"

Pagina: 1