看起来很简单,但我发现实施起来很棘手。我需要一个简单的遗传编程问题,我正在努力实现。在给定节点的情况下,该函数应该返回节点本身或其任何子节点,使得选择节点的概率相对于其深度是正态分布的(因此该函数应该主要返回中间节点,但有时根节点本身或最低节点返回那些 - 但如果这使得它变得非常复杂,如果所有节点都以相同的概率被选择,那就没有必要了,这已经足够了。)
由于
答案 0 :(得分:4)
对于统一的情况,如果你知道每个节点的深度,你可以左边的概率大小(左)/大小(这个),右边是概率大小(右)/大小(这个),否则选择当前节点。每个关键点的单个随机数应该足够了:
int r = rand() % size(this);
if (r < size(left)) { /* go left */ }
else if (r > size(left)) { /* go right */ }
else { /* pick this node */ }
事实上,通过一些调整,您可以将一个随机数传递给每个节点使用。经过一番思考,是的,你可以:如果你向左走,请使用r
未修改;如果你向右走,则从(size(left) - 1)
中减去r
。
对于正态分布,只需使用平均深度为一半的正态分布随机变量来提前选择深度,然后再回到上述算法。请注意,这将根据子树的相对大小在中间节点之间分配,而不是统一。