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.
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.
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.
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.
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.
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.
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.
** 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