Gå til innhold

Anbefalte innlegg

Enkelte av dere har nok sett ting som RoboCode eller AI-konkurransen på TG. Da jeg selv liker denne type konkurranser veldig godt har jeg laget en compo på freak.no med inspirasjon hentet fra Ants AI challenge. Jeg tenkter at det kanskje kunne være en del her på dette forumet som også kunne tenke seg å delta i en slik compo - og flere deltakere er bare bedre.

Innleveringsfrist: 18.08.2014 (altså 18. august)
Mulige språk/plattformer: JVM(Java, scala...), .NET (VB, C#), Python, NodeJS, Ruby. C++ og C godkjennes også om koden lett kan kompileres på windows.
Kode + dokumentasjon: https://github.com/etse/AI-compo-strategic-war
Inleveringsmetode: Lever kun kildekode. (ikke noen kompilerte filer). Send meg en link til der jeg kan laste ned koden. F.eks. en ZIP-fil du deler med meg på Google-drive/dropbox, eller en URL til GitHub repository.
Premie: Vinneren får 1 år VPS Premium til en verdi av 4800,- (sponset av host1.no)

Regler:
1: Bruk sunn fornuft. Tror du noe er utenfor reglene så spør om lov.
2: Koden kan ikke bruke biblioteker utenom standardbiblioteke som fulgte med språket.
3: AIen får ikke lov til å kommunisere over internett med annet enn spill-serveren

Turneringsformatet:
Dette spørs på antall deltakere. Om det er få deltakere blir jeg å kjøre en "alle mot alle" i flere ulike maps og kåre den som vinner på flest av de til vinneren av hele konkurransen. Blir det er større antall deltagere kjører jeg et enkelt turneringsformat, der vinnerne går videre og møter andre vinnere i en finale.

Jeg blir å spille inn selve turneringen og kåringen av en vinner og legge det ut som video på youtube slik at alle kan se.

Hva ønsker jeg i denne tråden?
Alt mulig av diskusjoner og spørsmål relatert til konkurransen. Er det ting du ikke forstår, eller sitter du fast en plass? Still et spørsmål her. Finner du noe feil i koden eller i dokumentasjonen, skriv det her eller gi meg en pull-request på GitHub om du fikset det selv.

Egentlig er alt lov å poste i denne tråden, så lenge det er i det minste litt vagt relevant til selve konkurransen.

Litt opp spillet:
Det hele er et turbasert strategispill som er bygget på mange av konseptene til en lignende konkuranse som heter Ants AI Challange. Målet i spillet er å bruke dine styrker i spillet til å drepe mostanderene - mens du hele tiden må vurdere om du vil fokusere på å angripe eller å skaffe deg flere styrker gjennom å samle mat.

Spillet har en enkel, men morsom, kamp mekanikk som åpner opp for at man kan leke seg med å implementere forskjellige strategier inn i spillet.

Endret av etse
  • Liker 4
Lenke til kommentar
Videoannonse
Annonse
Gjest Slettet+9871234

Enig med forrige poster. Et i NodeJS der nettverksmulighetene brukes hadde vært interessant. Det vil med andre ord si et spill med multiple deltagere.

Lenke til kommentar

Spillet har flere deltagere. Man spiller altså mot andre. Tingen med "intet internett" er for at ikke folk skal skrive en versjon som offloader traffiken sin til en kraftig server for å gjøre beregninger og vinner utelukkende p.g.a. tilgang på stor datakraft. Den må altså være autonum og kunne gjøre valg kun basert på den begrensede informasjonen den får over nettverket.

 

Kommunikasjonen skjer over en normal socket, med JSON. Så en websocket i NodeJS skal være en akseptabel måte å løse oppgaven på.

 

Men kan utbrodere litt mer om finalen. Som sagt baserer deg seg på antall deltakere. Er det nok folk tenker jeg at man kjører 4v4-kamper hvor best av X antall kamper går videre. Alle klientene blir å kjøre på samme lokale maskin, og må derfor dele på ressursene. Maskinen vil ha helt normale specs for å være en stasjonær - og kjører windows.

 

Det vil si, at det som leveres må lett kunne kjøre på windows. Jeg har allered ruby, java, .NET, python og NodeJS installert. Om noen har spesielle ønsker utover dette er det bare å ta kontakt så skal jeg se hva jeg kan ordre.

 

Koden som ligger ute nå støtter opp til 10 spillere samtidig, men brettet som er laget har kun 2 spillere - men kan lett endres til 4 spillere om man ønsker.

 

----------

 

Gode nyheter: Premie har blitt sponset av host1.no

Host1.no har sagt at de er villige til å sponse konkuransen med en førstepremie på 1 år gratis VPS (Premium) til en verdi av ca 4800,-

Endret av etse
Lenke til kommentar
Gjest Slettet+9871234

Ja, du får melde deg på da vettu, for her er det både tillatt med NodeJS og mange deltagere.

 

Det har jeg ikke tid til, men jeg skrev en artikkel som kan komme til nytte for noen av dere:

http://dinitside.no/#delfinen-geparden-jaktfalken

 

Det vil si, at det som leveres må lett kunne kjøre på windows. Jeg har allered ruby, java, .NET, python og NodeJS installert. Om noen har spesielle ønsker utover dette er det bare å ta kontakt så skal jeg se hva jeg kan ordre.

 

Der er vel JavaScript biblioteker til det meste i dag. Problemet er vel først og fremst å finne relevant bibilotek, brukervennlighet og hurtighet av web applikasjonene som utvikles. Det beste er kanskje ajaxteknologi som kombinerer browser scripting med tyngre oppgaver som utføres på serveren.

 

<off topic>

Til de som vil bruke søkemotor og big data teknologi så er dette:

 

http://www.skupot.com/

 

aktuelt.,

 

Big data er big for tiden!

<off topic>

Endret av Slettet+9871234
Lenke til kommentar

2 unntak er lagt til med hensyn til biblioteker (etter forspørsel).

 

På JVM-plattformen får man lov å bruke gson og på .NET kan man bruke JSON.net om man ønsker det i stede for standard serializer.

 

I begge tilfeller ønsker jeg at biblioteket følger med koden du leverer inn.

Lenke til kommentar

Stilig, kult initiativ! Synes konseptet er veldig kult, har sett Robocode før, men synes dette blir mer strategisk interessant.

 

Får se om det blir noe tid til å sette sammen en AI i løpet av sommeren, hadde vært moro å prøve seg. :D

 

Hvor lang betenkningstid får programmet per turn? Med en time.sleep(0.25) før hver sending altså 0.25 sekunder mellom hver move fryser serveren etter kort tid, så det må være omtrent instant?

Endret av Cemi
Lenke til kommentar

jeg bruker pygame sin innebygde klokke til å styre rundetiden i spillet. (som gjøres med å sende antall oppdatering per sekund til self.display.update() som igjen kaller clock.tick(). Å legge inn en sleep i serveren blir derfor feil. Riktige måten å endre det på er å endre verdien som sendes til update.

 

Om du ønsker at klienten din skal vente på neste runde skal starte er det bare å vente til serveren sender deg en ny oppdatering med data. Dette gjøres kun 1 gang per runde.

 

Under turneringen tenker jeg å kjøre 4 runder per sekund, noe som vil gi deg 25ms beteningstid. Ser jeg har satt den til 6 i serveren som ligger ute, fikser dette med en gang. Om man ønsker å teste koden med ulike rundetider har den oppdaterte versjonen også mulighet for å styre antall runder per sekund med argumentet -f [int]

  • Liker 1
Lenke til kommentar

Oi, ser jeg har gått på en stor smell jeg glemte å teste for. Fikset opp i koden og pushet det til github, så da er det bare å laste ned på nytt. Anbefaler å klone repositoriet slik at dere bare kan pulle ned oppdateringer som skjer etterhvert.

Lenke til kommentar

Enkelte deltakere etterlyste et json-schema for protokollen for å gjøre det enklere å forstå hvordan formateringen og hva slaks type argumenter som ble sendt. Jeg har nå laget dette og lastet det opp til GitHub, håper det er til hjelp for enkelte av dere.

 

Av nyskjerrighet, er det noen som har begynt å se på oppgaven - og som har gjort vurderinger av stategier dere ønsker å implementere? Kommet frem til noen spennende konsepter som dere kanskje ønsker å dele?

Endret av etse
Lenke til kommentar

Har fått til en basic AI som sender random moves uten å kollidere. Jeg har brukt en del tid på å rendre dataene jeg får fra serveren for lettere å kunne debugge.

Har begynt å se på en måte å få spredd mauren bedre på brettet, lurer på å gi en verdi til de rutene næremest en maur og så leite etter en tile med mindre verdi en der mauren står.

 

Har forresten sett at det ikke skjer noe når alle enemy spawns er destroyed.

Endret av Blastings
Lenke til kommentar

Har tydeligvis ikke laget noen win-condition i spillet. Kan være jeg gjør det etterhvert. Er uansett en smal sak å se hvem som vinner :)

 

Endret innleveringsfristen til 18.august da jeg er bortreist på oppstarts-uke med jobben - så må te finalen når det er ferdig.

Endret av etse
Lenke til kommentar

Beklager dobbeltposting, men har litt ny informasjon - og synes det er en god unnskyldning for en litt shameless bump ^^

 

Har nå fikset et problem på serveren: Om 1 av klientene kræsjet ville hele serveren kræsje. Jeg trodde dette var håndtert ordentlig, men tydeligvis ikke. Nå vil den bare la de resterende spillerene spille videre selv om enkelte klienter disconnecter.

 

Et annet problem var at når folk ønsket å teste mot andre spillere var det vanskelig for dem å se hva som skjedde da displayet kun ble vist hos han som kjørte selve serveren. Den andre var anhengig av å ha rendering i klienten sin - og selv da fikk han kun se det hans egne units kunne se. Jeg har derfor lagt til "observer-mode" som egentlig bare er en enkel klient som kan koble til serveren å bli feedet alt av informasjon hver runde. Dette er en rask fiks jeg bare heiv sammen veldig fort.

 

For å bruke observers bruker man kommandolinjeargumentet "-o [antall]" som vil gjøre at serveren til vente på at det definerte antallet observere kobler til før den starter. Jeg har lagt ved et enkelt script "testObserver.py" som er min raske implemtasjon av en observer. Ved å bruke denne kan også de andre spillerene koble til og se hva som skjer underveis.

 

Viktige ting rundt observers:

- Den viser kun angrep, ikke hvilke angrep som skjer

- Observers må koble til før klientene.

- IP og port for serveren er hardkodet inn i scriptet, akkurat som i test-klienten

 

-------------

 

Har også forbedret testClient.py, som er en test-klient. Denne skal nå forhåpentligvis gjøre det enklere for folk å komme i gang. Den er skrevet slik at den implementerer disse tingene for deg:

- Kommunikasjon med serveren

- Parsing av kartet

- Tegning av det som er synlig for spilleren

 

For å komme i gang er alt du trenger å gjøre å implementere din AI-logikk i metoden "resolve_round", som er i klassen GameAI. Den beste måten å gjøre dette på å er å bare lage en ny klasse som arver fra GameAI-klassen, og så bruke polymorfisme til skrive inn din egen logikk. Da slipper du at alt de andre "rotet" forstyrrer deg mens du skriver logikken. Om du synes arv og klasser er litt vanskelig kan du bare skrive koden rett inn i den eksiterende filen.

 

Slik den fungerer nå er slik:

Hver runde vil klassen kalle på "resolve round", for å la deg gjøre det du ønsker. Staten på spillet vil være parset for deg og ligger lagret i self.board, som er et objekt som representerer selve kartet. Det er viktig at du husker å sende en kommando til serveren før du returnerer fra denne funksjonen. Dette kan gjøres via å enten sende json direkte med self.sendline (som vil legge på en newline på slutten for deg automatisk) - eller du kan sende kommandoene dom en dictionary til self.sendcommand som vil gjøre den om til json og sende den for deg.

 

Jeg håper dette forenkler ting litt for de av dere som synes det er vanskelig å komme i gang

 

Eksempel-implementasjon på en AI som ikke vil kollidere med egne units (og dermed ta selvmord)

 

from testClient import GameAI 
import random 

class SmartAI(GameAI): 
    def resolve_round(self): 
        command = {"mode": random.choice(["standard", "harvester", "soldier"]), "moves": []} 
        for unit in filter(lambda u: u.owner == self.my_id, self.board.units): 
            x, y = unit.position 
            legal_directions = [] 
            for nx, ny, direction in [(x, y-1, "north"), (x, y+1, "south"), (x-1, y, "west"), (x+1, y, "east")]: 
                rx, ry = self.board.get_real_position(nx, ny) 
                if not self.board.any_units_on_position((rx, ry)) and not self.board[rx][ry].isWall: 
                    legal_directions.append(direction) 

            if legal_directions: 
                direction = random.choice(legal_directions) 
                command["moves"].append([x, y, direction]) 
                self.board.move_unit(x, y, direction) 
        self.send_command(command)  
Endret av etse
Lenke til kommentar
  • 5 uker senere...

Beklager bumping, men ønsker flere deltakere. Slik det er nå vet jeg bare om 2-3 personer som kommer til å levere - så for de av dere som ønsker å gå for premien er det ikke så stor konkurranse. Spesielt med tanke på at de jeg vet blir å levere ikke har så alt for mye erfaring med programmering av AI.

 

For de av dere som tror dette er for vanskelig, og ikke har drevet med AI før: Se på det som en god utfordring. Så fort du kommer litt i gang ser man at det ikke er så utrolig vanskelig å få til litt morsomme ting. Og det å kunne se hvordan algoritmene påvirker hva som skjer er meget motiverende. Så selv om du kanskje ikke vinner konkurransen så har du lært masse.

Lenke til kommentar

Jeg kommer til å levere boten min.

 

Foreløpig kan den bare samle mat, men satser på at jeg greier å få til noe combat før innleveringsfristen.

Sørg for å teste den med siste versjon av serveren. Har funnet noe små issues underveis som jeg har fikset. Protokollen skal være lik.
Lenke til kommentar
  • 3 uker senere...

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...