[PYTHON] Eine Geschichte über den Wettbewerb mit einem Freund in Othello AI Preparation

Vor wie vielen Jahren hat AlphaGo den Go-Weltmeister gewonnen (vor drei Jahren ^ 1)? Heutzutage wurden verschiedene Methoden entwickelt, und es scheint, dass AIs oft gegeneinander kämpfen.

Also, dieses Mal werde ich gegen die KI kämpfen, die mein Freund N und mein Freund gemacht haben (was sind die Hunderte Millionen Brauereien?).

Ich werde es als Serie wie ein Tagebuch schreiben, also danke.

Gefesselt

Ich habe diesmal eine Bindung aufgebaut, als ich gegen einen Freund gespielt habe. das ist

** Überhaupt nicht suchen **

Alpha Zero, der Nachfolger von Alpha Go, hat durch eine Methode ^ 1 an Stärke gewonnen, die Monte-Carlo-Baumsuche und tiefes Lernen kombiniert, aber die Hälfte davon wird absichtlich verworfen. Der Grund für diese Art der Bindung ist, dass meine Freunde KI mit einer Methode erstellen, die sich auf die Suche konzentriert. Es ist eine Komposition aus sogenannter Erforschung und tiefem Lernen.

Um KI zu machen, muss man ein Spiel spielen, das auf Zufallszahlen und generierten Modellen basiert, und KI die Informationen zur Musikpartitur lernen lassen. Das Modell wird sein Bestes tun, um die für den Gewinn erforderlichen Funktionen zu nutzen.

Vorbereitung

Das erste, was Sie tun müssen, wenn Sie Othello AI erstellen, ist, Regeln festzulegen und Board-Informationen zu verwalten, um Othello selbst auszuführen. In diesem vorbereitenden Abschnitt möchte ich die Situation erläutern, in der sie erstellt wurden.

Zunächst möchte ich etwas sagen.

** Speichern Sie alle anderen Beschleunigungsmittel als den Algorithmus **

Ich habe nicht viel darauf geachtet, das Othello-Spiel selbst zu beschleunigen (ich dachte, es wäre eine Fehlerstufe, weil es ein 8 * 8-Brett ist), aber jetzt, wo ich bereits angefangen habe zu lernen, ist das Lesen süß. Gibt die aktuelle Situation wieder. Ich habe eine klare Vorstellung von der Beschleunigung, also hoffe ich, dass ich auch über diesen Artikel schreiben kann.

Initialisieren, verschieben

othello.py


def othelloInit():
    board = np.zeros((8,8))
    board[4-1][4-1]=1
    board[5-1][5-1]=1
    board[4-1][5-1]=-1
    board[5-1][4-1]=-1
    board=board.astype(np.int32)
    return board

def othelloMove(board,move):
    if type(move)==int:
        return -1
    tempBoard=othelloMovable(board,move)
    if type(tempBoard) ==np.ndarray:
        return tempBoard
    else:   
        return 0



Ich werde alles über Othellos Spielsystem in othello.py schreiben. othelloInit () gibt den ersten Board-Status von Othello (den Status, in dem schwarze und weiße Teile nur in der Mitte in den reversiblen Status versetzt werden) im numpy.ndarray-Format zurück.

Da die Karteninformationen direkt in das Modell eingegeben werden, werden sie auch nicht klassifiziert.

othelloMove () aktualisiert die Karteninformationen basierend auf den Informationen der Verschiebungsvariablen. Überprüft, ob es mit othelloMovable () aktualisiert werden kann, gibt 0 zurück, wenn nicht, und Board-Informationen, wenn möglich.

Kannst du dich bewegen?

othello.py


def othelloBlank(board,move):#0 wenn frei, 1 wenn nicht frei
    k=(board[move[0]][move[1]])*(board[move[0]][move[1]])

    return k
def othelloMovable(Board,Move):#Beurteilt, ob es sich in Bewegung befindet, gibt nach dem Platzieren nach Möglichkeit Board-Informationen zurück, wenn nicht, 0, wenn nicht
    board=Board.copy()
    move=copy.deepcopy(Move)
    old_board=board.copy()
    if move[0]<0:
        move[0]=0
    elif move[0]>=8:
        move[0]=7
    if move[1]<0:
        move[1]=0
    elif move[1]>=8:
        move[1]=7
    if othelloBlank(board,move)==1:
        return 0
    for i in range(1,9):
        
        #print("ColorCheck:"+str(ColorCheck(board,move,i))+" i:"+str(i))
        if ColorCheck(board,move,i)==-1:
            if i==1:#Oben
                #print("i:"+str(i))
                check=1
                for k in range(move[1],8):#Überprüfen Sie die Masse einschließlich sich selbst
                    
                    if k==move[1]:#Ich habe schon nachgesehen, also pass
                        pass
                    else:
                        #print([move[0],k])
                        temp=ColorCheck(board,[move[0],k],i)#Massenkontrolle
                        #print("Check:"+str(check))
                        if temp==-1:#Erhöhen Sie die Anzahl, wenn Ihr Gegner
                        
                            check=check+1
                        elif temp==1 and check>0:#Wenn Sie selbst sind, kehren Sie um, es sei denn, das Feld des Gegners ist nie erschienen
                            
                            check=check*-1
                        else:#Ausschließen, da es nicht umgekehrt wird
                            
                            break
                    if check<0:#Wenn es ein negativer Wert ist, können Sie ihn belassen.
                        
                        for c in range(0,(check*-1)+1):#Bestimmen Sie die zu ändernde Zelle anhand des Zählwerts.
                            board[move[0]][c+move[1]]=1
                        break
            elif i==2:#Oben rechts
                #print("i:"+str(i))
                temp_move=max(move)
                check=1
                for k in range(temp_move,8):#Überprüfen Sie die Masse einschließlich sich selbst
                    
                    if k==temp_move:#Ich habe schon nachgesehen, also pass
                        pass
                    else:
                        temp=ColorCheck(board,[move[0]+k-temp_move,move[1]+k-temp_move],i)#Massenkontrolle
                        #print("Check:"+str(check))
                        if temp==-1:#Erhöhen Sie die Anzahl, wenn Ihr Gegner
                            check=check+1
                        elif temp==1 and check>0:#Wenn Sie selbst sind, kehren Sie um, es sei denn, das Feld des Gegners ist nie erschienen
                            check=check*-1
                        else:#Ausschließen, da es nicht umgekehrt wird
                            
                            break
                    if check<0:#Wenn es ein negativer Wert ist, können Sie ihn belassen.
                        for c in range(0,(check*-1)+1):#Bestimmen Sie die zu ändernde Zelle anhand des Zählwerts.
                            board[c+move[0]][c+move[1]]=1
                        break
            elif i==3:#richtig
                #print("i:"+str(i))
                check=1
                for k in range(move[0],8):#Überprüfen Sie die Masse einschließlich sich selbst
                    
                    if k==move[0]:#Ich habe schon nachgesehen, also pass
                        pass
                    else:
                        temp=ColorCheck(board,[k,move[1]],i)#Massenkontrolle
                        #print("Check:"+str(check))
                        if temp==-1:#Erhöhen Sie die Anzahl, wenn Ihr Gegner
                          
                            check=check+1
                        elif temp==1 and check>0:#Wenn Sie selbst sind, kehren Sie um, es sei denn, das Feld des Gegners ist nie erschienen
                            
                            check=check*-1
                        else:#Ausschließen, da es nicht umgekehrt wird
                            
                            break
                    if check<0:#Wenn es ein negativer Wert ist, können Sie ihn belassen.
                        for c in range(0,(check*-1)+1):#Bestimmen Sie die zu ändernde Zelle anhand des Zählwerts.
                            board[move[0]+c][move[1]]=1
                        break
            elif i==4:#Rechts unten
                #print("i:"+str(i))
                temp_move=max(move[0],7-move[1])
                check=1
                for k in range(temp_move,8):#Überprüfen Sie die Masse einschließlich sich selbst
                    
                    if k==temp_move:#Ich habe schon nachgesehen, also pass
                        pass
                    else:
                        temp=ColorCheck(board,[move[0]+k-temp_move,move[1]-k+temp_move],i)#Massenkontrolle
                        #print("Check:"+str(check))
                        if temp==-1:#Erhöhen Sie die Anzahl, wenn Ihr Gegner
                            check=check+1
                        elif temp==1 and check>0:#Wenn Sie selbst sind, kehren Sie um, es sei denn, das Feld des Gegners ist nie erschienen
                            check=check*-1
                        else:#Ausschließen, da es nicht umgekehrt wird
                            
                            break
                    if check<0:#Wenn es ein negativer Wert ist, können Sie ihn belassen.
                        for c in range(0,(check*-1)+1):#Bestimmen Sie die zu ändernde Zelle anhand des Zählwerts.
                            board[c+move[0]][-c+move[1]]=1
                        break
            elif i==5:#unter
                #print("i:"+str(i))
                check=1
                for k in range(move[1],0,-1):#Überprüfen Sie die Masse einschließlich sich selbst
                    
                    if k==move[1]:#Ich habe schon nachgesehen, also pass
                        pass
                    else:
                        temp=ColorCheck(board,[move[0],k],i)#Massenkontrolle
                        #print("Check:"+str(check))
                        if temp==-1:#Erhöhen Sie die Anzahl, wenn Ihr Gegner
                            check=check+1
                        elif temp==1 and check>0:#Wenn Sie selbst sind, kehren Sie um, es sei denn, das Feld des Gegners ist nie erschienen
                            check=check*-1
                        else:#Ausschließen, da es nicht umgekehrt wird
                            
                            break
                    if check<0:#Wenn es ein negativer Wert ist, können Sie ihn belassen.
                        for c in range(0,(check*-1)+1):#Bestimmen Sie die zu ändernde Zelle anhand des Zählwerts.
                            board[move[0]][-c+move[1]]=1
                        break
            elif i==6:#Unten links
                #print("i:"+str(i))
                temp_move=min(move)
                check=1
                for k in range(temp_move,0,-1):#Überprüfen Sie die Masse einschließlich sich selbst
                    
                    if k==temp_move:#Ich habe schon nachgesehen, also pass
                        pass
                    else:
                        temp=ColorCheck(board,[move[0]+k-temp_move,move[1]+k-temp_move],i)#Massenkontrolle
                        #print("Check:"+str(check))
                        if temp==-1:#Erhöhen Sie die Anzahl, wenn Ihr Gegner
                            check=check+1
                        elif temp==1 and check>0:#Wenn Sie selbst sind, kehren Sie um, es sei denn, das Feld des Gegners ist nie erschienen
                            check=check*-1
                        else:#Ausschließen, da es nicht umgekehrt wird
                            
                            break
                    if check<0:#Wenn es ein negativer Wert ist, können Sie ihn belassen.
                        for c in range(0,(check*-1)+1):#Bestimmen Sie die zu ändernde Zelle anhand des Zählwerts.
                            board[-c+move[0]][-c+move[1]]=1
                        break
            elif i==7:#links
                #print("i:"+str(i))
                check=1
                for k in range(move[0],0,-1):#Überprüfen Sie die Masse einschließlich sich selbst
                    
                    if k==move[0]:#Ich habe schon nachgesehen, also pass
                        pass
                    else:
                        temp=ColorCheck(board,[k,move[1]],i)#Massenkontrolle
                        #print("Check:"+str(check))
                        if temp==-1:#Erhöhen Sie die Anzahl, wenn Ihr Gegner
                            check=check+1
                        elif temp==1 and check>0:#Wenn Sie selbst sind, kehren Sie um, es sei denn, das Feld des Gegners ist nie erschienen
                            check=check*-1
                        else:#Ausschließen, da es nicht umgekehrt wird
                           
                            break
                            
                    if check<0:#Wenn es ein negativer Wert ist, können Sie ihn belassen.
                        for c in range(0,(check*-1)+1):#Bestimmen Sie die zu ändernde Zelle anhand des Zählwerts.
                            board[move[0]-c][move[1]]=1
                        break
            elif i==8:#Oben links
                #print("i:"+str(i))
                temp_move=max(7-move[0],move[1])
                check=1
                for k in range(temp_move,8):#Überprüfen Sie die Masse einschließlich sich selbst
                    
                    if k==temp_move:#Ich habe schon nachgesehen, also pass
                        pass
                    else:
                        
                        temp=ColorCheck(board,[move[0]-k+temp_move,move[1]+k-temp_move],i)#Massenkontrolle
                        #print("Check:"+str(check))
                        if temp==-1:#Erhöhen Sie die Anzahl, wenn Ihr Gegner
                            check=check+1
                        elif temp==1 and check>0:#Wenn Sie selbst sind, kehren Sie um, es sei denn, das Feld des Gegners ist nie erschienen
                            check=check*-1
                        else:#Ausschließen, da es nicht umgekehrt wird
                            
                            break
                    if check<0:#Wenn es ein negativer Wert ist, können Sie ihn belassen.
                        for c in range(0,(check*-1)+1):#Bestimmen Sie die zu ändernde Zelle anhand des Zählwerts.
                            board[-c+move[0]][c+move[1]]=1
                        break
    if np.allclose(board,old_board):
        #print("Ich kann es nicht sagen")
        return 0
    return board

lange... othelloBlank () prüft anhand der Bewegungsinformationen, ob es auf dem Board frei ist. Ich wollte keine Verzweigung verwenden, daher berechne ich sie zwangsweise und gebe sie zurück.

othelloMovable () prüft anhand von Bewegungsinformationen, ob es sich um eine Regel handelt (ob ein Teil umgedreht werden muss). Es ist nur lang. Ich habe es in der Mitternachtsspannung geschrieben und ich habe das Gefühl, dass ich mich damals sogar damit verbessert habe, aber es scheint, dass dies die Ursache für die Langsamkeit ist.

Hast du es getan? Und andere

othello.py


def othelloEndCheck(board):#Finden Sie heraus, ob es einen anderen Ort gibt. Gibt 1 zurück, wenn es platziert werden kann, 0, wenn es nicht platziert werden kann.
    for i in range(0,8):
        for n in range(0,8):
            #print([i,n])
            if type(othelloMovable(board,[i,n]))==np.ndarray:
                #print("Nope")
                return 1
    return 0

def ColorCheck(board,axis,way):#Das Top startet 1 im Uhrzeigersinn und reserviert bis zu 8. 0 ist omnidirektional. Wenn nicht an Bord-2,Wenn die andere Partei-Gibt 1, 0 für Leerzeichen, 1 für sich selbst zurück.
    if way==1:
        if axis[1]>=7:
            return -2
        else:
            #print("ColorCheck")
            #print(board[axis[0]][axis[1]+1])
            return board[axis[0]][axis[1]+1]
    elif way==2:
        if axis[0]>=7 or axis[1]>=7:
            return -2
        else:
            return board[axis[0]+1][axis[1]+1]
    elif way==3:
        if axis[0]>=7:
            return -2
        else:
            return board[axis[0]+1][axis[1]]
    elif way==4:
        if axis[0]>=7 or axis[1]<=0:
            return -2
        else:
            return board[axis[0]+1][axis[1]-1]       
    elif way==5:
        if axis[1]<=0:
            return -2
        else:
            return board[axis[0]][axis[1]-1]
    elif way==6:
        if axis[1]<=0 or axis[0]<=0:
            return -2
        else:
            return board[axis[0]-1][axis[1]-1]
    elif way==7:
        if axis[0]<=0:
            return -2
        else:
            return board[axis[0]-1][axis[1]]
    elif way==8:
        if axis[0]<=0 or axis[1]>=7:
            return -2
        else:
            return board[axis[0]-1][axis[1]+1]


    return 0

Das ist auch lang ... othelloEndCheck () prüft, ob weitere Züge vorhanden sind. Gibt 1 zurück, wenn Sie es treffen können, 0, wenn Sie es nicht treffen können.

ColorCheck () gibt die Farbe der Frames basierend auf den Verschiebungsinformationen zurück (warum haben nur Sie kein othello?). Ich habe nicht alle Anweisungen im Kommentar verwendet, daher habe ich sie noch nicht implementiert.

Derjenige, der etwas anzeigt

othello.py


def othelloReverse(Board):
    board=Board.copy()
    #print("reversing")
    board=board*-1
    return board

def othelloShow(board):
    for i in reversed(range(0,8)):#y
        #print("i:"+str(i))
        for k in range(0,8):#x
            if board[k][i]==-1:
                print("○",end=" ")
            elif board[k][i]==1:
                print("●",end=" ")
            elif board[k][i]==0:
                print("■",end=" ")
        print("")
        print("")
    #print(board[7])
    return 0

othelloReverse () dreht die Farbe des Boards um. Mit anderen Worten, der erste und der zweite Angriff werden ersetzt. Infolgedessen ist die Trefferseite in den Board-Daten immer 1.

othelloShow () zeigt den Status des Boards an. Es ist etwas nervig, unten links (0,0) zu machen. In Zukunft möchte ich der Einfachheit halber die GUI-Methode mit Pygames verwenden.

Zusammenfassung

** Derjenige, der definitiv im Netz ist, ist schneller. ** ** **

Ich bin keine Person, die sehr wettbewerbsfähig programmieren kann, und ich bin kein Programmierbegeisterter, daher kann ich mir keinen Algorithmus vorstellen, der schneller ausgeführt werden kann.

Und ich war schockiert zu wissen, wie ich beschleunigen kann, nachdem ich all das gemacht habe ...

Ich hoffe, wir sehen uns beim nächsten Mal in der Modellbau-Edition.

Recommended Posts

Eine Geschichte über den Wettbewerb mit einem Freund in Othello AI Preparation
Eine Geschichte über maschinelles Lernen mit Kyasuket
Eine Geschichte über die Implementierung eines Anmeldebildschirms mit Django
Eine Geschichte voller absoluter Werte von numpy.ndarray
Geschichte der Verwendung von Resonas Software-Token mit 1Password
Eine Geschichte über die Vorhersage des Wechselkurses mit Deep Learning
Die Geschichte, mit Python eine Hanon-ähnliche Partitur zu machen
Eine Geschichte über das Ausprobieren eines (Golang +) Python-Monorepo mit Bazel
Eine Geschichte, die die Discord-Aktivität im Slack-Status widerspiegelt
Die Geschichte, wie theano mit TSUBAME 2.0 verwaltet wurde
Eine Geschichte über einen Linux-Anfänger, der in einer Woche LPIC101 bestanden hat
Eine Geschichte darüber, wie man einen relativen Pfad in Python angibt.
Eine Geschichte über die Installation von matplotlib mit pip mit einem Fehler
Eine Geschichte über einen Amateur, der mit Python (Kivy) einen Blockbruch macht ②
[Hinweis] Eine Geschichte über den Versuch, eine Klassenmethode mit zwei Unterbalken in der Python 3-Serie zu überschreiben.
Eine Geschichte über den Umgang mit dem CORS-Problem
Maschinelles Lernen Eine Geschichte über Menschen, die mit GBDT in GBDT in Python nicht vertraut sind
Eine Geschichte über einen Amateur, der mit Python (Kivy) einen Blockbruch macht ①
Eine Geschichte über das zufällige Erstellen eines kurzen Songs mit Sudachi Py
[Django] Eine Geschichte über das Feststecken in einem Sumpf beim Versuch, einen Reißverschluss mit einem Formular zu validieren [TDD]
Eine Geschichte über den Versuch, private Variablen in Python zu implementieren.
Eine Geschichte über eine Tragödie, die durch den Austausch von Befehlen im Chat verursacht wurde
Eine Geschichte über einen Python-Anfänger, der mit dem No-Modul'http.server 'feststeckt.
Eine Geschichte über alles von der Datenerfassung über die KI-Entwicklung bis hin zur Veröffentlichung von Webanwendungen in Python (3. KI-Entwicklung)
Eine Geschichte über das Hinzufügen einer REST-API zu einem mit Python erstellten Daemon
Eine Geschichte über einen Erstellungsfehler in einer gemeinsam genutzten Bibliothek, die auf libusb verweist
Eine Geschichte über die Entwicklung eines weichen Typs mit Firestore + Python + OpenAPI + Typescript
Eine erfrischende Geschichte über Slice in Python
Hinweis zu get_scorer von sklearn
Eine launische Geschichte über Slice in Python
Machen wir Othellos KI mit Chainer-Teil 1-
Die Geschichte der Verwendung von Python reduziert
Machen wir Othellos KI mit Chainer-Teil 2-
Die Geschichte eines Parksensors in 10 Minuten mit dem GrovePi + Starter Kit
[Kleine Geschichte] So speichern Sie Matplotlib-Diagramme in einem Stapel mit Jupyter
Eine Geschichte über die Automatisierung von Online-Mahjong (Jakutama) mit OpenCV und maschinellem Lernen
[Memorandum] Eine Geschichte über das Ausprobieren des OpenCV-Tutorials (Gesichtserkennung) in einer Windows-Umgebung
Spiralbuch in Python! Python mit einem Spiralbuch! (Kapitel 14 ~)
Eine Geschichte über einen magischen Umbau, der Lubuntu in ein Chromebook bringt
Zeichne mit PyCall ein Herz in Ruby
[Einfach] AI automatische Erkennung mit einer Webkamera!
Eine Geschichte über Python Pop und Append
Machen wir mit Pylearn 2 eine dreiäugige KI
Eine Geschichte, die ich als Programmieranfänger mit GeoDjango erstellt habe
[Anmerkung] Eine Geschichte darüber, dass es nicht möglich ist, den Proxy mit pip zu durchbrechen
Eine verwirrende Geschichte mit zwei Möglichkeiten, XGBoost in Python + zu implementieren
Eine Geschichte zum Erstellen einer IDE-Umgebung mit WinPython unter einem alten Windows-Betriebssystem.
Eine Geschichte, die in 4 Monaten nach dem Start von AtCoder mit Python hellblau wurde
Flucht aus Pythons virtueller Umgebung ~ Eine Geschichte über das Fangen in einer von mir erstellten virtuellen Umgebung ~
Ich habe versucht, einen x86-Bootloader zu erstellen, der vmlinux mit Rust booten kann