【发布时间】:2010-07-11 14:40:18
【问题描述】:
我正在用 C++ 编写一个程序,该程序使用遗传技术来优化表达式树。
我正在尝试编写一个类Tree,它具有作为数据成员Node root。节点构造器生成一个随机的节点树,其中+,-,*,/ 为节点,整数为叶子。
我一直在研究这个,但我还不清楚最好的结构。因为我需要访问树中的任何节点才能对树进行变异或杂交,所以我需要保留节点的字典。一个数组就可以了,但似乎 vector 是推荐的容器。
vector<Node> dict;
因此,Tree 类将包含一个向量 dict,其中包含树的所有节点(或指向相同节点的指针)、树的根节点和一个用于保存树适应度度量的变量。
class Tree
{
public:
typedef vector<Node>dict;
dict v;
Node *root;
float fitness;
Tree(void);
~Tree();
};
class Node
{
public:
char *cargo;
Node *parent;
Node *left;
Node *right;
bool entry;
dict v;
Node(bool entry, int a_depth, dict v, Node *pparent = 0);
};
Tree::Tree()
{
Node root(true, tree_depth, v);
};
好像没有好地方放typedef vector<Node>dict;,因为如果放到Tree的定义里,它不知道Node,这样说会报错。我还没找到typedef 的地方。
但我什至不确定向量是否是最好的容器。节点只需要按顺序编入索引。容器需要增长,因为可能有 200 到 500 个节点。
【问题讨论】:
-
为什么不把 Node 的定义移到 Tree 的前面呢?节点指针向量也可能(或可能不会,很难说)为您提供更好的服务。
-
@Neil :这就是我最初的想法(并已删除),但 Node 也有一个
dict成员......它按值传递,并存储一个副本。我不清楚为什么这很有用(特别是对于优化),也许彼得可以详细说明? -
每个节点都必须将自己添加到字典中作为其实例化。 dict.push_back(this) 我想如果 dict 是 Tree 的成员,我必须将它传递给 Node 构造函数,它会将它传递给每个后续的 Node 构造函数。
-
@Peter Make Tree 负责将节点添加到 dict - 节点本身不应该知道它们所包含的内容 - 对于包含类和容器类来说几乎总是如此。
-
@Peter 节点和树通常不应该做太多 - 你可能想考虑第三类,比如 Breeder,它知道树和节点并且可以完成更重的工作。在 C++ 中遇到问题时,通常的解决方案是引入一两个额外的类。