我试图在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,但是它会不断地向它添加更多的二级子节点,这将使我的程序陷入无限循环。
请告诉我哪里出错了。请询问是否需要更多信息。

最佳答案

在Python中,使用列表和变量绑定会遇到一个常见的问题-您将children = []设置为一个类变量,这使它在每个节点中都是相同的列表内存中只有一个列表,每个节点都指向它。更改它,所有节点都会看到更改。将其移动到__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

关于python - 如何在python中正确实现具有n分支因子的树?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39543347/

10-13 07:05