2010-07-25 53 views
2

我一直在挖掘,看看以前是否有類似的東西,但是沒有看到鏡像條件。爲了讓問題更容易理解,我將在填補棒球隊名單的情況下應用它。給定的名冊結構組織如下:C,1B,2B,3B,SS,2B/SS(或者),1B/3B,OF,OF,OF,UT(可以是任何位置)解決條件填充益智的置換/算法

每個玩家至少有一個非替補位置(允許多個位置的位置),他們符合資格並且在許多情況下不止一個(即可以玩1B和OF等的玩家等)。 )。假設你是一個團隊的經理,這個團隊已經有一些球員,並且你想看看你是否在任何一個位置上有特定球員的空間,或者你是否可以移動一個或多個球員來打開一個位置他有資格。

我最初的嘗試是使用條件排列並在列表中收集每個球員所有可能的唯一「陣容」,在移動到下一個球員之前更新空位。這也是必須的(因爲玩家移動的順序會影響下一位玩家的位置),因此列表中的列表被重新排序,然後再次循環。我仍然認爲這是要走的路,但有一些陷入困境的陷阱。

開始,你認爲是給出循環中的數據是:位置 1.列出可播放器(一個被檢查,如果他能適合)目前在名冊上和 2.列出玩家的玩家正在評估(我目前正在存儲一個列表清單,並使用列表索引作爲播放器的唯一標識符) 3.當前名單打開的職位列表爲

這是證明比我最初預期的更令人頭痛。有一位同事甚至向我建議,我擁有的情況(涉及到更大規模的每個對象的有條件分配)是NP完全的。我確信這不是,因爲一旦一名球員被重新定位在一個被測試的特定陣容中,一旦另一名球員移動了,整個名單就不需要再被迭代。這是多空的,我終於決定打開它的論壇。

感謝任何人都可以提供的幫助。由於限制,我不能發佈部分代碼(其中一些是遺留的)。但是,它正在.NET中進行翻譯(目前是C#)。如果還有其他必要的信息,我會嘗試重寫一些用於發佈的功能的短片。

約瑟夫G.

EDITED 2010年7月24日 非常感謝您的答覆。實際上,我確實使用遺傳算法進行了研究,但最終放棄了這個算法,因爲大量的工作將會導致序數結果的確定變得多餘。測試的最終目的是確定事實上是否存在返回肯定的情景。沒有必要確定每個工作解決方案的相對優勢。

我很欣賞關於可能不熟悉我提出問題的背景的反饋。實際的模型是在多個特定於平臺的構建服務器中分發構建命令。它是可訪問的,但我不想深入瞭解爲什麼某些構建任務只能在某些系統上執行,並且爲什麼某些系統只能執行某些類型的構建命令。

看來你已經得到了我所呈現的內容的要點,但是這裏有一個不太具體的模型。在列表的有序陣列中存在一組離散位置(我將這些稱爲「位置」):

((2),(2),(3),(4),( (5),(6),(4,6),(3,5),(7),(7),(7),(7),(7),(2,3,4,5,6, 7))

此外,還有一個無序的列表數組(我稱之爲「員工」),如果其數組有一個與有序列表相同的成員,則它只能佔用其中一個插槽它將被分配。在初始分配完成後,如果有其他員工出現,我需要確定他是否可以填補其中一個未決職位,如果不是,可以重新安排當前員工以允許其中一個職位可以填補被提供。

蠻力是我想要避免的,因爲在40-50個物體的數量級上(很快會增加),單個測量在運行時計算將會非常昂貴。

+2

您可能要考慮使用棒球之外的另一個示例。大多數不是在美國出生的人可能不熟悉這項運動。 – Mathias 2010-07-25 00:17:42

+0

那麼你的作業是一對一還是不?你能舉一個更具體的例子嗎? – user382751 2010-07-25 02:54:48

+0

作業是一對一的。分配的對象和分配是離散的,只應用一次。 – 2010-07-25 03:33:52

回答

1

我根本不理解棒球,所以很抱歉,如果我走錯了路。儘管我的確喜歡比賽,但只有2個位置可以在全明星,連擊員或其他人中進行比賽。

您是否考慮過使用Genetic Algorithms來解決此問題?他們非常善於解決NP困難問題,並且在旋轉和時間表類型問題方面出色地工作。

你有一個解決方案模型,可以很容易地得分和容易操作,這是一個遺傳算法的好開始。

對於更復雜的問題,其中總置換太大而無法計算遺傳算法,應該在相當短的時間內找到接近最優或極好的解決方案(以及許多其他有效的解決方案)。雖然如果你希望每次都找到最佳的解決方案,你將不得不蠻橫地強制它(我只是剔除了這個問題,所以這可能不是這種情況,但聽起來可能是這樣)。

在你的例子中,你將有一個解決方案類,這代表了一個解決方案,IE是棒球隊的陣容。你隨機生成20種解決方案,不管它們是否有效,那麼你都有一個評估算法來評估解決方案。在你的情況下,陣容中更好的球員得分會比更差的球員得分更高,而任何無效的陣容(無論出於何種原因)都會迫使得分爲0.

任何0分的解決方案都會被殺掉,並用新的隨機取代,其餘解決方案一起培育形成新的解決方案。理論上和經過足夠的時間後,解決方案庫應該得到改善。

這不僅可以找到大量有效的唯一陣容,還可以對它們進行評分。你沒有在你的問題中指出需要對解決方案進行評分,但它提供了很多好處(例如,如果一名球員受傷,他可以暫時被評爲-10或其他)。所有其他玩家根據其可量化的統計數據進行評分。

它具有可擴展性並且性能良好。

1

這聽起來好像你有一個雙方的匹配問題。一個分區對於名單上的每個球員都有一個頂點。另一個每個名單都有一個頂點。當且僅當玩家可以玩該位置時,玩家頂點和位置頂點之間存在邊緣。你有興趣在匹配:邊緣的集合,使得沒有終點重複。

鑑於玩家對位置(匹配)和新玩家的分配,有一個簡單的算法來確定是否可以完成。將當前匹配中的每條邊從玩家位置指向玩家;將其他玩家引導至該位置。現在,使用廣度優先搜索,尋找從新玩家到未分配位置的路徑。如果你找到一個,它會告訴你一系列可能的重新分配。如果你不這樣做,那麼和所有的球員都沒有匹配。

例如,假設玩家A可以打第1位或2

A--1 
\ 
    \ 
    2 

我們臨時分配一個給2。現在B顯示了起來,只能起到2.直接的圖形:

A->1 
< 
    \ 
B->2 

我們找到一條路徑B->2->A->1,這意味着「將B分配給2,將A置換爲1」。

處理假設匹配有很多漂亮的理論。遺傳算法不需要應用。


編輯:我應該補充一點,因爲使用BFS,它會計算重新分配的破壞性最小的序列。

+0

準確地說 - 這是問題的根源。起初,這似乎比現在簡單得多。 – 2010-07-25 02:51:03

+0

中斷次數是最小化做出決定所需的工作量。但是,由於最小破壞性似乎在邏輯上意味着需要最少的調整次數,所以這對我來說似乎是最有效的方法。 – 2010-07-25 03:40:34

+0

我正在考慮試圖在C#中實現Hopcroft-Karp。我對它很不熟悉,所以在我開始弄髒自己的手之前,你覺得這將是一個適合解決這個問題的二分匹配算法的解決方案嗎? – 2010-07-25 20:28:47