2

有谁知道与选择项目相关的算法或数据结构,它们被选择的概率与某些附加值成正比?换句话说:http ://en.wikipedia.org/wiki/Sampling_%28statistics%29#Probability_proportional_to_size_sampling

这里的上下文是一个去中心化的信誉系统,因此附加价值是一个用户对另一个用户的信任价值。在这个系统中,所有节点要么作为完全信任的朋友开始,要么作为完全不信任的未知节点开始。这在大型 P2P 网络中本身并没有用,因为节点数量会比您拥有的朋友多得多,并且您需要知道在不是您直接朋友的大量用户中信任谁,所以我实现了一个动态信任系统,其中未知数可以通过朋友的朋友关系获得信任。

每隔一段时间,每个用户都会选择一个固定数量的目标节点(为了速度和带宽),以根据另一个选定的固定数量的中间节点对他们的信任程度来重新计算他​​们的信任。选择目标节点进行重新计算的概率将与其当前信任成反比,因此未知数很有可能变得更好。中间节点将以相同的方式被选择,除了中间节点的选择概率与其当前信任成正比。

我自己编写了一个简单的解决方案,但是速度很慢,我想找到一个 C++ 库来为我处理这方面的问题。我当然已经完成了自己的搜索,并且我设法找到了我现在正在挖掘的 TRSL。由于这似乎是一个相当简单且可能很常见的问题,我希望有更多的 C++ 库可供我使用,所以我提出这个问题是希望这里有人可以对此有所了解。

4

1 回答 1

3

这就是我要做的:

int select(double *weights, int n) {
    // This step only necessary if weights can be arbitrary
    // (we know total = 1.0 for probabilities)
    double total = 0;
    for (int i = 0; i < n; ++i) {
        total += weights[i];
    }

    // Cast RAND_MAX to avoid overflow
    double r = (double) rand() * total / ((double) RAND_MAX + 1);
    total = 0;
    for (int i = 0; i < n; ++i) {
        // Guaranteed to fire before loop exit
        if (total <= r && total + weights[i] > r) {
            return i;
        }

        total += weights[i];
    }
}

您当然可以根据需要多次重复第二个循环,r每次选择一个新的,以生成多个样本。

于 2010-02-06T23:59:53.600 回答