如何在python中正确实现具有n分支因子的树?

时间:2016-09-17 05:56:39

标签: python algorithm minimax

我正在尝试在python中实现minimax算法,但是我在创建分支树结构时遇到了一些问题。我仍然是业余程序员,所以请不要介意我的代码是否很糟糕。这是我的节点结构

class Node:
    parent = None
    state = None
    pmax = 0        #this represents the MAX player symbol; i.e. SELF
    pmin = 0        #this represents the MIN player symbol; i.e. OPPONENT
    stateCost = 0   #this represents utility cost of leaf nodes based on the matrix state
    bestCost = None    #this represents the chosen path in the minimax algorithm
    children = []

    def __init__(self,mat,up,mx,mn):
        self.parent = up
        self.state = mat
        self.pmax = mx
        self.pmin = mn
        stateCost = 0

    def addChild(self,newState,up):
        n = Node(newState,up,self.pmax,self.pmin)
        self.children.append(n)

    def evaluateChildren(self,minmax):
        ln = len(self.state[0])
        for x in range(ln):
            #newState = insertIntoSink(self.state[0],x)
            cloneState = cloneMatrix(self.state)
            newState = insertIntoSink(cloneState,x,minmax)
            print "state being added"
            for list in newState:
                print list
            self.addChild(newState,self)

        print "done Evaluating CHILDREN"


     def evaluateSubChildren(self,minimax):
        ln = len(self.state[0])

        for l in self.children:
            for x in range(ln):
              cloneState = cloneMatrix(self.state)
              newState = insertIntoSink(cloneState,x,minimax)
              l.addChild(newState,l)

对于我正在做的事情,根节点必须有7个孩子,每个孩子应该有7个孩子。每个孩子都将在父节点中修改初始矩阵。

发生错误的是,在添加子子节点(即二级子节点)之后,不会将其添加到子节点列表中,而是将它们添加到根节点中。

儿童的创造被称为如下。

 def getBestMove(self):
    move =0
    maxVal = -1;
    i=-1;
    #evaluate all the 7 children

    self.evaluateChildren(2)

    self.evaluateSubChildren(1)

   #more calculations go here

我首先尝试调用相同的evaluateChildren()函数,如下所示:

    def getBestMove(self):
    move =0
    maxVal = -1;
    i=-1;
    #evaluate all the 7 children

    self.evaluateChildren(2)


    #evaluate second level children
     for n in self.children:
         print "evaluating SECOND LEVEL CHILDREN"
         n.evaluateChildren()

如果我在评估后检查根节点的子节点数,它应该是7,但它会不断添加更多的2级子节点,这会使我的程序无限循环。

请让我知道我哪里出错了。请询问是否还需要更多信息。

1 个答案:

答案 0 :(得分:1)

你正在使用Python中的列表和变量绑定进行常见的转换 - 你使children = []成为一个类变量,这使得它在每个Node中都是相同的列表。内存中有一个列表,每个Node都指向它。更改它,所有节点都会看到更改。将其移至__init__以使其成为每个实例的新标记。

Class Node:

    def __init__(self,mat,up,mx,mn):

        self.children = []

各种各样的人绊倒了同样的问题'许多事情错误地引用了完全相同的列表',大量讨论发生了什么,为什么,如何避免它:

Python Strange Behavior with List & Append

Weird list behavior in python

Python array weird behavior

Some strange behavior Python list and dict

Strange behavior of lists in python

List of lists changes reflected across sublists unexpectedly

Generating sublists using multiplication ( * ) unexpected behavior

List of lists changes reflected across sublists unexpectedly

Nested List Indices

Function changes list values and not variable values in Python

Why does my original list change?

Python: why does my list change when I'm not actually changing it?

python: list changes when global edited

python: changes to my copy variable affect the original variable