簡體   English   中英

選擇不同權重的獲勝者的算法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM