这看起来很简单,但我发现实现起来很棘手。我需要它来解决我正在尝试实现的一个简单的遗传编程问题。给定一个节点,函数应该返回节点本身或它的任何子节点,这样选择节点的概率相对于它的深度是正态分布的(所以函数应该返回大部分中间节点,但有时返回根节点本身或最低的节点-但如果这使它变得更加复杂,那么这并不是真正必要的,如果所有节点都以相等的概率被选择,这就足够了)。
谢谢
发布于 2010-04-04 10:45:07
对于均匀的情况,如果你知道每个节点的深度,你可以向左选择概率大小(左)/size(这),向右选择概率大小(右)/size(这),否则选择当前节点。每个结合点的单个随机数应该足够了:
int r = rand() % size(this);
if (r < size(left)) { /* go left */ }
else if (r > size(left)) { /* go right */ }
else { /* pick this node */ }
实际上,通过一些调整,您可能可以向下传递一个随机数,以便在每个节点上使用。经过一番思考,是的,你可以做到:如果你向左转,使用未修改的r
;如果你向右转,从r
中减去(size(left) - 1)
。
对于正态分布,只需使用均值为深度一半的正态分布随机变量提前选择深度,然后回退到上面的算法。需要注意的是,这将根据子树的相对大小在中间节点之间分布,而不是均匀分布。
https://stackoverflow.com/questions/2574173
复制相似问题