使用不同权重选择一组获胜者的算法

时间:2010-10-18 16:44:04

标签: algorithm math statistics graph-algorithm

我正在尝试设计一个执行以下操作的算法。

输入:

我有一组映射到属性集的键(总n)。属性包含每个属性的权重和属性的值。

输出:

根据属性集及其各自的权重和值,确定一组合格的密钥(总k)。

此外,在选择获胜者的每个周期中都应该对数据进行修改,以便未被选中的人的机会在下一个周期中上升(而获胜的人的机会就好像他们完全一样)新系统)。

希望手头的问题很清楚。基本上,财产的价值和相应的权重将决定哪些关键字更有可能获胜(权重更高的更高价值会增加关键获胜的概率),我们最终将最终选择所有人。

非常感谢有关如何做到这一点的任何输入。

谢谢! - Azeem

2 个答案:

答案 0 :(得分:1)

将您的权重视为一条线的线段,总线长度等于权重之和。选择0到该长度之间的均匀随机数。获胜者是该数字所属的候选人。

删除该获胜者,并相应减少总行长。然后在剩下的候选人中重复此过程,直到您选择了k

在循环之后,将失败者重新缩放以占据原始长度的大部分,然后将获胜者加回来,剩余的小块将在他们之间平均分配。

答案 1 :(得分:0)

一种未经优化但有效的方法可以列出所有参赛者的名单,但附加额外的指数以确定最重要的比例。

psuedo完全脱离任何实际实现的背景,但你应该明白这一点。

const int DEFAULT_WEIGHT = 1;
public List<Contestant> items = new List<Contestant>();
public List<Guid> LotteryPool = new List<int>();

public Contestant Roll()
{
     Random rnd = new Random();
     rnd.Seed = DateTime.Now.Ticks;

     // Generate LotteryPool
     foreach(Contestant item in items)
     {
              for(int i = 0; i < item.Weight; i++)
              {
                       LotteryPool.Add(item.Id);
              }

              item.Weight++;
     }

     // Find the contestant matching a random id from the pool.
     Contestant result = FindContestant(LotteryPool[rnd.Next(0, LotterPool.Count]);

     // apply the default weight the winner
     result.Weight = DEFAULT_WEIGHT;

     return result;
}