我正在尝试制作一款看起来很像跳棋的人工智能,逻辑几乎是一样的。无论如何,我正在寻找使用蒙特卡罗树搜索方法,但我不知道如何实现树结构。如果我没错,我树的根应该是初始状态或板,节点应该是所有可能的播放。我知道我必须创建一个函数来计算每个节点的权重并选择最佳的游戏。我的问题是,正如我之前所说,我不知道如何在python中实现所述树。
到目前为止,我有我的董事会和两个函数,它们返回了您可以做出的合法行动清单。该板是用10x10多维数组创建的,为了找到可能的移动,我有两个函数接收我要移动的块的X和Y坐标,并检查所有可用的选项。我有2个移动功能的原因是因为一个功能用于基本动作,即当你旁边的空间相邻时,而另一个功能检查“跳跃”,即当你旁边的空间被占用但是空间就在它旁边是免费的。
我会在这里添加我的代码,以防你们更容易理解我想要做的事情。
import numpy as np
matrix = [[1,1,1,1,1,0,0,0,0,0], [1,1,1,1,0,0,0,0,0,0], [1,1,1,0,0,0,0,0,0,0], [1,1,0,0,0,0,0,0,0,0], [1,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,2], [0,0,0,0,0,0,0,0,2,2], [0,0,0,0,0,0,0,2,2,2], [0,0,0,0,0,0,2,2,2,2], [0,0,0,0,0,2,2,2,2,2]]
#new_matrix = np.fliplr(np.flipud(matrix))
#new_matrix = new_matrix.tolist()
print "\n".join(" ".join(str(el) for el in row) for row in matrix)
#print "\n"
#print "\n".join(" ".join(str(el) for el in row) for row in new_matrix)
def basicMove(x,y):
listMoves = []
if x > 0 and matrix[x-1][y] == 0: #left
listMoves.append([x-1,y])
if x < 9 and matrix[x+1][y] == 0: #right
listMoves.append([x+1,y])
if y < 9: #up
if matrix[x][y+1] == 0:
listMoves.append([x,y+1])
if x>0 and matrix[x-1][y+1] == 0: #up left
listMoves.append([x-1,y+1])
if x < 9 and matrix[x+1][y+1] == 0: #up right
listMoves.append([x+1,y+1])
if y > 0: #down
if matrix[x][y-1] == 0:
listMoves.append([x,y-1])
if x > 0 and matrix[x-1][y-1] == 0: #down left
listMoves.append([x-1,y-1])
if x<9 and matrix[x+1][y-1] == 0: #down right
listMoves.append([x+1,y-1])
return listMoves
def hopper(x,y):
listHops = []
listHops.append(basicMove(x,y)) #Call the basic move function inside the hop function
if x > 1 and matrix[x-1][y] != 0 and matrix[x-2][y] == 0: #left
listHops.append([x-2,y])
if x < 8 and matrix[x+1][y] != 0 and matrix[x+2][y] == 0: #right
listHops.append([x+2,y])
if y > 1:
if matrix[x][y-1] != 0 and matrix[x][y-2] == 0: #down
listHops.append([x,y-2])
if x>1 and matrix[x-1][y-1] != 0 and matrix[x-2][y-2] == 0: #down left
listHops.append([x-2,y-2])
if x < 8 and matrix[x+1][y+1] != 0 and matrix[x+2][y-2] == 0: #down right
listHops.append([x+2,y-2])
if y < 8:
if matrix[x][y+1] != 0 and matrix[x][y+2] == 0: #up
listHops.append([x,y+2])
if x > 1 and matrix[x-1][y+1] != 0 and matrix[x-2][y+2] == 0: #up left
listHops.append([x-2,y+2])
if x < 8 and matrix[x+1][y+1] != 0 and matrix[x+2][y+2] == 0: #up right
listHops.append([x+2,y+2])
return listHops
hopper(2,1) #Testing the function
最后一个问题,使用面向对象编程会让事情变得更容易/更有效吗?我一直在检查一些实现MCTS游戏的人的例子,比如Tic tac toe和Reversi on Python,他们似乎都使用OOP。谢谢你的帮助。
答案 0 :(得分:1)
首先,是的。树的根将是董事会的初始状态。
但是,在蒙特卡罗树搜索中,您不需要函数来计算权重(或评估函数)。 在这里,类似的任务是通过称为&#34;模拟&#34;的函数完成的,它从给定的状态(或节点)随机播放游戏,直到结束(直到达到结果,即赢/抽/松),以及返回该结果(+ 1/0 / -1)。 MCTS算法多次使用模拟,以粗略估计好坏,考虑的是移动。然后,它通过对该移动进行更多模拟来探索更深入(或扩展)最佳外观的移动,以获得更清晰的估计。具体地,选择移动,通过该移动的随机游戏的累积结果中的最高值进一步扩展。算法还跟踪探索的深度(因此它不会继续挖掘一次移动并留下更好的移动),这样它就会探索最少遗憾的节点(O(logn),这是最优的)。 / p>
并且,关于使用面向对象编程,它可以帮助,如果你擅长它,但它也可以在没有它的情况下完成(尝试使用节点作为列表,并使用它的子列表来存储你想要存储的功能在每个节点)
资源: