2012-01-15 78 views
0

的問題是:回溯Python或C++

輸出做好一切準備,以在每週5天考慮混合3班數學,3類PC編程的,2班物理學在一天本週一學生有這些分類中的至少一個,最大的3,不管他們是如何混」

L:[數學,數學,數學]
T:[PC程序控制,電腦程序控制]
w^:[pc程序]
T:[物理]
F:[phys ICS]

我有在Python一個想法,以創建15個元素的列表將包含所有類從一週15/5 = 3(最大類學生可以有),所以對於上述的例子該列表看起來像[m,m,m,cs,cs,0,cs,0,0,p,0,0,p,0,0],但我真的不知道如何使用回溯生成所有列表。你能給我任何想法嗎?

+1

這看起來像家庭作業,所以我添加了標籤。如果我錯了,請隨時將其刪除。 – jcollado 2012-01-15 12:18:08

+0

不,我真的想學習回溯的概念,我解決了一些問題,但他們只涉及簡單的排列/排列,我想嘗試更難的,但需要這個想法。 – 2012-01-15 12:36:39

回答

1

首先嚐試解決一個更簡單的問題。嘗試輸出所有possibilites混合有兩個約束類:

  1. 無級可以在一天

  2. 類的在一天的順序並不重要

  3. 那麼一旦出現更

與往常一樣,回溯問題最容易用遞歸方法解決。執行以下操作:以任意順序cs,cs,cs,m,m,m,p,p獲取類的順序,並在遞歸的每個步驟上將下一個類分配給「可能」日。如果目前分配的課程少於3個,並且還沒有相同類型的課程,則可能有一天。

爲了避免可能性的重複,再增加一個要求 - 如果在遞歸的當前步驟中,我們需要將A分配給某一天,並且類A已經添加到某些日子中,那麼只嘗試賦值A到幾周後的日子,然後是最後一次分配的日期。由於這可能聽起來有點混亂,讓我舉一個例子:

說我們有當前狀態:

M: m, cs 
T: 0 
W: cs 
T: p 
F: p 

以及在我們必須增加一個CS類的下一個步驟。如上所述,我們只會在幾天之後嘗試W即週四和週五。它需要一些考慮,但你應該能夠弄清楚,如果我們不添加這個限制,一些可能性會多於一次。

遞歸的結束在兩種情況下滿足:

  • 如果所有的類都被分配到某一天,我們如果在發現了一個可能assignement,我們將它輸出

  • 下一步,我們需要將A分配給某一天,但A已經分配到了一週中的某一天,比如說X以及X已經分配了3個類的所有天后,那麼我們就無法找到A和A的可能日期了。因此在這個分支中找不到可能的解決方案。

現在已經解決了這個更容易的問題,請嘗試刪除我逐個添加的兩個附加約束。首先修改解決方案,讓班級每天可能出現一次以上(儘管在這種情況下,問題似乎更簡單一些,需要額外的工作以避免再次計算一些可能性)。在此之後,刪除最後一個約束 - 在一天中制定班級的順序。有一個簡單的方法來解決這個問題,但我不確定是否允許您在解決問題的過程中找到解決方案 - 在找到解決方案之後,在其所有日子中進行所有排列以產生所有可能的安排。

我真的希望這個答案有幫助。我可以寫下上述所有問題的解決方案,但我更願意嘗試向您提供如何獨立處理這些問題的提示,以便您可以自己實現。