我有以下类用于定义具有多个特定节点的树结构
class TreeNode
{
std::vector<TreeNode*> children;
}
class BTNode: public virtual TreeNode
{
virtual bool loadAttributes(XML) = 0;
virtual BTState tick() = 0;
void otherFunction1() { used by all the different nodes}
void otherFunction2() { also used by all the node types }
}
可以从XML文件中保存和加载BTNode类的几个特定实现:
class BTSpecificNodeOne: public BTNode
{
bool loadAttributes(XML) { load node specific data from XML }
BTState tick() { specific implementation goes here }
}
class BTSpecificNodeTwo: public BTNode
{
bool loadAttributes(XML) { load node specific data from XML }
BTState tick() { specific implementation goes here }
}
etc.
我还有一种基于常见树节点基因组类型优化树结构的遗传算法:
class TreeNodeGenome: public virtual TreeNode
{
bool load(XML);
TreeNodeGenome* crossover(TreeNodeGenome* other);
virtual void mutate() = 0;
}
此外,要在基因组中使用节点特定实现
class BTSpecificNodeGenomeOne: public BTSpecificNode, public TreeNodeGenome
{
void mutate() { node specific implementation }
}
class BTSpecificNodeGenomeTwo: public BTSpecificNode, public TreeNodeGenome
{
void mutate() { node specific implementation }
}
etc.
我希望能够在XML文件中保存和加载优化结果。
BTSpecificNodeOne,BTSpecificNodeTwo等的实现已经有了一个保存/加载函数,我用它来保存结果,但加载它们有点棘手。
BTNode类的加载函数基于BTNode类重建树(来自XML)(节点可以创建也递归加载的子节点)。为了在遗传算法中再次使用它,我还需要从TreeNodeGenome类派生节点。
我可以仅根据TreeNode中包含的信息重建TreeNodeGenome结构,但我不确定如何&#34;合并&#34;这两棵树在一起。
我知道我可以将加载函数复制到BTSpecificNodeGenomeOne,BTSpecificNodeGenomeTwo等类中,但我想知道是否有更简单/更清晰的方法来做它?
编辑:显然我想做的事情在我上一篇文章中有点不清楚。
我已经实现了一个行为树(BT)类,它使用从BTNode派生的许多不同节点:选择器,序列,不同的条件和动作节点。 BT本身以XML格式保存,可以通过BTNode :: loadAttributes()加载。
除此之外,我还有一种可以优化树结构的遗传算法。 TreeNodeGenome实现了在进化过程中使用的不同节点的遗传算子。
在进化过程中,我使用了BTSpecificNodeGenomeOne,BTSpecificNodeGenome两个节点,它们实现了不同的BT节点和TreeNodeGenome的遗传算子。 TreeNodeGenome仅需要已在TreeNode基类中编码的树的结构以及变异运算符的节点特定实现。由于BT和可演化的树结构是两个概念上不同的东西,我想将它们分开。
我的问题是:我已经为所有BTNode实现了BTNode :: loadAttributes()函数,它从XML文件加载BT。此函数将其子项创建为BTNode,这是不可演化的。如果我想在进化中使用加载的树,我需要以某种方式&#34; merge&#34;它与TreeNodeGenome对象。
我可以通过在每个派生的BTSpecificNodeGenome中重新实现loadAttributes函数来实现这一点,但我想知道是否有更简洁的方法来执行此操作?