2010-10-18 47 views
0

我試圖設計一個算法,它可以執行以下操作。算法來選擇使用不同權重的獲勝者集合

輸入:

我有一組被映射到設置屬性的鍵(總共n)的。這些屬性包含每個屬性的權重和屬性的值。

輸出:

確定基於所設定的屬性和它們各自的權重和值的一組鍵的那些合格的(總K)。

此外,在選擇獲勝者的每個週期中都應該修改數據,以便未被選中的人的機會在下一個週期中上升(而獲勝的人的機會就好像他們是全新的系統)。

希望手頭的問題很明確。基本上,財產的價值和各自的權重將決定哪些鑰匙更有可能贏得(更高的價值和更高的重量會增加贏得鑰匙的可能性),我們最終會選擇每個人。

任何有關如何做到這一點的輸入將不勝感激。

謝謝! - Azeem

+0

我並不積極從哪裏開始......一個簡單的隨機選擇就是我們目前所做的工作,而且這種工作並不是很好。即使是關於不同算法的想法也是有幫助的。謝謝! – Azeem 2010-10-18 16:51:19

+0

看看debian投票系統:) http://en.wikipedia.org/wiki/Condorcet_method – ykatchou 2010-10-18 16:52:52

+0

謝謝ykatchou。我會更仔細地看看它,它看起來像一個算法來選擇一個贏家(而我們需要k個贏家在一組n中,其中n> k)。我會看看它是否可以修改爲選擇k而不是1. – Azeem 2010-10-18 16:57:40

回答

1

考慮你的權重作爲一行的段,總行長度等於權重的總和。從0到那個長度之間選擇一個統一的隨機數。獲勝者是數字所屬的候選人。

刪除該獲勝者,並相應地縮短總體線條長度。然後重複與剩下的候選人的過程,直到你選擇你的k

循環後,重新調整輸家以佔據原始長度的大部分,並將剩下的小塊平均分配給他們。

+0

感謝walky talky。這是一個很好的看待這個問題的方法。讓我想出一個這樣做的算法。 – Azeem 2010-10-18 17:30:03

+0

而當第一輪的輸家贏得第二輪時,你如何恢復原來的體重?你必須在某個地方存儲這些信息。 – Beta 2010-10-18 17:34:01

+0

@Beta,是的,關於權重的永久數據分別存儲在數據庫中...所以我們可以訪問它。 – Azeem 2010-10-18 17:37:33

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; 
} 
+0

entens,謝謝。這看起來確實會起作用。我們之前考慮過這樣做,但放棄了這一點,因爲我們不確定某人未被選中的概率會如何,因爲我們經歷了多次迭代。儘管現在我想到了,但我認爲我們可以根據另一組條件對權重進行不同的調整,以便可以控制從一次迭代到下一次迭代的概率的增加(例如:使用此方法,某些首選鍵可以是三輪保證選擇等)。只是想着大聲.​​.. – Azeem 2010-10-18 17:22:28