【发布时间】:2020-06-05 15:41:19
【问题描述】:
我正在实现一种树搜索,它需要能够从树中获取“最有希望的节点”,然后对该节点执行某些操作,以便为下一次迭代更新树的其余部分。
问题:对象指针Board* 的向量属性似乎在产生它们的函数的return 和在调用环境中保存它们的Board* 值之间变化。
我的输出:
>>g++ -std=c++17 -o tmp.out tests/test.cpp // <- require c++17 for other parts of the project
>>./tmp.out
Best leaf by tree traversal has score: 8
Best leaf associated state has -1977735524 values in its attribute vector though! (Should be 4)
我的期望:
>>g++ -std=c++17 -o tmp.out tests/test.cpp // <- require c++17 for other parts of the project
>>./tmp.out
Best leaf by tree traversal has score: 8
Best leaf associated state has 4 values in its attribute vector though! (Should be 4)
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
class Board{
vector<int> attribute;
string name;
public:
Board(){
attribute = {1,2,3,4};
name = "nonempty name";
}
Board getcopy(){
return *this;
}
int AttrLen(){
return attribute.size();
}
};
class Node{
Board* board;
Node* parent;
std::vector<Node*> children;
int depth=0;
int score=0;
bool terminal=false;
public:
Node(Node* _parent, Board* _board,int _depth){
parent = _parent;
board = _board;
depth = _depth;
// randomize score
score = rand() % 10;
if(depth<2){
for(int _=0;_<2;_++){
Board new_state = board -> getcopy();
children.push_back(new Node(this,&new_state,depth+1));
}
} else {
children = {};
terminal=true;
}
}
int getScore(){
return score;
}
bool isTerminal(){
return terminal;
}
Node* getBestChild(){
if(!terminal){
if(children[0] ->getScore() > children[1] -> getScore()){
return children[0];
} else {
return children[1];
}
} else {
return nullptr;
}
}
Board* getStateptr(){
return board;
}
};
int main(){
// make a board
Board my_board = Board();
// make a root node
Node root = Node(nullptr, &my_board, 0);
Node* best_child = root.getBestChild();
while(!best_child -> isTerminal()){
best_child = best_child -> getBestChild();
}
cout << "Best leaf by tree traversal has score: " << best_child -> getScore() << endl;
cout << "Best leaf associated state has " << best_child -> getStateptr() ->AttrLen() << " values in its attribute vector though! (Should be 4)" << endl;
}
【问题讨论】:
-
现在这段代码失败的原因与我的真实代码失败的原因相同。我最感兴趣的是为什么
Board*上的向量属性在返回和调用环境实例化之间改变大小。我试图做到这一点,以便打印输出显示我在说什么。 -
当我编译并运行它时,我得到了一堵输出墙,但我不知道你认为它有什么问题。请在问题中包括输出和预期输出。请尽量减少代码,我想不是所有的代码都需要重现问题
-
啊,是的,我想这很重要。我减少了打印输出并尝试使打印输出更具可读性,并添加到我的输出/预期输出中。
-
new_child是Node*,为什么会打印<node_hash1>?
标签: c++ pointers tree monte-carlo-tree-search