2012-09-17 105 views
0

我有一個對象Tournament有匹配的列表,每個人都有的概率存儲在Map<Player, Float>該PLAYER1或player2勝。
我重複獲取元件ii + 1創建使用他們的獲獎者一個新的比賽的比賽名單上。優勝者是這樣選擇的:如果p1(或p2)以高於某個閾值的概率獲勝,我選擇它,否則我必須分支並評估兩個案例(案例1:p1勝 - 案例2:p2勝)。
我的目標是創建所有可能的場景並評估所有可能的錦標賽獲勝者。
我能做到這一點沒有分支(只是遞歸評估所有比賽的贏家,直到只有最後一場比賽),但是如果我想所有的情況我真的不知道該怎麼做。
任何想法?我應該使用哪種數據結構?是否有可能做類似C fork的事情並使用它?評估所有比賽場景

回答

0

最後我解決了使用蒙特卡洛方法。我多次運行錦標賽(10k),並且每次模擬都根據他的概率選擇每場比賽的勝者。由於我運行了很多次,我相信我會遇到所有可能的情況(並且我會一步一步保存它們,以及預測的錦標賽冠軍)。 它被證明是快速和有效的,不需要額外的數據結構(只需保存所有場景和地圖以保存錦標賽獲勝者的概率)。

1

是否有可能做一些像C叉子和使用它?

您可以使用ExecutorService來提交任意數量的任務。假設它們是CPU綁定的,你可能需要使用一個固定的線程池,其大小爲Runtime.getRuntime.availableProcessors()

0

你可能正在尋找某種樹型瀏覽算法。您可以使用breadth-first-searchdepth-first-search。使用遞歸基本上使用後者,但要小心,Java堆空間不夠用,而且最終必須由您自己實現。

BFS和DFS都非常相似,當涉及到使用的數據結構它們的區別。 BFS使用隊列,由JSE的LinkedList實現,而DFS使用堆棧,由Stack類實現。