【问题标题】:Seemingly impossible writing to a variable似乎不可能写入变量
【发布时间】:2017-02-08 10:15:45
【问题描述】:

所以,我正在做一些 minMax AI,并且在递归例程中,一个未写入的变量正在发生变化。我已经附加了整个代码,但问题似乎包含在 populateChildren() 子例程中。每次,“扇区”数组都以某种方式被写入,我唯一的想法是,“扇区”可能会以某种方式成为其他东西的别名,或者被导入为某个东西的参数。我看不到问题,但如果有人能告诉我我做错了什么,请提前感谢。

class Node(object):

    def populateChildren(self,player,board):
        newBoard=board
        start=randomStart(board, player)
        if self.depth>-1:
            for i in board[start][4]: 
                print("1: ",sectors[0][3])  ##OUTPUTS "1: 0"
                newBoard[0][3]=1000000   ##This is not the actually intented process, but shows the issue
                print("2: ",sectors[0][3])  ##OUTPUTS "2: 1000000"
                self.children.append(Node((self.depth)-1,-self.player,newBoard,self.treeVal(newBoard)))
        else:
            print("RECURSION END")

    def treeVal(self,board):
        if checkWin(board)==True:
            return maxsize*self.player
        elif checkWin:
            return maxsize*-self.player
        return 0

    def __init__(self,depth,player,newBoard,value=0):
        self.depth=depth
        self.player=player
        self.value=value
        self.children=[]
        #self.board=board
        #print("pop conditions: ",player,newBoard)
        self.populateChildren(player,newBoard)
        #print("post-pop conditions: ",player,newBoard)

def minMax(node,depth,player):
    print("RUN Run Run run run \n\\n\n\n\n\n\n\ run ")
    if depth==0 or abs(node.value)==maxsize:
        print("DONE\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nDONE")
        return node.value
    bestValue=maxsize*-playerNum
    for i in range(0,5):
        child=node.children[i]
        value=MinMax(child,depth-1,-playerNum)
        if abs(maxsize*playerNum-value)<abs(maxsize*playerNum-bestValue):
            bestValue=value
    print(str(depth*playerNum)+")"+" "*depth+str(bestvalue))
    return bestValue

def AIMove(Node,sectors):
   temp=sectors
   newBoard=temp
   ##newBoard=sectors
   currentPlayer=-1
   depth=5
   print(depth)
   looks=0
   while looks<6:
      Node.player=-1
      node=Node(depth,currentPlayer,newBoard,value=0)
      bestChoice=-100
      bestValue=currentPlayer*maxsize
      for i in range(len(node.children)):
         child=node.children[i]
         value=minMax(child,depth,currentPlayer)
         if (abs(currentPlayer*maxsize-value)<=abs(currentPlayer*maxsize-bestValue)):
            bestValue=value
            bestChoice=i
      bestChoice+=1
      print("node: ",node.children[0].value)
      print("choice: ",bestChoice)
      looks+=1

【问题讨论】:

  • 既然已经保存在self中,为什么还要将player传递给populateChildren???

标签: python recursion minmax


【解决方案1】:

如我所见,在AIMove 中,您将temp 设置为sectors,然后将newBoard 设置为temp,并将其作为newBoard 参数传递给Node。您将其传递给将子代填充为board,您将其分配给您更改的newBoard,因此sectors 更改。 呸!您总是只是链接到内存中的同一位置,因此新对象名称并不意味着新对象。

【讨论】:

  • 哦,我明白了,太棒了,谢谢伙计 :) 你建议我如何将其复制为一个新变量(即:创建一个我可以在不更改原始 secotrs 数组的情况下处理的新 baord)?
  • 所以你需要做一个深拷贝,看看这些问题:stackoverflow.com/questions/6431973/…stackoverflow.com/questions/19676538/…。他们应该提供帮助:-)
  • 非常感谢!我多年来一直在尝试解决这个问题,我选择使用 copy.deepcopy 而不是 numpy,但它似乎正在工作。干杯
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-23
  • 2019-02-11
  • 1970-01-01
  • 2017-12-01
  • 2021-06-07
相关资源
最近更新 更多