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
Dus voorlopig blijft mijn oude bot nog online
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
[ Voor 3% gewijzigd door sPENKMAN op 05-11-2011 22:11 ]
Eve char: Warock <TEST>
Less = more
Verwijderd
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
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.
Toch gelukt om met pascal wat in elkaar te zetten... net geupload... ben benieuwd...
Less = more
[ Voor 46% gewijzigd door Ellos op 06-11-2011 00:07 ]
Verwijderd
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
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
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
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
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
En hoelang loopt deze ai challenge?
If money talks then I'm a mime
If time is money then I'm out of time
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 ]
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.
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).
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:
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.
* Matis kan eindelijk beginnen
If money talks then I'm a mime
If time is money then I'm out of time
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
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
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
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
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 ]
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
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!
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
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.
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?
AI Challenge: Ants! Animo Check GoT team
Check Koopie's 1e game
Verwijderd
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 collaborative diffusion geimplementeerd. Het is echt een snelle manier om een zinnig gedrag te krijgen. Nu nog aanvals en verdedigingstaktieken implementeren.
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'
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.
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
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
When I get sad i stop being sad and be awesome instead
Edit: link Niet welke ik had gelezen, maar hetzelfde idee.
Cooperative pathfinding
[ Voor 40% gewijzigd door Bolukan op 07-11-2011 16:32 ]
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...
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
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>
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
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.
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..
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 ... ]
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?
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
Ik heb me zelf ook ingelezen in motion planning e.d. om ook mee te kunnen doen en iets leuks neer te zetten.
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 ]
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.
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
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...
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
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
Kan versie 9 vanavond mooi een paar wedstrijden doen