Я пишу программу на C++, которая использует генетические методы для оптимизации дерева выражений.
Я пытаюсь написать класс Tree
, который имеет член данных Node root
. Конструктор узла генерирует случайное дерево узлов с +
,-
,*
,/
в качестве узлов и целыми числами в качестве листьев.
Я работаю над этим какое-то время, и я еще не определился с лучшей структурой. Поскольку мне нужно получить доступ к любому узлу в дереве, чтобы изменить или скрестить дерево, мне нужно вести словарь узлов. Массив подойдет, но кажется, что вектор является рекомендуемым контейнером.
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;
, потому что, если оно входит в определение дерева, оно не знает об узле и выдает сообщение об ошибке. Я не смог найти место для typedef
этого.
Но я даже не уверен, является ли вектор лучшим контейнером. Узлы просто нужно индексировать последовательно. Контейнеру нужно будет расти, так как может быть от 200 до 500 узлов.
dict
... Который он передает по значению и сохраняет копию. Я не понимаю, почему это полезно (особенно для оптимизации), возможно, Питер может уточнить? - person Stephen   schedule 11.07.2010