[英]algorithm to pick set of winners using different weights
我正在嘗試設計一種執行以下操作的算法。
輸入:
我有一組映射到屬性集的鍵(總計n個)。 這些屬性包含每個屬性的權重和該屬性的值。
輸出:
根據一組屬性及其各自的權重和值,確定一組合格的密鑰(總數為k)。
此外,應在每個選擇獲勝者的周期中對數據進行修改,以使未被選中的某人的機會在下一個周期中增加(而獲勝者的機會就好像他們是新人一樣)。系統)。
希望眼前的問題很清楚。 基本上,屬性的值和相應的權重將確定哪些密鑰更可能獲勝(值越大,權重越高,則該密鑰獲勝的可能性越大),我們最終將選擇所有人。
任何關於如何做到這一點的意見將不勝感激。
謝謝! -阿澤姆
將您的權重視為線段,總線長等於權重之和。 選擇一個介於0和該長度之間的統一隨機數。 獲勝者是該細分受眾群所屬的候選人。
刪除那個贏家,並相應地減少總的線長。 然后,對其余的候選對象重復該過程,直到選擇了k
為止。
周期結束后,重新調整輸家的比例,使其占據原始長度的大部分,然后將贏家加回來,剩下的一小部分平均分配給輸家。
一種未經優化但有效的方法將列出所有參賽者的名單,但要為與重量成正比的比賽添加其他指標。
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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.