如何在Python中创建树结构?

时间:2016-05-22 03:39:15

标签: python tree montecarlo

我正在尝试制作一款看起来很像跳棋的人工智能,逻辑几乎是一样的。无论如何,我正在寻找使用蒙特卡罗树搜索方法,但我不知道如何实现树结构。如果我没错,我树的根应该是初始状态或板,节点应该是所有可能的播放。我知道我必须创建一个函数来计算每个节点的权重并选择最佳的游戏。我的问题是,正如我之前所说,我不知道如何在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。谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

首先,是的。树的根将是董事会的初始状态。

但是,在蒙特卡罗树搜索中,您不需要函数来计算权重(或评估函数)。 在这里,类似的任务是通过称为&#34;模拟&#34;的函数完成的,它从给定的状态(或节点)随机播放游戏,直到结束(直到达到结果,即赢/抽/松),以及返回该结果(+ 1/0 / -1)。 MCTS算法多次使用模拟,以粗略估计好坏,考虑的是移动。然后,它通过对该移动进行更多模拟来探索更深入(或扩展)最佳外观的移动,以获得更清晰的估计。具体地,选择移动,通过该移动的随机游戏的累积结果中的最高值进一步扩展。算法还跟踪探索的深度(因此它不会继续挖掘一次移动并留下更好的移动),这样它就会探索最少遗憾的节点(O(logn),这是最优的)。 / p>

并且,关于使用面向对象编程,它可以帮助,如果你擅长它,但它也可以在没有它的情况下完成(尝试使用节点作为列表,并使用它的子列表来存储你想要存储的功能在每个节点)

资源: