代码之家  ›  专栏  ›  技术社区  ›  Stephen Cross

选择概率与信任成比例的节点

  •  2
  • Stephen Cross  · 技术社区  · 15 年前

    是否有人知道与选择项目相关的算法或数据结构,其被选择的概率与某个附加值成比例?换言之: http://en.wikipedia.org/wiki/Sampling_%28statistics%29#Probability_proportional_to_size_sampling

    这里的上下文是一个分散的声誉系统,因此附加值是一个用户对另一个用户的信任值。在这个系统中,所有节点要么作为完全信任的朋友开始,要么作为完全不信任的未知节点开始。在一个大型的P2P网络中,这一点本身并不有用,因为节点的数量比你有朋友的要多,你需要知道谁应该信任那些不是你的直接朋友的大用户群,所以我实施了一个动态信任系统,在这个系统中,未知者可以通过朋友关系获得信任。

    每隔一段时间,每个用户都会选择一个目标节点的固定数字(为了速度和带宽),以根据另一个选定的中间节点的固定数字信任它们的程度重新计算它们的信任。选择一个目标节点进行重新计算的概率与它当前的信任度成反比,这样未知的节点就有很好的机会被更好地了解。中间节点的选择方式相同,只是中间节点的选择概率与其当前信任度成正比。

    我自己编写了一个简单的解决方案,但是速度很慢,我想找一个C++库来处理这个问题。我当然已经完成了我自己的搜索,我设法找到了我现在正在挖掘的trsl。因为它看起来是一个相当简单和可能的问题,我希望能有更多的C++库来使用,所以我问这个问题,希望有人能对此有所启发。

    1 回复  |  直到 15 年前
        1
  •  3
  •   j_random_hacker    15 年前

    这就是我要做的:

    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 每次生成多个样本。