2012-12-18 16 views
-1

我正在尋找1x1在線遊戲的配對算法。像往常一樣,玩家必須不是按照他們的技能或水平進行匹配,而是通過一些特定的過濾器來匹配。每個玩家發送請求,在那裏他指定了一些參數集(通常是2-4個參數)。如果指定了某個參數,那麼玩家只能與那些已經發送該參數的玩家匹配的值完全相同的值,或者沒有指定此參數的玩家。一套過濾器的配對算法

我需要這個算法是線程安全的,最好是快速的。如果它能夠運行3-4甚至更多的參數,那將是非常好的,但是我正在尋找只有一個參數的算法(在我的情況下它是遊戲賭注)。另外,我會很欣賞如何在我的服務器平臺上實現或改進此算法的想法 - ASP.NET

UPD

我面臨的一個問題,更是要找到匹配不能被用戶發送請求後,正確的,因爲如果其他用戶完成了前面的匹配之前將要求執行,他們不會甚至可能匹配。所以看起來匹配查找應該按計劃開始,我需要幫助如何優化它,以及如何選擇時間間隔來開始新的匹配查找。

+3

[你有什麼嘗試?](http://mattgemmell.com/2008/12/08/what-have-you-tried/) – alestanis

+0

所以,你希望我們爲你算出這個算法,而你沒有嘗試過什麼? –

+0

@alestanis我還沒有嘗試過一些特定的算法。目前,我正在創建一些傳入請求的電子表格,當新的請求到來時,只需循環檢查指定參數的值即可。但是,我的algroithm不是線程安全的,並且在某些情況下(如果請求幾乎在同一時間收到),它會收到2個可匹配的請求,但會將它們留在電子表格中。 –

回答

0

爲什麼不建立一個簡單的算法的第一個版本。然後再改進。比較用戶和每個現有用戶的新過濾條目。

對於線程安全性:只需正確鎖定一切。

如果您有成千上萬的用戶,請進行優化。

+0

其實我不想自己創建算法,而是改變或改進一些現有的算法。正如我發現的,有很多配對算法,但它們通常基於玩家技能或等級,並且找到最接近的匹配,但不是**精確**匹配。我很欣賞如何爲我的情況調整這些算法的想法。 –

+0

然後,你必須向我們展示代碼或告訴我們你在談論哪種算法... – duedl0r

0

可能工作的一件簡單的事情就是使用SQL數據庫表,每個匹配參數都有一個可選的列。對於每個傳入的請求,請執行"SELECT * where parm1 = input1 and parm2 = input2 ...忽略未指定的參數。如果沒有匹配,請插入一行設置參數。

只要你序列化數據庫訪問,你應該沒有線程問題。

+0

當然,它可以工作,並且它可能能夠服務相當數量的用戶(任務畢竟非常簡單),但是您在通過SQL解析器和硬盤進行的非常昂貴的旅程中獲取非持久性數據。這看起來像是一場性能上的犧牲,並沒有真正的好處。 – aaaaaaaaaaaa

1

最好的辦法是創建一個專用的匹配製作線程,然後讓其他線程發送請求。

至於匹配算法,嘗試一個簡單的方法,在鏈表上有所有不匹配的請求,當有新的請求進入時,從鏈表底部開始進行強力搜索,如果不匹配發現,將請求添加到鏈接列表的頂部。根據語言,匹配的複雜性和優化,您可以在完全使用的核心上每秒比較大約1億次比較。儘管這種方法具有強悍的性質,但你可能永遠不會需要這麼多的比較。

最早的第一種方法應該確保任何可能與列表中的幾個匹配的請求都傾向於與最難找到配對的請求匹配,並且等待時間將盡可能低。而且,使用這種技術可以輕鬆實現高級匹配規則。