Permalänk
Medlem

Hur programmerar man ai?

Hej jag har en fråga angående programmering.

På t.ex tre i rad, hur ska man "tänka" när man ska programmera datorn till att kunna spela spelet? Alltså ett (troligtvis väldigt dåligt) sätt att göra det på är ju att skriva alla möjliga kombinationer och hur datorn skulle "reagera" på dem. Detta skulle dock leda till väldigt mycket jobb och kod. I ett mer avancerat spel än tre i rad skulle detta vara helt omöjligt att göra.

Så hur ska man göra? (Det finns säkert ett namn för det)

Ursäkta för den dåligt beskrivande rubriken, någon moderator får gärna ändra

Permalänk
Medlem

Kan göra en 3x3 fler dimensionel array (matris) bestående av bools som är som default "false". Sedan kan du loopa genom den efter varje drag och kolla positionerna efter de som har blivit true. Simpelt sätt.

Ett sätt, finns kanske smartare sätt men detta är enkelt.

Visa signatur

R7-3700X, B450M Mortar MAX, 32GB DDR4 @ 3200, RTX 2080, Corsair CX650M Rev2

Permalänk
Medlem

Beror ju på hur smart du vill att AI'n ska vara.

Jag gjorde ett pacman spel en gång i tiden, där lät vi spökena räkna ut den kortaste vägen till pacman och alltid välja den.
Inte helt otippat blev spelet omöjligt

Tanken var att vi skulle slumpa mellan det och slumpmässig rikning, men vi fick aldrig det att fungera innan det var dags att lämna in uppgiften. Jag tror dock det är rätt spår (för såhär enkla spel).

Visa signatur

"When I get sad, I stop being sad and be awsome instead, true story."

Permalänk
Medlem

Ja men även om man vet positionerna så måste man ju fortfarande göra så att datorn inte bara lägger sin "bricka" (eller vad nu det är) i en tom ruta. Meningen är ju att datorn ska kunna spela bra och veta hur och när den ska stoppa motståndaren.

Permalänk
Medlem
Skrivet av scared:

Ja men även om man vet positionerna så måste man ju fortfarande göra så att datorn inte bara lägger sin "bricka" (eller vad nu det är) i en tom ruta. Meningen är ju att datorn ska kunna spela bra och veta hur och när den ska stoppa motståndaren.

Jaha, läste igenom lite snabbt så ja missförstod vad det hela handlade om.

Visa signatur

R7-3700X, B450M Mortar MAX, 32GB DDR4 @ 3200, RTX 2080, Corsair CX650M Rev2

Permalänk
Medlem

För just tre i rad/fyra i rad finns det strategier för hur man alltid vinner. Om båda spelarna använder samma strategi så blir det oavgjort.
Du får väl helt enkelt sätta dig in i hur strategierna fungerar och sedan programmera detta. Testa att googla detta, det finns massor inom detta ämne

Visa signatur

Den här texten är helt j*vla onödig, men den ska vara här helt enkelt.
The Sleeper: Intel Core i7 930+Noctua NH-C12P SE14, Gigabyte GA-X58A-UD3R, XFX HD6970, Corsair 6GB 1600MHz, be quiet! Dark Power Pro P8 750W, WD Black 640GB, Lian Li PC-A77F
MacBook Pro 4,1 17" iMac 12,2 27" Retina MacBook Pro 12,1 13"
CITERA VID SVAR PÅ MINA INLÄGG SÅ ATT JAG FÅR EN NOTIS!

Permalänk
Medlem

Det finns många metoder för spel-AIs. En metod man kan använda i t.ex. Schack är att bygga ett träd av brädeskonfigurationer, dvs roten på trädet är startpositionen, och sen leder alla drag man kan tänkas göra till barn i trädet.

AIn kan välja bort alla uppenbart dumma drag, för en själv men även för motståndaren, och därmed begränsa storleken på trädet avsevärt. Sedan gör man ett så djupt träd man kan, ju djupare, desto fler drag frammåt kan AIn tänka. En klurig sak är dock att man måste kunna bedömma hur bra en viss brädeskonfiguration är. Ett enkelt sätt är att räkna pjäser, men det är inte helt optimalt. Sedan väljer man det drag som leder till ett underträd med bättre konfigurationer. Men man måste tänka på att även om det finns många grenar i ett underträd som har bra konfigurationer så kanske det finns enstaka dåliga som motståndaren kan tvinga en in på ändå, men man försöker anta att moståndaren gör det bästa draget han kan alltid, fast notera att det är svårt att veta vilket som är det bästa även för moståndaren. Det här med att bedömma vad som är bra är en av de svårare sakerna i just denna metod.

EDIT: Lite mer

Permalänk
Medlem

Ett enkelt sätt är att låta "datorn" räkna ut alla möjliga kombinationer som spelaren kan lägga i nästa drag, samt alla kombinationer "datorn" kan lägga för att få tre i rad, sedan väga dem mot varandra. Ett mer avancerat sätt är att köra "machine learning" och låta "datorn" lära sig efter varje omgång, då kan man t.ex låta den ta alla historiska matcher i beräkning för att estimera var man bör lägga nästa bricka tillsammans med tidigare strategi, t.ex om två platser är lika värda i den första approachen kan man ta tidigare matcher i beräkning om vilken av dessa platser som är "bäst".

Permalänk
Medlem

Vet att man kan vinna genom vissa strategier i tre i rad och liknande spel. Men det kommer fortfarande krävas att jag skriver alla möjliga kombinationer

Sen så är jag intresserad av att veta hur man programmerar detta, tre i rad var bara ett enkelt exempel. Om man t.ex skriver ett schack spel så kan man ju inte skriva alla möjliga kombinationer ?

Edit: Skrev detta inlägg undertiden tufflax och Nvy postade sina

Permalänk
Medlem

Ett naivt implentationssätt skulle kunna vara att låta alla pjäser ha regler för hur dom kan förlytta sig på spelplanen, samt om dom kan flyttas på alls. t.ex om du schack låter gå igenom alla pjäser som kan flyttas, och sen tittar på vilka positioner på spelplanen som reglerna säger att den kan flyttas till, och om platsen är ledig. Sen är det bara att välja den mest optimala av dessa. Låter kanske mer förvirrat nu när jag läser igenom det

Permalänk
Medlem
Skrivet av Nvy:

Ett naivt implentationssätt skulle kunna vara att låta alla pjäser ha regler för hur dom kan förlytta sig på spelplanen, samt om dom kan flyttas på alls. t.ex om du schack låter gå igenom alla pjäser som kan flyttas, och sen tittar på vilka positioner på spelplanen som reglerna säger att den kan flyttas till, och om platsen är ledig. Sen är det bara att välja den mest optimala av dessa. Låter kanske mer förvirrat nu när jag läser igenom det

Det är inte så bara det, som jag försökte förklara i mitt inlägg.

Permalänk
Skrivet av scared:

Sen så är jag intresserad av att veta hur man programmerar detta, tre i rad var bara ett enkelt exempel. Om man t.ex skriver ett schack spel så kan man ju inte skriva alla möjliga kombinationer ?

Det handlar ofta om att bena ut hur en duktig människa gör. Intelligens handlar om att känna igen mönster så ofta handlar mycket om att identifiera vilka mönster.

Permalänk
Medlem

För 3/4/5 i rad är ett ganska enkelt sätt att "poängsätta" alla tomma rutor utefter hur spelplanen ser ut. Sedan lägger ditt AI i rutan med högst poäng. Om vi antar att vi spelar 5 i rad:
* Säg att AI har fyra i rad och kan lägga en femte i rutan x. Ruta X får då enormt hög poäng.
* Säg att moståndaren har fyra i rad men är blockerad på ena sidan. Rutan på andra sidan får då också enormt hög poäng (men inte lika hög som ifall AI kan vinna) för att AIn ska blockera denna.
* Har motståndaren tre i rad och fritt på båda sidor får dessa två rutor höga poäng för att blockera.
* Har AI tre i rad och fritt på båda sidor får detta lite högre poäng, eftersom AI då får "fördel" i att vara ett drag före.

Och så vidare. När hela spelplanen (rutor ute i ingenstans får noll poäng) är kontrollerad lägger AIn i rutan med högst poäng. Finns flera så slumpa vilken den lägger i, så verkar det som att den funderar lite.

Permalänk
Medlem
Skrivet av Whippoorwill:

Det handlar ofta om att bena ut hur en duktig människa gör. Intelligens handlar om att känna igen mönster så ofta handlar mycket om att identifiera vilka mönster.

Fast i just schack, och i många andra fall, så tänker en människa och en dator på helt olika sätt. T.ex. den metoden jag beskrev (bygga ett träd) är populär hos schackdatorer, men det är inte alls så en människa gör. Trädet som en AI bygger kanske bedömmer 100 drag i förväg eller nått sånt, nått som människor inte kan. Människor använder sig mer av mönsterigenkänning (det tar ganska lång tid att träna upp också - att bli bra på schack tar ett tag).

I allmänhet är matte väldigt användbart när man håller på med AI eller maskininlärning. De flesta metoder är mer matte än att försöka efterlikna människor.

Permalänk
Medlem
Skrivet av tufflax:

Det är inte så bara det, som jag försökte förklara i mitt inlägg.

Nej, fokus på mitt inlägg var bara att särskilja på vilka kombinationer som behövde räknas ut, att sen välja mellan dessa kombinationer är en annan femma

Permalänk
Medlem

Med AI ska man inte behöva göra någon egentlig programmering. Det ska själva AI-programmet sköta själv.I början kan det behöva läggas in några regler men efterhand ska programmet själv byta kriterier och lösa själva uppgiften. Det krävs däremot att ett mål anges och att programmet får chans at öva ett antal gånger.
Annars går det på ett sånt här problem att göra ett traditionellt program också.

Permalänk
Skrivet av tufflax:

Fast i just schack, och i många andra fall, så tänker en människa och en dator på helt olika sätt. T.ex. den metoden jag beskrev (bygga ett träd) är populär hos schackdatorer, men det är inte alls så en människa gör. Trädet som en AI bygger kanske bedömmer 100 drag i förväg eller nått sånt, nått som människor inte kan. Människor använder sig mer av mönsterigenkänning (det tar ganska lång tid att träna upp också - att bli bra på schack tar ett tag).

I allmänhet är matte väldigt användbart när man håller på med AI eller maskininlärning. De flesta metoder är mer matte än att försöka efterlikna människor.

Jo det stämmer och jag funderade på om jag skulle gå in på det. Menade generellt princip för AI. Träd-principen är effektiv pga att daotrn är snabb på saker som en hjärna inte är, men det är i strikt bemärkelse 'fusk' som AI betraktat.

Permalänk
Medlem

För just tre i rad och enklare brädspel så skulle iaf jag implementera en minmax algoritm med alpha-beta pruning.

Permalänk
Medlem
Skrivet av Whippoorwill:

Jo det stämmer och jag funderade på om jag skulle gå in på det. Menade generellt princip för AI. Träd-principen är effektiv pga att daotrn är snabb på saker som en hjärna inte är, men det är i strikt bemärkelse 'fusk' som AI betraktat.

Varför skulle det vara fusk?

Permalänk
Medlem

Som JasPlan säger det finns olika algoritmer men just minmax är en simpel algoritm som kan funka på tre i rad utmärkt.

Visa signatur

|AMD Ryzen 9 5900X| |ASUS ROG Strix B550-F| |Crucial Ballistix 32GB CL16@3600MHz| |PNY RTX 4090 XLR8 Gaming| |Samsung 990 Pro 2TB| |Samsung 970 Evo Plus 1TB| |Samsung 860 Evo 1TB| |Corsair RM1000| |Fractal Design Define R5| |LG OLED 48" C2 Evo|

Permalänk
Skrivet av tufflax:

Varför skulle det vara fusk?

Därför att det är en alltför icke-generell algoritm för att räknas som ai, åtminstone av ortodoxa inom området.

Permalänk
Medlem

För Tre-i-rad kan det vara lämpligt att skapa en tvådimensionell array som innehåller alla möjliga lösningar, (är ju inte så många), och kolla efter varje drag om det finns någon rad som motsvarar en rad i lösnings-arrayen. Datorn kan sen ha olika prioriteringar när den sätter ut sina brickor:

#1 - Mitten
#2 - Hörn
#3 - Resterande

Är mittenplatsen upptagen? Ja, det var den, moving on... Finns det något ledigt hörn? Ja, bra, då sätter vi en bricka där.

Ganska enkelt.