我正在尝试在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级子节点,这会使我的程序无限循环。
请让我知道我哪里出错了。请询问是否还需要更多信息。
答案 0 :(得分:1)
你正在使用Python中的列表和变量绑定进行常见的转换 - 你使children = []
成为一个类变量,这使得它在每个Node中都是相同的列表。内存中有一个列表,每个Node都指向它。更改它,所有节点都会看到更改。将其移至__init__
以使其成为每个实例的新标记。
Class Node:
def __init__(self,mat,up,mx,mn):
self.children = []
各种各样的人绊倒了同样的问题'许多事情错误地引用了完全相同的列表',大量讨论发生了什么,为什么,如何避免它:
Python Strange Behavior with List & Append
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
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