所以我正在嘗試實現一個黑白棋遊戲的蒙特卡洛搜索樹。我有一個根節點和子節點,如果您可以在一次合法移動中從「y」移動到「x」,那麼'x'是'y'的子節點。由於製作新對象而在C++中耗盡內存
在每個節點上,我存儲一個包含所有棋盤信息的「棋盤」對象,例如每塊棋子的值。我遇到的第一個問題是,如果我更改了子節點的板對象,它也更改了父節點的值。我通過爲每個子節點創建一個'NEW'Board對象來解決這個問題,但是當我運行模擬數千次時,導致內存過多,直到內存耗盡。
我只是徘徊,如果有一種方法來改變孩子節點中的電路板信息,而不改變父母的電路板信息,或者如果有更好的方式來存儲電路板信息在每個節點而不是爲每個節點創建一個新的Board對象。
如果有什麼需要澄清下面的評論,謝謝閱讀!
編輯:
for (int x = 0; x < numberOfChildren; x += 1) {
// Resets *currentBoard to the same state as the node being expanded
Board *currentBoard = nodeToExpand->getCurrentBoard();
// Retrives the board value information
int** temporaryBoardValues = currentBoard->getBoardValues();
// Makes a new board object with the previous parameters
Board *temporaryBoard = new Board(blockSize, boardSize, offset);
// Sets the new board values to the same as the old ones
temporaryBoard->setBoardValues(temporaryBoardValues);
// Creates a clone of that board state
// Board *temporaryBoard = cloneBoard(*currentBoard);
// Creates a node with the cloned board state, setting the parent to be the node being expanded.
// Assigns it one of the available moves
// Produces the array of child nodes
myChildren[x] = new Node(nodeToExpand, temporaryBoard, availableMoves[x], currentPlayer);
//delete temporaryBoard;
}
一小段代碼。它是我創建一個耗盡所有內存的新Board對象的部分。
你可以發佈一個小代碼示例? –
您是否存儲這些信息以進行某種撤消操作? – NathanOliver
對於深度爲n的分支樹搜索:您只需要在內存中保留當前最佳移動節點和n節點。你不需要保持整個樹只有當前的搜索/評估沿着一個分支深入'n',這可以很容易地保存在堆棧中 - 如果你在堆上掛着許多板,那麼你可能做錯了。 (也參見alpha-beta算法)。 –