Volgens mij heb je wel pathfinding nodig, om ants naar food te sturen. Vooral in het maze land.
Mieren willekeurig laten lopen is inderdaad niet bepaald een optimale strategie. En vaak genoeg zijn er obstakels die direct doorlopen verhinderen.
Zojuist mijn eerste overwinning behaald, beurt 517: rank stabilized (Won at 141).
Bleek dat geen van mijn tegenstanders het nodig vond om te bewegen .
Het goede nieuws is dat mijn bot met 307 mieren geen time-out heeft gecreerd. Snelheid is dus wel in orde. Mijn volgende stap is om meerdere types van mieren te maken. Bijvoorbeeld verdedigers (blijven in de buurt van de hoop) en verkenners (verwijderen zich van de rest om de fog of war op te heffen, pakken geen voedsel oid op). Ben benieuwd hoe dat gaat werken.
Zojuist mijn eerste overwinning behaald, beurt 517: rank stabilized (Won at 141).


Het goede nieuws is dat mijn bot met 307 mieren geen time-out heeft gecreerd. Snelheid is dus wel in orde. Mijn volgende stap is om meerdere types van mieren te maken. Bijvoorbeeld verdedigers (blijven in de buurt van de hoop) en verkenners (verwijderen zich van de rest om de fog of war op te heffen, pakken geen voedsel oid op). Ben benieuwd hoe dat gaat werken.
Bezoek eens een willekeurige pagina
Heb er nu pathfinding inzitten. Alleen moet nog t een en ander tweaken. Want de huidige versie loopt uiteindelijk vast met het zetten van moves, ergens wordt er abusievelijk geregistreerd dat er al naar gemoved is terwijl dit niet zo is, waardoor mijn pathfinding still gaat staan.
Dus voorlopig blijft mijn oude bot nog online
.
Dus voorlopig blijft mijn oude bot nog online
Joepie, eindelijk een goed voedselzoekende ants geproduceerd (obv collaborative diffusion). Ze lopen alleen over elkaar heen (en hups 2 mieren minder), dus dat moet verholpen gaan worden. Ik lanceer hem wel even, want ik weet niet hoe laat ik de volgende release kan doen.
Ik programmeer het in C#.Net en alles is nieuw voor me. Het debuggen van de debug-mogelijkheden kostte me 2 uur. Het oplossen van de bug nog eens 10 minuten. Beetje zuur, maar leerzaam.
Zo ga ik me nu inlezen in "ICollection<Direction> directions".
Edit: Nieuwe versie gelanceerd, probleem verholpen. Ben aankomend uur aan de beurt.
Ik programmeer het in C#.Net en alles is nieuw voor me. Het debuggen van de debug-mogelijkheden kostte me 2 uur. Het oplossen van de bug nog eens 10 minuten. Beetje zuur, maar leerzaam.
Zo ga ik me nu inlezen in "ICollection<Direction> directions".
Edit: Nieuwe versie gelanceerd, probleem verholpen. Ben aankomend uur aan de beurt.
[ Voor 7% gewijzigd door Bolukan op 05-11-2011 22:55 ]
Je moet iets met "-no food" en nog iets anders doen in je bestandje. (ben het even vergeten) Het beste kan je echter gewoon de code van play_one_game.cmd nemen, die werkt met alle maps.Verwijderd schreef op zaterdag 05 november 2011 @ 16:23:
Ik heb andere problemen: bij de tutorial houd mijn bot het mooi 100 beurten vol. Ga ik echter een andere map laden kapt het programma er na 1 beurt mee zonder foutmelding. Er verschijnt niet eens een ant op het scherm
Enige nadeel aan de "play_one_game.cmd" is dat je niet ziet wie welke bot is.... ik ga er voor nu van uit de de laatste bot die ik opgeef (mijn eigen) ook de laatste speler is?
[ Voor 3% gewijzigd door sPENKMAN op 05-11-2011 22:11 ]
Eve char: Warock <TEST>
Ik dacht 'ff' van taal te wisselen... en dan 'ff' dat collaborative diffusion te implementeren zoals het hoort... ... zoek de fout... :-) Die freepascal omgeving klapt er bij mij uit... probleem in de debugger of iets dergelijks... en ook de bot dot voor geen meter wat ik wil... ...
Less = more
Verwijderd
'ff' inderdaad
Ik ben nu bezig om A* een beetje efficient te implementeren, zodat ik een beetje makkelijk food kan verzamelen. Dat doe je helaas niet 'ff'.
Maar nu ik erover nadenk.. je kan misschien beter een soort van zwaartekracht-achting ding implementeren. Ants stoten elkaar af en worden aangetrokken door food en enemy hills... maar dat is voor later. Dan heb je dat hele pathfinding ding ook niet nodig.
Ik ben nu bezig om A* een beetje efficient te implementeren, zodat ik een beetje makkelijk food kan verzamelen. Dat doe je helaas niet 'ff'.
Maar nu ik erover nadenk.. je kan misschien beter een soort van zwaartekracht-achting ding implementeren. Ants stoten elkaar af en worden aangetrokken door food en enemy hills... maar dat is voor later. Dan heb je dat hele pathfinding ding ook niet nodig.
Verwijderd
Ik heb het hele pathfinding laten varen... Door te voorkomen dat de ants naar dezelfde plaats terug gaan als ze de vorige ronde stonden en maximale afstand dat ze op enemy's, food en hills afgaan te beperken is het gelukt ze zichzelf te laten verspreiden.
Dit is wel ontzettend leuk om aan te werken...
Dit is wel ontzettend leuk om aan te werken...
[ Voor 8% gewijzigd door Verwijderd op 05-11-2011 23:57 ]
Ik heb A* geimplementeerd. Jou zwaartekracht idee klinkt wel leuk. Maar het probleem daarvan is is dat je Ants al snel met zn alle op 1 voedsel afgaan, en vervolgens met zn alle op de volgende dichtsbijzijnste voedsel (met zn alleeeuh, met zn aaahaaaleuh lalaVerwijderd schreef op zaterdag 05 november 2011 @ 23:30:
'ff' inderdaad![]()
Ik ben nu bezig om A* een beetje efficient te implementeren, zodat ik een beetje makkelijk food kan verzamelen. Dat doe je helaas niet 'ff'.
Maar nu ik erover nadenk.. je kan misschien beter een soort van zwaartekracht-achting ding implementeren. Ants stoten elkaar af en worden aangetrokken door food en enemy hills... maar dat is voor later. Dan heb je dat hele pathfinding ding ook niet nodig.
Dat zwaartekracht idee... dat is dus dat collaborative diffusion... ook interessant om te gebruiken... :-)
Toch gelukt om met pascal wat in elkaar te zetten... net geupload... ben benieuwd...
Toch gelukt om met pascal wat in elkaar te zetten... net geupload... ben benieuwd...
Less = more
Ik laat ze gewoon verspreiden door te zien waar de langste open ruimte is in hun omgeving (werkt heel goed in mazes) en ik gebruik heel beperkte pathfinding (gebaseerd op A*) om naar food te gaan binnen de 4 tiles. Werkt redelijk (niet echt heel efficient) en is vooral makkelijk te programmeren en uit te breiden.
ye dat is dus ook ongeveer hetzelfde als mijn prio map, alleen mijn prio map is dan nog iets geavanceerder zodat ik de locaties beter kan uitkiezen
[ Voor 46% gewijzigd door Ellos op 06-11-2011 00:07 ]
Verwijderd
Hmmm, de ants blijven enemy hills aanvallen, ookal zijn deze al gesloopt. Hoe kan je controleren of een enemy hill al gesloopt is?
De code in het standaardpakket onthoud niet waar vijanden zijn, maar vult elke ronde opnieuw een map aan de hand van de binnengekregen informatie. (Dus alleen dat binnen het zichtveld). Je krijgt niet duidelijk te horen dat iets vernietigd is, je krijgt gewoon het bestaan ervan niet meer door.
Om te controleren of het gesloopt is moet je zeker zijn dat de locatie binnen je zichtveld valt. Als dat zo is, moet je elke beurt op het bestaan worden gewezen.
Mijn mieren kunnen nog geen rekening houden met iets wat in de mist zou moeten (of kunnen zitten). Wel kijken mijn mieren 20 tegels (loopafstand, niet directe lijn) in de rondte voor mogelijke doelwitten. Dat is soms buiten het eigen gezichtsveld.
Om te controleren of het gesloopt is moet je zeker zijn dat de locatie binnen je zichtveld valt. Als dat zo is, moet je elke beurt op het bestaan worden gewezen.
Mijn mieren kunnen nog geen rekening houden met iets wat in de mist zou moeten (of kunnen zitten). Wel kijken mijn mieren 20 tegels (loopafstand, niet directe lijn) in de rondte voor mogelijke doelwitten. Dat is soms buiten het eigen gezichtsveld.
Bezoek eens een willekeurige pagina
@IWriteCode
Dat gaat snel van jou... Ik ben al 2 dagen aan het typen (1112 regels) en nog steeds niets wat op zich iets werkbaars doet...
Op het lijstje
- debugging/status output wat te regelen zodat ik nadien kan tweaken (bezig)
- omzetten van de input van een enkele turn naar de juiste interne structuren (bezig)
- daarna processen (diffusion toepassen)
- daarna goal selection per ant
- daarna moves en output terugsturen
Of ben ik aan't overengineeren
Dat gaat snel van jou... Ik ben al 2 dagen aan het typen (1112 regels) en nog steeds niets wat op zich iets werkbaars doet...
Op het lijstje
- debugging/status output wat te regelen zodat ik nadien kan tweaken (bezig)
- omzetten van de input van een enkele turn naar de juiste interne structuren (bezig)
- daarna processen (diffusion toepassen)
- daarna goal selection per ant
- daarna moves en output terugsturen
Of ben ik aan't overengineeren
ASSUME makes an ASS out of U and ME
Net een potje tegen een mede tweaker gespeeld, (CRiMiNaL/rme_2001): http://aichallenge.org/vi....php?game=63975&user=3745
Gewonnen ook nog
Met dan aan mijn heel simpele diffusion implementatie!
Wat aan het sleutel aan m'n bot... maar 'verbeteringen' die hebben allemaal een negatieve invloed
Gewonnen ook nog
Wat aan het sleutel aan m'n bot... maar 'verbeteringen' die hebben allemaal een negatieve invloed
[ Voor 23% gewijzigd door IWriteCode op 06-11-2011 09:34 ]
Less = more
Ik kan een beetje C++ programmeren, maar Python vind ik leuker. Is het dan toch beter om voor C++ te kiezen, vanwege de timeout restrictie?
Ik krijg de locale test maar niet werkend.. een python executable draait prima, maar een gewone executable krijgt ie maar niet gestart..
terwijl ik handmatig dezelfde executable in dezelfde dir wel gewoon kan starten..
[edit]
relatieve paden lust ie niet...
Failed to start ['./ants/build/ants']
terwijl ik handmatig dezelfde executable in dezelfde dir wel gewoon kan starten..
[edit]
relatieve paden lust ie niet...
[ Voor 7% gewijzigd door Arjan op 06-11-2011 10:53 ]
oprecht vertrouwen wordt nooit geschaad
* Matis gaat opnieuw beginnen, maar dan onder Linux.
Ik krijg het debuggen onder Windows niet aan de praat
In Linux maar eens proberen een fifo te implementeren.
Ik krijg het debuggen onder Windows niet aan de praat

If money talks then I'm a mime
If time is money then I'm out of time
Jij verslaat me en Janoz gaat ook al erg lekker met z'n bot, tijd om een nieuwe versie te uploaden!IWriteCode schreef op zondag 06 november 2011 @ 08:21:
Net een potje tegen een mede tweaker gespeeld, (CRiMiNaL/rme_2001): http://aichallenge.org/vi....php?game=63975&user=3745
Gewonnen ook nogMet dan aan mijn heel simpele diffusion implementatie!
Wat aan het sleutel aan m'n bot... maar 'verbeteringen' die hebben allemaal een negatieve invloed
Hmm, ik zit mij te focussen op het defenden van mijn hill, maar kijkend naar de laatste game van Janoz waar hij z'n hill halverwege de game al verliest en toch dik wint, vraag ik me af of mijn tactiek wel de juiste is.
[ Voor 21% gewijzigd door CRiMiNaL op 06-11-2011 11:29 ]
... MMORPG Addict.
Verwijderd
Kijk eens goed naar zet 158, midden-bovenIWriteCode schreef op zondag 06 november 2011 @ 08:21:
Net een potje tegen een mede tweaker gespeeld, (CRiMiNaL/rme_2001): http://aichallenge.org/vi....php?game=63975&user=3745
Gewonnen ook nogMet dan aan mijn heel simpele diffusion implementatie!
Wat aan het sleutel aan m'n bot... maar 'verbeteringen' die hebben allemaal een negatieve invloed
Super topic heerlijk om te lezen, begin zelf ook kriebels te krijgen om eens te gaan kijken wat het allemaal precies is. Is het nog de moeite waard om mee te doen? Of heb ik dan gelijk al een enorme achterstand?
En hoelang loopt deze ai challenge?
En hoelang loopt deze ai challenge?
* Matis heeft zich ook als "Tweakers.net Gathering" aangemeld
If money talks then I'm a mime
If time is money then I'm out of time
Wow, check groen (Weerel) eens in deze game. Welk algoritme zou hij gebruiken?
Dit is allemaal nog maar test fase en een echte achterstand heb je nog niet (anders dan minder tijd gehad om andermans tactieken te analyseren). Na 18 december is het niet meer mogelijk nieuwe code te uploaden. Dan worden er nieuw maps gegenereerd en dan word er in tournament style tussen alle bots gevochten totdat er een winnaar is.glennox schreef op zondag 06 november 2011 @ 11:31:
Super topic heerlijk om te lezen, begin zelf ook kriebels te krijgen om eens te gaan kijken wat het allemaal precies is. Is het nog de moeite waard om mee te doen? Of heb ik dan gelijk al een enorme achterstand?
En hoelang loopt deze ai challenge?
[ Voor 70% gewijzigd door CRiMiNaL op 06-11-2011 11:38 ]
... MMORPG Addict.
Het grote voordeel is dat er voor alle talen al een behoorlijke bak boilerplating code aanwezig is waardoor je inderdaad gelijk kunt beginnen met het daadwerkelijk implementeren van je AI. Alle input en output wordt geregeld en er wordt al state bijgehouden. Mijn AI heb ik in 1 avond in elkaar gedraait obv het java starterpack.glennox schreef op zondag 06 november 2011 @ 11:31:
Super topic heerlijk om te lezen, begin zelf ook kriebels te krijgen om eens te gaan kijken wat het allemaal precies is. Is het nog de moeite waard om mee te doen? Of heb ik dan gelijk al een enorme achterstand?
En hoelang loopt deze ai challenge?
Hoewel mijn AI al behoorlijk goed werkt heb ik alvast wel een hiaat gevonden waar ik nog aan moet werken. Op dit moment doe ik nog helemaal niks met de verdediging van mijn eigen hill. In de potjes die ik verloren heb komt dat omdat redelijk snel mijn eigen hill ge razed wordt. Maar gelukkig heb ik hier al wel wat ideeen voor
-edit-
Hmm, bij het laatste spel zie ik weer precies hetzelfde probleem, maar door mijn agressieve mieren heb ik wel een stuk meer andere hills gerazed waardoor ik toch gewonnen heb
[ Voor 8% gewijzigd door Janoz op 06-11-2011 12:05 ]
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Wat vinden jullie van het idee om een ééndimensionale map te gebruiken. Scheelt het rekenwerk en is het sneller (mits goed geimplementeerd). link: Geen voordelen bij ééndimensionale arrayEdwinG schreef op zaterdag 05 november 2011 @ 02:22:
De geleverde standaardbot heb ik flink bijgewerkt. Zo vond ik het handiger om van de map (array[x][y]) een ééndimensionale map te maken, scheelt een hoop reken/regelwerk in de binnenste lussen/controles
Is het gebruik van een hash-table handig. Ik schat in dat je gemiddeld 75% van de map leert kennen. Anderzijds mag je 1GB geheugen gebruiken en daar zit ik lang niet aan.
Mijn plan is collaborative diffusion te gebruiken, maar dan wel zo dat ik in 1 turn de hele diffusion (opnieuw) doorreken. Zijn er artikelen (of meningen) over hoe je dat goed doet. Ik gebruik namelijk nu voor elke 'smell' 2 variabelen, namelijk voor t=0,2,4,6,8,... en t=1,3,5,7,..., wel heb ik gekozen om altijd een even aantal keer door te rekenen, zodat het eindresultaat altijd in de 'even' variabele zit. Ik vind het alleen niet zo mooi: per tile gebruik ik 2x zoveel variabelen als strikt noodzakelijk.
Denk aan FoodSmell (Food), HillEnemy (Aanvalluh), MyHill (Defend), EnemyAnt (beperkt tot attackradius + 2), Unknown tiles (Columbus), Unseen tiles (kan nieuw food op liggen), etc.
[ Voor 5% gewijzigd door Bolukan op 06-11-2011 13:29 ]
Ik wist eigenlijk niet wat de geheugengrens was, waar kan ik dat soort informatie vinden?
Mijn uitdaging op dit moment: Op dit moment lopen mijn mieren (als ze geen doelwit hebben) eerst van de hyve af, en als dat niet lukt, (bijvoorbeeld omdat 'A' in het onderstaande geval niet meer naar noord en niet meer naar oost kan) gaan ze willekeurig bewegen.
(X = water, H = Heuvel, A = ant)
Gevolg is wel dat A nu een willekeurige beweging maakt, en daarna dus weer verder weg kan gaan. (Terug naar vorige positie), en dus in de hoek blijft hangen. Even kijken welk van mijn ideeën daar het best tegen werkt.
Mijn uitdaging op dit moment: Op dit moment lopen mijn mieren (als ze geen doelwit hebben) eerst van de hyve af, en als dat niet lukt, (bijvoorbeeld omdat 'A' in het onderstaande geval niet meer naar noord en niet meer naar oost kan) gaan ze willekeurig bewegen.
code:
1
2
3
4
5
6
| XXXXX X AX X X X X X H X XXXXXXXX |
(X = water, H = Heuvel, A = ant)
Gevolg is wel dat A nu een willekeurige beweging maakt, en daarna dus weer verder weg kan gaan. (Terug naar vorige positie), en dus in de hoek blijft hangen. Even kijken welk van mijn ideeën daar het best tegen werkt.
Bezoek eens een willekeurige pagina
Verwijderd
Waarom zou dat rekenwerk schermen? Me dunkt dat de compiler dat zoveel mogelijk wegoptimaliseert. Als je een geneste for loop hebt:Bolukan schreef op zondag 06 november 2011 @ 13:23:
[...]
Wat vinden jullie van het idee om een ééndimensionale map te gebruiken. Scheelt het rekenwerk en is het sneller (mits goed geimplementeerd).
code:
1
2
3
| for int y = 0; y < Cols; y++ for int x = 0; x < Rows; x++ foo(map[Y][X]); |
dan gaat hij heus niet elke inner loopt berekenen op welke index Y zit. Waarschijnlijk maakt hij er dit van:
code:
1
2
3
4
5
6
| MapCol = SquareValue* for int y = 0; y < Cols; y++ MapCol = Map[y]; for int x = 0; x < Rows; x++ foo(MapCol[X]); |
Dat kan je ook zelf doen als je er niet op vertrouwt dat de compiler dat kan. Voor wat extra snelheid kan je de foo() functie ook nog inline maken.
En in delphi, als je record gebruikt in plaats van class, bedenk ik me net, scheelt dat je een pointer. Bovendien kan je dan met heel simpel rekenwerk de node links of rechts of boven de node waar je in zit vinden. Dat ga ik even implementeren in mijn pathfinder.
Ik heb eindelijk de debugging van Jar files onder de knie. Samen met een ANT-script worden nu automagisch mijn Java-classes gecompileerd en naar de aichallenge-map gekopieerd. Daar heb ik dus nu de debugger draaien en kan ik ook meteen visueel debuggen middels de visualizer 
* Matis kan eindelijk beginnen
* Matis kan eindelijk beginnen

If money talks then I'm a mime
If time is money then I'm out of time
Leuk om te lezen allemaal, hebben jullie deze gezien: game 64337.
Let dan vooral op geel.
Let dan vooral op geel.
LOL een "we are the borg, resistance is futile" AI.. geweldigKoopmans schreef op zondag 06 november 2011 @ 15:09:
Leuk om te lezen allemaal, hebben jullie deze gezien: game 64337.
Let dan vooral op geel.
Verwijderd
http://ants.fluxid.pl/replay.5621 is ook een leuke match. Vooral die structuur bij de basis...
Verwijderd
Je link geeft alleen een errorVerwijderd schreef op zondag 06 november 2011 @ 15:19:
http://ants.fluxid.pl/replay.5621 is ook een leuke match. Vooral die structuur bij de basis...
Knap dat hij zo'n figuur eruit krijgt. Ik ben al blij als mijn mieren een beetje logisch hun targets achterna gaan...Verwijderd schreef op zondag 06 november 2011 @ 15:19:
http://ants.fluxid.pl/replay.5621 is ook een leuke match. Vooral die structuur bij de basis...
Verwijderd
Bij mij wel. De link staat in deze thread anders:
http://aichallenge.org/fo...ic.php?f=24&t=1742#p10586
Mensen die geen webpagina kunnen maken die ook in ie(9) werktVerwijderd schreef op zondag 06 november 2011 @ 16:12:
[...]
Bij mij wel. De link staat in deze thread anders:
http://aichallenge.org/fo...ic.php?f=24&t=1742#p10586

Damn zeg dit is verslavend. Ik zit al 3 dagen aan dit ding te werken. Zo erg dat mn vriendin commentaar begint te geven

M'n bot maakt nog steeds flinke stappen :-) En das fijn... Hopelijk straks weer een stukkie omhoog... (tot nu toe alle potjes gewonnen).
Verder nog steeds aan het studeren op dat paper van die Collaborative Diffusion... Het werkt nu (ongeveer) zoals de Diffusion met Goal Obfuscation... (of hoe je dat ook schrijft)... alles zit nu in 1 diffusion map. Planning is nu om verschillende diffussion maps te maken voor hills, unseen, ants & food... alhoewel ik voor food misschien een iets ander schema ga toepassen, namelijk, los van diffusion, de dichtstbijzijnde mier er naar toe laten lopen...
Verder nog steeds aan het studeren op dat paper van die Collaborative Diffusion... Het werkt nu (ongeveer) zoals de Diffusion met Goal Obfuscation... (of hoe je dat ook schrijft)... alles zit nu in 1 diffusion map. Planning is nu om verschillende diffussion maps te maken voor hills, unseen, ants & food... alhoewel ik voor food misschien een iets ander schema ga toepassen, namelijk, los van diffusion, de dichtstbijzijnde mier er naar toe laten lopen...
Less = more
Verwijderd
Net versie 6 geupload, met versie 5 had ik dik gewonnen... Versie 6 heeft wat betere verdeling van taken. Eens kijken hoe dat functioneerd tegen "echte" andere bots...
Kunnen wij hier niet samen gaan werken met als doel de ultieme bot te maken in plaats van iedereen een eigen bot? Lijkt me wel leuk om samen te werken met een aantal mensen. Zodat je ook nog dingen van elkaar kan leren en elkaar kan helpen. Om zo hopelijk plek 1 in de challenge te behalen.
Lijkt me ook wel wat hebben ja, 2 weten meer dan 1 is toch meestal wel juist..
Natuurlijk geeft dat wel een community-gevoel, maar daarmee loop je al wel snel tegen een aantal uitdagen aan.Ellos schreef op zondag 06 november 2011 @ 20:05:
Lijkt me ook wel wat hebben ja, 2 weten meer dan 1 is toch meestal wel juist..
In welke programmeertaal, wie krijgt de uiteindelijke "lof", wie beheert de software, wie heeft de rechten etc. etc..
Het zal niet het eerste samenwerkingsverband zijn dat op een hoop gezeik uit loopt.
Begrijp me overigens niet verkeerd, het lijkt me een geweldig idee om dit met zijn allen te doen, maar je moet er wel goed over nadenken
[ Voor 21% gewijzigd door Matis op 06-11-2011 20:09 ]
If money talks then I'm a mime
If time is money then I'm out of time
Er schijnt ook vanuit aichallenge de mogelijkheid te zijn om teams te maken, wel onder dezelfde account uiteraard maar dat zien ze je wel als zijnde een team ipv 1 persoon terwijl het eigenlijk een team is
en de andere issues zijn toch denk ik minder groot, wie heeft er bijvoorbeeld nou nog nooit de syntax van java (of c# want dat is bijna identiek) gezien en gebruikt, het beheer kan altijd gedecentraliseerd worden door zoiets als github, en zolang als de link via dm is uitgewisseld zijn er nog miljoenen andere open projecten dus succes met zoeken naar de onze.
het is inderdaad wel belangrijk om dat soort dingen allemaal eerst goed op een rijtje te hebben
en de andere issues zijn toch denk ik minder groot, wie heeft er bijvoorbeeld nou nog nooit de syntax van java (of c# want dat is bijna identiek) gezien en gebruikt, het beheer kan altijd gedecentraliseerd worden door zoiets als github, en zolang als de link via dm is uitgewisseld zijn er nog miljoenen andere open projecten dus succes met zoeken naar de onze.
het is inderdaad wel belangrijk om dat soort dingen allemaal eerst goed op een rijtje te hebben
[ Voor 7% gewijzigd door Ellos op 06-11-2011 20:17 ]
Nou, ik vind het met name leuk om het er hier over te hebben... ideeën uit te wisselen... er samen mee bezig zijn en ook een beetje onderlinge competitie. Dat voegt voor mij wat extras toe...
Persoonlijk zal ik niet mee doen aan een 'gezamenlijk' team... ik doe mee voor de lol... en programmeer als ik wat tijd vind / heb gemaakt... en daar blijft het voor mij ook bij...
Persoonlijk zal ik niet mee doen aan een 'gezamenlijk' team... ik doe mee voor de lol... en programmeer als ik wat tijd vind / heb gemaakt... en daar blijft het voor mij ook bij...
Less = more
Ik zei ook niet dat er geen oplossingen voor de uitdagingen waren, maar er waren gewoon een aantal dingen waar we rekening mee moeten houden.Ellos schreef op zondag 06 november 2011 @ 20:13:
Er schijnt ook vanuit aichallenge de mogelijkheid te zijn om teams te maken, wel onder dezelfde account uiteraard maar dat zien ze je wel als zijnde een team ipv 1 persoon terwijl het eigenlijk een team is
en de andere issues zijn toch denk ik minder groot, wie heeft er bijvoorbeeld nou nog nooit de syntax van java (of c# want dat is bijna identiek) gezien en gebruikt, het beheer kan altijd gedecentraliseerd worden door zoiets als github, en zolang als de link via dm is uitgewisseld zijn er nog miljoenen andere open projecten dus succes met zoeken naar de onze.
het is inderdaad wel belangrijk om dat soort dingen allemaal eerst goed op een rijtje te hebben
Ik wist niet dat er teams gemaakt konden worden bij de challenge, github is een goed idee en de meest voor de hand liggende programmeertalen zijn inderdaad C# en Java, waar mijn voorkeur (Linux) naar het laatste uitgaat.
Ik doe dit ook voor de lol, maar toch ook wel een beetje voor de competitie. Ik vind het helemaal niet erg om dit als groep te doen, maar ik vind niet dat je zowel prive als in groepsverband mee kan doen.IWriteCode schreef op zondag 06 november 2011 @ 20:24:
Nou, ik vind het met name leuk om het er hier over te hebben... ideeën uit te wisselen... er samen mee bezig zijn en ook een beetje onderlinge competitie. Dat voegt voor mij wat extras toe...
Persoonlijk zal ik niet mee doen aan een 'gezamenlijk' team... ik doe mee voor de lol... en programmeer als ik wat tijd vind / heb gemaakt... en daar blijft het voor mij ook bij...
[ Voor 23% gewijzigd door Matis op 06-11-2011 20:34 ]
If money talks then I'm a mime
If time is money then I'm out of time
Oh dit gaat mij absoluut 100% om de lol, maar als je daarnaast ondanks dat je 100% lol heb evengoed hoog geranked komt te staan vind ik dat natuurlijk geen probleem.
Ik zal ook absoluut niet instemmen met gezette tijden bijvoorbeeld, ik denk dat we het allemaal vanuit onze vrije tijd doen en er lol in willen hebben, en als je dan hoog komt is dat alleen maar meer lol!
Ik zal ook absoluut niet instemmen met gezette tijden bijvoorbeeld, ik denk dat we het allemaal vanuit onze vrije tijd doen en er lol in willen hebben, en als je dan hoog komt is dat alleen maar meer lol!
Ik vindt het wel meer lol hebben dat je bot iets fatsoendelijks doet en niet al te veel bugs heeft. Er steekt enorm veel tijd in om op je eigen iets moois te bereiken.
Wat we ook zouden kunnen doen is allemaal een "deel" van de bot programmeren.. Dus bijvoorbeeld iemand regelt dat de ants perfect het eten zoeken, een ander zorgt weer voor het verdedigen. Zouden ook meerdere mensen kunnen doen. En uiteindelijk zoeken we de beste delen bij elkaar en maken van deze delen de bot.
Maar het lijkt mij het beste dat het een besloten groep gedaan word en pas uiteindelijk na de tijd opensource gemaakt word toch? Anders loop je weer tegen het probleem aan dat een persoon van buiten af er met het project vandoor gaat en op het laatste moment nog een aantal tweaks doet waardoor het nog net iets beter is dan onze bot
Mij lijkt het me het leukste om hier met een team aan te gaan werken om hier zoveel mogelijk van te leren. Aangezien ik absoluut niet de beste ben met het programmeren lijkt me dit juist een super leuk project om aan bij te dragen, En enorm veel van te gaan leren. Want ik weet hoe moeilijk het om de perfecte AI te maken als die überhaupt bestaat
Maar het lijkt mij het beste dat het een besloten groep gedaan word en pas uiteindelijk na de tijd opensource gemaakt word toch? Anders loop je weer tegen het probleem aan dat een persoon van buiten af er met het project vandoor gaat en op het laatste moment nog een aantal tweaks doet waardoor het nog net iets beter is dan onze bot
Mij lijkt het me het leukste om hier met een team aan te gaan werken om hier zoveel mogelijk van te leren. Aangezien ik absoluut niet de beste ben met het programmeren lijkt me dit juist een super leuk project om aan bij te dragen, En enorm veel van te gaan leren. Want ik weet hoe moeilijk het om de perfecte AI te maken als die überhaupt bestaat
Ye daarom stelde ik ook voor om het in github te doen, waar alleen wij de link van hebben gekregen via dm of mail, eventueel is er natuurlijk ook wel een mouw aan te passen als we echt private willen werken door bijvoorbeeld ergens een git server te draaien met wat authenticatie.
Wel deel ik je mening inderdaad, het aller moeilijkste is het vangen van een idee in code.
Terwijl als ik eens een aantal mooi geïmplementeerde stukken code te zien krijg, moet ik absoluut wel een beter idee krijgen hoe ik ideeën omzet naar code
Wel deel ik je mening inderdaad, het aller moeilijkste is het vangen van een idee in code.
Terwijl als ik eens een aantal mooi geïmplementeerde stukken code te zien krijg, moet ik absoluut wel een beter idee krijgen hoe ik ideeën omzet naar code
Was hier pun intended? Ik vind hem namelijk wel grappigglennox schreef op zondag 06 november 2011 @ 11:31:
Super topic heerlijk om te lezen, begin zelf ook kriebels te krijgen om eens te gaan kijken wat het allemaal precies is.
Kom er net achter: Je A* implementatie is kan perfect zijn.. uiteindelijk werkt hij maar net zo goed/slecht als je estimation algoritme...

Had er helemaal niet over nagedacht haha. Heb al een hele poos niet echt meer geprogrammeerd en ben er niet echt mee bezig geweest. Vandaar dat het allemaal gaat kriebelen(het gevoel als je weer eens een retro game speelt)Cornholio schreef op zondag 06 november 2011 @ 22:44:
[...]
Was hier pun intended? Ik vind hem namelijk wel grappig(mieren, kriebels)
Ehem, ik moest een limiet instellen omdat die anders buiten de turnlimit gaatD-Raven schreef op zondag 06 november 2011 @ 22:53:
Kom er net achter: Je A* implementatie is kan perfect zijn.. uiteindelijk werkt hij maar net zo goed/slecht als je estimation algoritme...
Hoe houden jullie eigenlijk bij welke ant waar bestaat? Ik neem iig aan dat jullie ook niet elke turn opnieuw de hele route naar een bepaald punt berekenen voor elke ant?
Onthouden jullie gewoon de state van de oude beurt en gebruiken jullie die samen met de verschillen ofzo?
Ik wil jullie allen attent maken op het volgende topic!
AI Challenge: Ants! Animo Check GoT team
AI Challenge: Ants! Animo Check GoT team
Ik heb ook maar eens een botje in elkaar gezet...eerste ronde dik gewonnen.
Check Koopie's 1e game
Check Koopie's 1e game
Verwijderd
Bijna het pathfinding algoritme uitgewerkt... Krijg alleen de hele tijd duplicate order errors... Zou niet moeten gebeuren...
Het is genoeg geweest voor vandaag...
http://www.youtube.com/watch?v=12U2AqvM57I
Het is genoeg geweest voor vandaag...
http://www.youtube.com/watch?v=12U2AqvM57I
[ Voor 28% gewijzigd door Verwijderd op 07-11-2011 02:17 ]
Ik heb mijn Mighty_Servants aan het werk gezet
. De eerste pot was al gewonnen voordat ik de status pagina ophaalde. Tegenstanders waren alleen maar starter pack bots
. Hopelijk is de volgende pot over 2 uur wel van enig niveau.
Ik heb collaborative diffusion geimplementeerd. Het is echt een snelle manier om een zinnig gedrag te krijgen. Nu nog aanvals en verdedigingstaktieken implementeren.
Ik heb collaborative diffusion geimplementeerd. Het is echt een snelle manier om een zinnig gedrag te krijgen. Nu nog aanvals en verdedigingstaktieken implementeren.
Leesvoer over "influence maps", hetzelfde als collaborative diffusion. Deze artikelen geven ideeën voor de opzet van je informatie/datastructuur:
Influence Maps I
Influence Maps II
Influence Maps I
Influence Maps II
Yup. Ik bereken een pad voor een bepaalde mier. Deze bewaar ik tussen de beurten door. Elke beurt verwerk ik de paden die ik al heb en kijk ik of ik nog mieren heb die staan te niksen, waarvoor ik dan weer paden ga berekenen.Caelorum schreef op zondag 06 november 2011 @ 23:22:
[...]
Ehem, ik moest een limiet instellen omdat die anders buiten de turnlimit gaat
Hoe houden jullie eigenlijk bij welke ant waar bestaat? Ik neem iig aan dat jullie ook niet elke turn opnieuw de hele route naar een bepaald punt berekenen voor elke ant?
Onthouden jullie gewoon de state van de oude beurt en gebruiken jullie die samen met de verschillen ofzo?
Op deze manier zijn al je mieren altijd aan het werk, en hoef je niet in een keer voor 100+ mieren een pad te berekenen. Maargoed dit is allemaal niet zo moeilijk. Het wordt pas tricky als je veel mieren op een hoop heb staan..
Welk starterspack gebruik je? Ik had in de c# pack ook last van allerlei equality problemen met betrekking tot Location. Er zitten wat fouten in die equals methoden.....Verwijderd schreef op maandag 07 november 2011 @ 01:25:
Bijna het pathfinding algoritme uitgewerkt... Krijg alleen de hele tijd duplicate order errors... Zou niet moeten gebeuren...
Ik houd dat helemaal niet bij. Op dit moment heb ik, buiten de state die de starterpack bijhoud,nog helemaal niks aan informatie die ik meeneem naar de volgende beurt.Caelorum schreef op zondag 06 november 2011 @ 23:22:
Hoe houden jullie eigenlijk bij welke ant waar bestaat? Ik neem iig aan dat jullie ook niet elke turn opnieuw de hele route naar een bepaald punt berekenen voor elke ant?
Onthouden jullie gewoon de state van de oude beurt en gebruiken jullie die samen met de verschillen ofzo?
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
hmm, ik zit er over te denken om een extra map bij te houden waar ik alle uitkomsten van zetten die ik gedurende de turn maak in neer zet. Dan kan ik rekening houden met de uitkomsten bij het berekenen van routes.
Die equals methoden zuigen, btw. Zowiezo vind ik die starterpack van C# wat gaar in elkaar zitten, mja.
Heb me vannacht weer even ingelezen in alle gangbare AI technieken, ik ben nu aan het denken hoe ik bayesian en neurale netwerken kan inzetten bij mijn bot. Absolute overkill, maar dit zijn twee technieken die ik nog nooit hebt gebruikt en leek me wel leuk om er iets mee te doen. Eens kijken of ik zo'n neurale netwerk kan inzetten voor de algehele strategie en bayesian netwerk voor het verplaatsen van de individuele ants.
Die equals methoden zuigen, btw. Zowiezo vind ik die starterpack van C# wat gaar in elkaar zitten, mja.
Heb me vannacht weer even ingelezen in alle gangbare AI technieken, ik ben nu aan het denken hoe ik bayesian en neurale netwerken kan inzetten bij mijn bot. Absolute overkill, maar dit zijn twee technieken die ik nog nooit hebt gebruikt en leek me wel leuk om er iets mee te doen. Eens kijken of ik zo'n neurale netwerk kan inzetten voor de algehele strategie en bayesian netwerk voor het verplaatsen van de individuele ants.
Na een aantal gewonnen potjes... en nu een aantal verloren potjes... lijkt de skill zo rond de 58 vast te zitten... ... gelukkig heb ik voldoende ideeën voor het verbeteren :-)
Less = more
Verwijderd
Ik gebruik het starterpack van Python. De fouten bleken uiteindelijk te komen doordat ik zelf niet voldoende controlleerde of de mier al een order had... Door wat extra checks in te bouwen zijn deze duplicate orders verdwenenD-Raven schreef op maandag 07 november 2011 @ 08:53:
Welk starterspack gebruik je? Ik had in de c# pack ook last van allerlei equality problemen met betrekking tot Location. Er zitten wat fouten in die equals methoden.....
Ik heb alleszins meerdere maps: 1 per goal.IWriteCode schreef op zondag 06 november 2011 @ 17:35:
M'n bot maakt nog steeds flinke stappen :-) En das fijn... Hopelijk straks weer een stukkie omhoog... (tot nu toe alle potjes gewonnen).
Verder nog steeds aan het studeren op dat paper van die Collaborative Diffusion... Het werkt nu (ongeveer) zoals de Diffusion met Goal Obfuscation... (of hoe je dat ook schrijft)... alles zit nu in 1 diffusion map. Planning is nu om verschillende diffussion maps te maken voor hills, unseen, ants & food... alhoewel ik voor food misschien een iets ander schema ga toepassen, namelijk, los van diffusion, de dichtstbijzijnde mier er naar toe laten lopen...
Ook heb ik de volledige formule (met collaboration) toegepast.
Ik moet echter nog serieus sleutelen aan de waarden, want mijn eerste trial (die ik niet eens met play_one_game had laten lopen) stopte na een zet of 5... Reden was dat de er geen 'smell' meer was rond mijn ants... Na de eigenwaardes gebumped te hebben deden ze al een klein beetje meer, maar toch lopen ze zichzelf nog steeds vast.
Eigenlijk moet ik nu maar in enkele functies meer rommelen:
- keuze van de eigenwaardes, diffusion en collaboration variabelen
- stacking van die waardes
- strategie-prioritization (nu is dit gewoon de hoogste waarde volgen van eender welke goal)
misschien zelfs met globale staat/strategie afhankelijk van turns/deadlines en andere ongein
- misschien nieuwe goals toevoegen
Ik vind je post nu niet meteen terug, maar ik had eigenlijk hetzelfde probleem en ook dezelfde oplossing:
hoe bereken je de nieuwe waardes het efficientst. Ook ik heb per goal per square 2 waarden die ik alterneer en doe per iteratie dus eigenlijk 2 updates. Performance lijkt vooralsnog geen probleem.
ASSUME makes an ASS out of U and ME
Meerdere maps, 1 per goal heb ik inmiddels ook... nu inderdaad de uitdaging, goal selection :-) Dit zou inderdaad kunnen door naar de hoogste waarde te kijken... ... maar zit nu meer te denken aan het maken van klassen voor de verschillen de 'taken' die de mieren hebben... en dan per klasse een ander doel na te streven... maar dan krijg je weer... hoe bepaal ik welke klasse op welk moment het handigste is...
Pas je ook goal obfuscation toe? Dit door de waarde van de diffusion van bijv. food op 0 te zetten als er een mier (voor) zit? Dit blokkeert de scent voor de andere mieren...
Pas je ook goal obfuscation toe? Dit door de waarde van de diffusion van bijv. food op 0 te zetten als er een mier (voor) zit? Dit blokkeert de scent voor de andere mieren...
Less = more
Verwijderd
Lijkt me erg interessant om met behulp van dit algoritmes te leren implementeren, ik ga er eens naar kijken zodra ik thuis kom.
Ik weet niet of deze PDF al eerder is gepost maar ik vond hem vrij interessant (HPA*) met wat extra info: http://aigamedev.com/open...hierarchical-pathfinding/
When I get sad i stop being sad and be awesome instead
Je hebt ook mooie artikelen met de combinatie van A* en tijd, waardoor het samenwerken door ants bij het passeren van vernauwingen, etc. tot uiting komt. (Zal thuis de link zoeken)
Edit: link Niet welke ik had gelezen, maar hetzelfde idee.
Cooperative pathfinding
Edit: link Niet welke ik had gelezen, maar hetzelfde idee.
Cooperative pathfinding
[ Voor 40% gewijzigd door Bolukan op 07-11-2011 16:32 ]
Die timeout message die je af en toe bij games ziet wat betekent dat precies? Dat het berekenen van de doTurn functie te lang duurt?
Ja, en in dat geval wordt de bot gediskwalificeerd en zal hij geen enkele move meer (kunnen/mogen) doen.
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Oude positie + direction = nieuwe positie, en dan bij de volgende beurt kijken welke mier op die positie staat. Onbekende positie? Dan is 't een nieuwe mier. Geen mier meer op een eerdere positie? Dan is 'ie blijkbaar met succes aangevallen.Caelorum schreef op zondag 06 november 2011 @ 23:22:
Hoe houden jullie eigenlijk bij welke ant waar bestaat? Ik neem iig aan dat jullie ook niet elke turn opnieuw de hele route naar een bepaald punt berekenen voor elke ant?
Onthouden jullie gewoon de state van de oude beurt en gebruiken jullie die samen met de verschillen ofzo?
Ik ben echter meer begonnen met strategieën bepalen (hill aanvallen, andere mier aanvallen, naar eten lopen, exploren), mieren herkennen en prioriteiten bepalen om een strategie te kiezen. Nog nooit wat met pathfinding gedaan, dus daar moet ik nog even induiken.
Iedere mier die ik heb weet dus precies wat 'ie moet doen en waar 'ie heen moet, de weg ernaartoe verloopt echter behoorlijk wat minder goed.
Ik zat wel al te denken aan het bewaren van optimale paden, wellicht door de map op te delen in zones (of werken met een straal rond (knel)punten van bekende routes), zodat niet voor iedere mier die van (ongeveer) A naar (ongeveer) B moet weer een nieuwe route moet worden berekend.
[ Voor 19% gewijzigd door CodeCaster op 07-11-2011 16:22 ]
https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...
Ik heb een vraagje, als ik 2 bots invoer bij test_bot.cmd werkt dit allemaal goed en zie ik netjes het gevecht. Alleen opent er geen webpagina waar ik alles kan bekijken. Heeft iemand hier een oplossing/verklaring voor?
Waarschijnlijk komt dat door de --nolaunch
Daarnaast is test_bot.cmd ook niet bedoelt voor het vechten, maar voor het testen of de bot zijn werk goed doet
Daarnaast is test_bot.cmd ook niet bedoelt voor het vechten, maar voor het testen of de bot zijn werk goed doet
If money talks then I'm a mime
If time is money then I'm out of time
Maak ik eigenlijk niet echt klassen voor. De klassen die een doel voorstellen gebruik ik enkel om de diffusion waarden uit te halen per agent. De mier kiest dan zelf maar (adhv alle waarden) wat het best is.IWriteCode schreef op maandag 07 november 2011 @ 12:59:
Meerdere maps, 1 per goal heb ik inmiddels ook... nu inderdaad de uitdaging, goal selection :-) Dit zou inderdaad kunnen door naar de hoogste waarde te kijken... ... maar zit nu meer te denken aan het maken van klassen voor de verschillen de 'taken' die de mieren hebben... en dan per klasse een ander doel na te streven... maar dan krijg je weer... hoe bepaal ik welke klasse op welk moment het handigste is...
Wat ik nu heb (de hoogste waarde) is ook maar tijdelijk tot de diffusion waarden een beetje op punt staan. Dan kan ik echt eens gaan denken aan een slimmere goal selectie.
Kan niet werken. want over het algemeen zijn de ruimtes redelijk open. De scent komt dus langs je ene mier heen via de tiles ernaast. Alleen kun je de scent wat verminderen en een ander goal aantrekkelijker maken.Pas je ook goal obfuscation toe? Dit door de waarde van de diffusion van bijv. food op 0 te zetten als er een mier (voor) zit? Dit blokkeert de scent voor de andere mieren...
Net 2 waardes aangepast en plots ownde ik het speelveld in de testomgeving... vreemd
[ Voor 3% gewijzigd door H!GHGuY op 07-11-2011 19:45 ]
ASSUME makes an ASS out of U and ME
Thanks dat was het inderdaad. Ik ben echt een beginner qua programmeren en dit leek mij zo leuk dat ik het gewoon wil proberen. Zal wel niet al te veel van terecht komen maar ben wel benieuwd wat ik die ants allemaal kan laten doenMatis schreef op maandag 07 november 2011 @ 19:28:
Waarschijnlijk komt dat door de --nolaunch
Daarnaast is test_bot.cmd ook niet bedoelt voor het vechten, maar voor het testen of de bot zijn werk goed doet
Gisteren het bijna opgegeven aangezien ik maar geen debugging output naar buiten kon krijgen in Python, in bed toch het niet los kunnen laten en vanavond er dan ook even verder mee gegaan. Inmiddels kan ik dan ook lekker variablen loggen om zo te debuggen, was weer veel te moeilijk bezig 
Vandaag bezig geweest om te scannen naar voedsel, of andere objecten in de buurt van mijn mier door simpelweg de vakjes om de mier heen te gaan raadplegen, water negerend, totdat ik voedsel tegen kwam. Dit werk op zich aardig zij het niet wat traag aangezien ik het nu voor iedere mier iedere ronde uitreken. Ik krijg nu dan ook aardig wat meldingen over dubbele orders dus dat moet ik nog even wegwerken.
Qua traagheid:
http://www.policyalmanac.org/games/aStarTutorial.htm
Ik heb nog geen idee hoe ik dit in lists bij moet gaan houden en tegelijk makkelijk benaderbaar houd maar de theorie snap ik eindelijk. Morgen ga ik daar dus verder mee aan de slag
Vandaag bezig geweest om te scannen naar voedsel, of andere objecten in de buurt van mijn mier door simpelweg de vakjes om de mier heen te gaan raadplegen, water negerend, totdat ik voedsel tegen kwam. Dit werk op zich aardig zij het niet wat traag aangezien ik het nu voor iedere mier iedere ronde uitreken. Ik krijg nu dan ook aardig wat meldingen over dubbele orders dus dat moet ik nog even wegwerken.
Qua traagheid:
- een Ant op 31, 19 vind voedsel op 34, 12 in 6 ms
- een Ant op 34, 21 vind voedsel op 31, 31 in 9 ms
- een Ant op 26, 22 vind voedsel op 26, 18 in 1 ms
- een Ant op 28, 22 vind voedsel op 37, 36 in 111 ms
http://www.policyalmanac.org/games/aStarTutorial.htm
Ik heb nog geen idee hoe ik dit in lists bij moet gaan houden en tegelijk makkelijk benaderbaar houd maar de theorie snap ik eindelijk. Morgen ga ik daar dus verder mee aan de slag
[ Voor 9% gewijzigd door sPENKMAN op 07-11-2011 23:02 . Reden: traagheid bij het zoeken naar voedsel toegevoegd ]
Eve char: Warock <TEST>
Voor de mensen die willen debuggen:
Run een game met als opties -I en -O. In de game_logs dir komt oa het bestand 0.bot0.input te staan. Als je deze naar stdin redirect
kun je je programma simpel debuggen. In C# heb ik een unittest geschreven die de laatste 0.bot0.input inleest.
Een extra constructor voor de Ants class zodat deze niet van Console.In leest, maar van de opgegeven StreamReader is een exercise for the reader
.
En wat heel handig is voor bijv collaborate diffusion (ook al doe ik eigenlijk gewoon diffusion), is om je map bij elke turn weg te schrijven als png. Daarmee is direct duidelijk waarom mieren een bepaalde kant op lopen.
Run een game met als opties -I en -O. In de game_logs dir komt oa het bestand 0.bot0.input te staan. Als je deze naar stdin redirect
code:
1
| mybot.exe < 0.bot0.input |
kun je je programma simpel debuggen. In C# heb ik een unittest geschreven die de laatste 0.bot0.input inleest.
code:
1
2
3
4
5
6
7
8
9
| [TestMethod] public void RunLastGame() { using (var ir = new StreamReader("D:/dev/ants/tools/game_logs/0.bot0.input")) { var mybot = new MyBot(); new Ants.Ants(ir).PlayGame(mybot); } } |
Een extra constructor voor de Ants class zodat deze niet van Console.In leest, maar van de opgegeven StreamReader is een exercise for the reader
En wat heel handig is voor bijv collaborate diffusion (ook al doe ik eigenlijk gewoon diffusion), is om je map bij elke turn weg te schrijven als png. Daarmee is direct duidelijk waarom mieren een bepaalde kant op lopen.
Komt in de categorie, gouden tip.Sjaaky schreef op maandag 07 november 2011 @ 23:03:
Voor de mensen die willen debuggen:
Run een game met als opties -I en -O. In de game_logs dir komt oa het bestand 0.bot0.input te staan. Als je deze naar stdin redirect
code:
1 mybot.exe < 0.bot0.input
kun je je programma simpel debuggen. In C# heb ik een unittest geschreven die de laatste 0.bot0.input inleest.
code:
1 2 3 4 5 6 7 8 9 [TestMethod] public void RunLastGame() { using (var ir = new StreamReader("D:/dev/ants/tools/game_logs/0.bot0.input")) { var mybot = new MyBot(); new Ants.Ants(ir).PlayGame(mybot); } }
Een extra constructor voor de Ants class zodat deze niet van Console.In leest, maar van de opgegeven StreamReader is een exercise for the reader.
En wat heel handig is voor bijv collaborate diffusion (ook al doe ik eigenlijk gewoon diffusion), is om je map bij elke turn weg te schrijven als png. Daarmee is direct duidelijk waarom mieren een bepaalde kant op lopen.
Ik heb ook weer een variant geupload. Ben er nog niet tevreden over. Maar het werkt al wat beter met betrekking tot verdeling van goals en prio's bepalen.
Heb alleen nog een bug waardoor mn ants wel bij de vijandige hill komen, maar er niet op gaan staan... maar met bovenstaande moet ik dit nu toch eindelijk eens kunnen opsporen..
Met de laatste versie zat ik op 45 punten.
Hij ging puur voor de food en liep enemy hills straal voorbij. Ik heb de code herschreven om de influence map te kunnen uitbreiden naar andere factoren. Als eerste heb ik EnemyHill toegevoegd. Daarnaast hindert de voorste mier het doorstromen van de smell. Dit moet met z'n 20-en naar 1 voedsel lopen voorkomen.
Oef, met nog maar 10 minuten te gaan voor mijn eerstvolgende run zat er een bug in. Ik snap hem nog steeds niet, maar heb hem met een pleister gefixed.
Hij ging puur voor de food en liep enemy hills straal voorbij. Ik heb de code herschreven om de influence map te kunnen uitbreiden naar andere factoren. Als eerste heb ik EnemyHill toegevoegd. Daarnaast hindert de voorste mier het doorstromen van de smell. Dit moet met z'n 20-en naar 1 voedsel lopen voorkomen.
Oef, met nog maar 10 minuten te gaan voor mijn eerstvolgende run zat er een bug in. Ik snap hem nog steeds niet, maar heb hem met een pleister gefixed.
[ Voor 86% gewijzigd door Bolukan op 08-11-2011 00:16 . Reden: Compleet herschreven... net de code ... ]
Ik zit er al een tijdje op te kijken. Maar kan iemand mij vertellen waarom de GetIsVisible location zo complex is?
Waarom niet gewoon zo?
GetDistance gebruikt de Euclidean distance berekening, dus dit zou gewoon moeten werken, ook al is het in een torus map..
C#:
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
| //standaard aangeleverde implementatie public bool GetIsVisible(Location loc) { List<Location> offsets = new List<Location>(); int squares = (int)Math.Floor(Math.Sqrt(this.ViewRadius2)); for (int r = -1 * squares; r <= squares; ++r) { for (int c = -1 * squares; c <= squares; ++c) { int square = r * r + c * c; if (square < this.ViewRadius2) { offsets.Add(new Location(r, c)); } } } foreach (Ant ant in this.MyAnts) { foreach (Location offset in offsets) { if ((ant.Col + offset.Col) == loc.Col && (ant.Row + offset.Row) == loc.Row) { return true; } } } return false; } |
Waarom niet gewoon zo?
C#:
1
2
3
| .. return MyAnts.Any(a => GetDistance(a, loc) < ViewRadius2); .. |
GetDistance gebruikt de Euclidean distance berekening, dus dit zou gewoon moeten werken, ook al is het in een torus map..
Ik zat eerst te denken dat het op deze manier vermeningvuldigingen scheelt, maar met een viewradius2 van 77 heb je bijna 300 afstandsberekeningen en zo'n aantal mieren haal je niet snel.D-Raven schreef op dinsdag 08 november 2011 @ 00:21:
kan iemand mij vertellen waarom de GetIsVisible location zo complex is?
De huidige implementatie maakt wel duidelijk is dat de offsets maar 1x per potje uitgerekend hoeven te worden en dan scheelt het wel
Klopt die methode überhaupt wel? Zo te zien wordt er geen rekening gehouden met de wrap-around (hoe heet dat in NL?) van de kaart.
Ik heb me zelf ook ingelezen in motion planning e.d. om ook mee te kunnen doen en iets leuks neer te zetten.
Ik heb me zelf ook ingelezen in motion planning e.d. om ook mee te kunnen doen en iets leuks neer te zetten.
Ik bereken de "is visible" property voor elke square gewoon aan het begin van een turn. Dan kan je daarna de informatie gewoon direct opvragen in O(1) ipv O(N). Niet zozeer omdat ik dat zo vaak doe, maar die krijg ik er gratis bij omdat ik de "is discovered" property wel echt wil hebben ivm pathfinding.
Maar goed, ik werk met C++, dan is dat low-level bitfiddlen toch wat makkelijk
Maar goed, ik werk met C++, dan is dat low-level bitfiddlen toch wat makkelijk
-niks-
.
[ Voor 98% gewijzigd door SaphuA op 31-01-2022 15:57 ]
Hoe doe je dat? Hoe zet je een map[,].ColorValue om in een png?En wat heel handig is voor bijv collaborate diffusion (ook al doe ik eigenlijk gewoon diffusion), is om je map bij elke turn weg te schrijven als png.
Edit: Google, google.
Ik heb Visual Studio Express C# 2010 geinstalleerd en dat werkt prima. Ik kan je niet hands-on helpen, maar wel zeggen dat een standaard installatie werkt.SaphuA schreef op dinsdag 08 november 2011 @ 10:36:
Heeft er misschien iemand tijd en zin om mij te helpen met het opzetten van een omgeving met Visual Studio? Zodat ik mijn bot kan debuggen uit VS (als dat mogelijk is?).
[ Voor 13% gewijzigd door Bolukan op 08-11-2011 10:48 ]
@_js_: Zo te zien heb je helemaal gelijk.
Om terug te komen op mijn vorige post. Ik denk dat 2 maal vermenigvuldigen ook sneller is dan ~600 toevoegingen en vergelijkingen, dus idd een behoorlijk inefficiente manier om getisvisible te implementeren.
Ik bereken ook vooraf wat visible is. Wat niet visible is krijgt extra punten. Hierdoor verspreiden de mieren zich. Er moet alleen iets bij dat hoe langer het unseen is hoe liever de mieren er naar toe lopen. Ook al levert dat vast weer andere problemen op.
@Saphua: Maak een project, voeg alle .cs bestanden toe. Stel bij de project settings onder debug "command line arguments" "< 0.bot0.input" in. En druk op F5.
@Bolukan: Daar gebruik ik onderstaande voor. Het is wel unsafe code dus je moet compileren met /unsafe. En je kunt het uiteraard niet mee sturen naar de wedstrijd.
Om terug te komen op mijn vorige post. Ik denk dat 2 maal vermenigvuldigen ook sneller is dan ~600 toevoegingen en vergelijkingen, dus idd een behoorlijk inefficiente manier om getisvisible te implementeren.
Ik bereken ook vooraf wat visible is. Wat niet visible is krijgt extra punten. Hierdoor verspreiden de mieren zich. Er moet alleen iets bij dat hoe langer het unseen is hoe liever de mieren er naar toe lopen. Ook al levert dat vast weer andere problemen op.
@Saphua: Maak een project, voeg alle .cs bestanden toe. Stel bij de project settings onder debug "command line arguments" "< 0.bot0.input" in. En druk op F5.
@Bolukan: Daar gebruik ik onderstaande voor. Het is wel unsafe code dus je moet compileren met /unsafe. En je kunt het uiteraard niet mee sturen naar de wedstrijd.
C#:
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
| public static Bitmap bitmap = null; public static BitmapData bmData = null; public static void CreateImage(GameState state) { unsafe { int width = state.Width; int height = state.Height; double maxScore = MaxScore(); int bx = 8; int by = 8; if (bmData == null) { bitmap = new Bitmap(width * bx, height * by, PixelFormat.Format24bppRgb); //lock the bitmap in memory bmData = bitmap.LockBits( new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, bitmap.PixelFormat); } int pixelSize = 3; double colorscalefactor = (255 / Math.Log(maxScore + 1.0)); for (int r = 0; r < height; r++) { //prepare 'by' rows of pixeldata byte*[] iRow = new byte*[by]; int y = 0; for(y = 0; y < by; y++) { iRow[y] = (byte*)bmData.Scan0 + ((r * by + y) * bmData.Stride); } for (int c = 0; c < width; c++) { Color col = Color.Black; switch (state.Tile[r, c]) { case TileType.MyAnt: col = Color.Orange; break; case TileType.EnemyAnt: col = Color.Green; break; case TileType.Dead: col = Color.Red; break; case TileType.Unseen: case TileType.Land: double score = Math.Log(state.GetNavScore(r, c) + 1.0) * colorscalefactor; int iscore = Math.Min((int)(score), 255); iscore = Math.Max(iscore, 0); col = Color.FromArgb(iscore, iscore, iscore); break; case TileType.Food: col = Color.White; break; case TileType.Water: col = Color.DarkBlue; break; case TileType.MyHill: col = Color.Brown; break; case TileType.EnemyHill: col = Color.Brown; break; } // set an by * bx rectangle of pixels for (y = 0; y < by; y++) { for (int x = 0; x < bx; x++) { int loc = (c * bx + x) * pixelSize; iRow[y][loc] = col.B; //B iRow[y][loc + 1] = col.G; //G iRow[y][loc + 2] = col.R; //R } } } } using (FileStream mem = new FileStream(string.Format("score_{0:0000}.png", state.Turn), FileMode.Create)) { bitmap.Save(mem, ImageFormat.Png); mem.Flush(); mem.Close(); } } |
Dus als je een grid hebt met bijna 5000 locaties, dan ga jij elke beurt voor elke mier die jij hebt, bepalen of een locatie zichtbaar is?MLM schreef op dinsdag 08 november 2011 @ 10:15:
Ik bereken de "is visible" property voor elke square gewoon aan het begin van een turn. Dan kan je daarna de informatie gewoon direct opvragen in O(1) ipv O(N). Niet zozeer omdat ik dat zo vaak doe, maar die krijg ik er gratis bij omdat ik de "is discovered" property wel echt wil hebben ivm pathfinding.
Maar goed, ik werk met C++, dan is dat low-level bitfiddlen toch wat makkelijk
Dan ben ik toch wel benieuwd hoe je dat doet, zonder dat je Bot timeout zodra je een deftige hoeveelheid mieren hebt (zeg 100+).
Ik doe het anders. Ik hou meta informatie bij voor elke locatie. Iedere keer als een mier zichzelf verplaatst, update ik alle locaties in zijn viewradius, lastvisible = currentTurn.
Als ik dan wil weten of een locatie zichtbaar is of niet, hoef ik deze alleen maar te vergelijken met de currentTurn. Dit is veel minder intensief als iedere keer door al je locaties heen te gaan.
Ze worden zo depressief van jou commando's dat ze het niet meer zien zitten en proberen zelfmoord te plegenBolukan schreef op dinsdag 08 november 2011 @ 10:40:
[...]
.. (Het lijkt dat mijn ants in het water willen springen)...
[ Voor 12% gewijzigd door D-Raven op 08-11-2011 12:06 ]
Ik clear elke turn alle visibility info en ga dan voor alle mieren zeer efficient visibility updaten voor de effectieve range. Ik overloop eigenlijk geen enkele locatie teveel.D-Raven schreef op dinsdag 08 november 2011 @ 12:04:
[...]
Dus als je een grid hebt met bijna 5000 locaties, dan ga jij elke beurt voor elke mier die jij hebt, bepalen of een locatie zichtbaar is?
Dan ben ik toch wel benieuwd hoe je dat doet, zonder dat je Bot timeout zodra je een deftige hoeveelheid mieren hebt (zeg 100+).
Gisteravond ook een config header file gemaakt waarin ik wat gedrag kan bepalen:
- clearen van smell/influence of niet
- maximum iteraties per turn
Moet ook nog wat gewichten toevoegen etc.
Het probleem waar ik nu tegenaan loop is dat op de standaard map van de play_on_game, als er al wat ants gespawned zijn die de omgeving verkennen, dan wordt de smell rond de eigen hill 0 en blijven de ants gewoon staan. Diffusie waarden > 25 leiden dan weer naar overflows. Hoe krijg ik dus de smell tot bij de eigen hill...
[ Voor 31% gewijzigd door H!GHGuY op 08-11-2011 13:03 ]
ASSUME makes an ASS out of U and ME
Grmbl... hele tijd aan het coden geweest... maar nog niet echt veel verder :-)
Code geschreven om de dichtsbijzijnde mier naar food te sturen... ... maar dat is natuurlijk ook afhankelijk van of het wel het dichtsbijzijnde food bij die mier is... en daar hield ik nog geen rekening mee...
Dus nu de code maar herschrijven... en dan alle voedsel plekken tegelijk afzoeken...
Dat was gelukkig een kleine aanpassing :-) Alleen werkt het diffusion nu voor geen meter meer... ... dat wordt dus nog even speuren...
Code geschreven om de dichtsbijzijnde mier naar food te sturen... ... maar dat is natuurlijk ook afhankelijk van of het wel het dichtsbijzijnde food bij die mier is... en daar hield ik nog geen rekening mee...
Dus nu de code maar herschrijven... en dan alle voedsel plekken tegelijk afzoeken...
Dat was gelukkig een kleine aanpassing :-) Alleen werkt het diffusion nu voor geen meter meer... ... dat wordt dus nog even speuren...
[ Voor 28% gewijzigd door IWriteCode op 08-11-2011 14:00 ]
Less = more
heh, daar zeg je me wat..IWriteCode schreef op dinsdag 08 november 2011 @ 13:14:
Grmbl... hele tijd aan het coden geweest... maar nog niet echt veel verder :-)
... maar dat is natuurlijk ook afhankelijk van of het wel het dichtsbijzijnde food bij die mier is... en daar hield ik nog geen rekening mee...
Nieuwe versie geupload... verslaat (bijna) altijd m'n oude bot... nog wel veel ruimte voor verbeteringen... huidige schema:
En nu maar weer even wat uurtjes wachten om te kijken wat het doet :-)
code:
1
2
3
4
5
6
7
| - eerst dichstbijzijnde ant naar dichtsbijzijnde voedsel sturen - diffuse unseen & enemy hills voor elke mier als diffuse(unseen) > diffuse(enemyhill) ga richting unseen anders ga richting enemyhill |
En nu maar weer even wat uurtjes wachten om te kijken wat het doet :-)
Less = more
Hoe pak je dit eigenlijk op?IWriteCode schreef op dinsdag 08 november 2011 @ 14:47:
... huidige schema:
code:
1 - eerst dichstbijzijnde ant naar dichtsbijzijnde voedsel sturen
Ik zat zelf te denken aan reverse pathfinding. Dus vanuit het voedsel redeneren wat de dichtsbijzijnde mier is dmv pathfinding
Het probleem van voedsel en mieren is bekend als een Assignment problem.
Ik doe het nu met een Breadth First Search ( Wikipedia: Breadth-first search ) en ik voeg alle food squares toe aan de Queue...MoleM schreef op dinsdag 08 november 2011 @ 15:44:
[...]
Hoe pak je dit eigenlijk op?
Ik zat zelf te denken aan reverse pathfinding. Dus vanuit het voedsel redeneren wat de dichtsbijzijnde mier is dmv pathfinding
Less = more
Verwijderd
Laatste tests voor versie 9 draaien op dit moment, nog een uur tot de volgende wedstrijd...
Kan versie 9 vanavond mooi een paar wedstrijden doen
Kan versie 9 vanavond mooi een paar wedstrijden doen