• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Algorytm grania w większe kółko i krzyżyk

Object Storage Arubacloud
0 głosów
1,591 wizyt
pytanie zadane 15 listopada 2018 w C i C++ przez jankustosz1 Nałogowiec (35,880 p.)
edycja 15 listopada 2018 przez jankustosz1
Myślę nad algorytmem który grałby w kółko i krzyżyk na planszy 6x7, gdzie aby wygrać trzeba mieć linię długości 4. Nie jest to takie proste jak mogłoby się wydawać bo złożoność sprawdzenia wszystkich możliwości brutem to (6*7)! gdyż w pierwszym ruchu są wszystkie opcje do wyboru, w drugim wszystkie -1 itd.

Zna ktoś jakiś optymalny algorytm, taki aby komputer robił najlepsze ruchy?

 

Jak narazie jedyne co mi przychodzi do głowy to ucinanie drzewa poszukiwań, ale to prawie nic nie da przy takich liczbach, myślałem też aby robić hash code każdej pozycji i zrobić spamiętywanie, aby w przypadku powtórzenia się takiej samej pozycji nie liczyć na nowo tego samego, ale to też nic nie da.
komentarz 15 listopada 2018 przez Aisekai Nałogowiec (42,190 p.)
imo, to wystarczy że w danej chwili sprawdzisz wszystkie możliwości ruchów max 8 ruchów w przód. Możliwe, że nawet sprawdzenie 4 ruchów w przód by wystarczyło, ale pewien nie jestem.
komentarz 16 listopada 2018 przez jankustosz1 Nałogowiec (35,880 p.)
Brzmi całkiem dobrze, ale pojawia się pewien problem

40^5 to już 102 mln i na więcej w praktyce czas działania nie pozwala.  Czyli 5 ruchów naprzemiennych do przodu. Problem pojawia się w tym, że np. po 5 ruchach nie widzi za dużo przegranych i wygranych i ma wiele ruchów do wyboru i np. wybierałoby jako pierwszy ruch zawsze lewy górny róg, bo czemu nie, przecież i tak po 5 ruchach nie przegra.

Może lepiej jakieś heurystyki używać?

1 odpowiedź

0 głosów
odpowiedź 16 listopada 2018 przez Bondrusiek Maniak (61,370 p.)
Witam,

nie wiem czy o to Ci chodzi ale polecam zapoznać się z algorytmem minmax https://www.geeksforgeeks.org/minimax-algorithm-in-game-theory-set-3-tic-tac-toe-ai-finding-optimal-move/.

który sprawdza się do pisania AI. Algorytm minimalizuje oraz maksymalizuje straty i na tej podstawie wybiera optymalny ruch.
komentarz 16 listopada 2018 przez jankustosz1 Nałogowiec (35,880 p.)
Właściwie to używam czegoś podobnego, ale chyba nie zrozumiałeś w czym problem. Taki minmax sprawdza wszystkie możliwości i złożoność tego jest dramatyczna.

Btw. ciekawi mnie na jakiej podstawie miałaby być oceniana pozycja w grze? Wydaje mi się być tylko -1 0 lub 1 (przegrana, remis lub wygrana), z tego powodu skoro wyliczy że przy najlepszych ruchach każdy pierwszy ruch prowadzi do remisu to w jaki sposób powinien wybrać który najlepiej zagrać?
komentarz 16 listopada 2018 przez Bondrusiek Maniak (61,370 p.)

Nie wydaje mi się żeby użycie tego algorytmu było jakimś dużym obciążeniem. Algorytm minmax świetnie nadaje się do pisania AI prostych gier gdzie obliczeń jest więcej np. Szachy.

 

Co do skali to musisz sobie najlepiej sam ustalić skalę. Np. trzy pod rząd te same znaki zwraca Ci 10 a jak są cztery to 100

int evaluate(char b[3][3]) 
{ 
    // Checking for Rows for X or O victory. 
    for (int row = 0; row<3; row++) 
    { 
//dla 4 pod rzad 
        if (b[row][0]==b[row][1] && 
            b[row][1]==b[row][2] &&
            b[row][2]==b[row][3]
) 
        { 
            if (b[row][0]==player) 
                return +100; 
            else if (b[row][0]==opponent) 
                return -100; 
        } 
//dla 3 pod rzad 
        if (b[row][0]==b[row][1] && 
            b[row][1]==b[row][2]) 
        { 
            if (b[row][0]==player) 
                return +10; 
            else if (b[row][0]==opponent) 
                return -10; 
        } 
    } 
...

 

komentarz 16 listopada 2018 przez jankustosz1 Nałogowiec (35,880 p.)
Dobry pomysł z tym dawaniem punktów za 3 takie same obok siebie, dodam to, ale to nadal za mało ;)

Co do obciążenia to jest to bardzo duże duże obciążenie. Komputer w jakimś rozsądnym czasie wykona operacje w pętli o długości około 10^7, a złożoność tego algorytmu jest w przybliżeniu wykładnicza do ilości pól. W kółko i krzyżyk 3x3 pola idzie to szybko bo jest to 9!, ale 4x4 to już 16! byś się za szybko tym algorytmem nawet z prostymi optymalizacjami nie doczekał wyniku. I wyobraź sobie teraz że ja chcę zrobić do 7x6

Podobne pytania

+1 głos
0 odpowiedzi 2,036 wizyt
+1 głos
1 odpowiedź 263 wizyt
pytanie zadane 15 listopada 2022 w JavaScript przez Iei Obywatel (1,950 p.)
0 głosów
1 odpowiedź 528 wizyt
pytanie zadane 1 lutego 2022 w Python przez Makapaka182 Nowicjusz (230 p.)

92,572 zapytań

141,423 odpowiedzi

319,645 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...