是否有人知道与选择项目相关的算法或数据结构,并且选择它们的概率与某些附加值成比例?换句话说:http://en.wikipedia.org/wiki/Sampling_%28statistics%29#Probability_proportional_to_size_sampling
这里的上下文是一个分散的信誉系统,因此附加值是一个用户在另一个用户中的信任值。在该系统中,所有节点或者以完全不可信的完全信任或未知的朋友开始。这在大型P2P网络中本身没用,因为节点会比你的朋友多得多,你需要知道谁不信任那些不是你的直接朋友的大量用户,所以我已经实现了一个动态的信任系统,其中未知数可以通过朋友的朋友关系获得信任。
每个用户经常会选择一个固定数量(为了速度和带宽)目标节点,以根据另一个选定的固定数量的中间节点信任它们来重新计算它们的信任。选择目标节点进行重新计算的概率将与其当前信任度成反比,以便未知数很有可能变得更好。中间节点将以相同的方式选择,除了选择中介的概率与其当前信任成比例。
我自己写了一个简单的解决方案,但速度很慢,我想找一个C ++库来为我处理这方面的问题。我当然完成了自己的搜索,并设法找到了我正在挖掘的TRSL。由于它似乎是一个相当简单且可能是常见的问题,我希望有更多的C ++库可以用于此,所以我问这个问题,希望这里有人可以对此有所了解。
答案 0 :(得分: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
,以生成多个样本。