2012-06-26 162 views
0

摘要:
您選擇您註冊的模塊。
每個模塊都有多個組。
每個組代表給定模塊的講座。
每個組合應該只包含來自每個模塊的一個組。複雜排列/組合

實施例:
COS 121個-3組
COS 132個-2組

這會給你6個選項:[1,1],[1,2],[2,1],[我需要使用每個組合來生成時​​間表,因此我使用一個數組來存儲正在使用的當前組和總數組數:arrSubjects[subject,currentGroup,maxGroups]

從邏輯上說,你應該能夠遍歷這個陣列Ÿ利用每個組的組合。

我只是無法掌握這個解決方案,也許是因爲我使用了錯誤的角度。任何幫助/建議真的很感激。

我目前的實施: 我對此很尷尬,因爲它需要很多時間,但它的工作原理。 下面是僞代碼的基礎:

for (all the groups multiplied with eachother) do { 
    for (all the modules selected) do { 
    Select a random group between 1 and the nmr of groups 
    } 
} 

後,我必須擺脫所有重複的。

在此先感謝

的代碼我目前工作:

arrPermutations[0,0]:=1;//Current group for 1st module 
arrPermutations[0,1]:=3;//Max groups for 1st module 
arrPermutations[1,0]:=1; 
arrPermutations[1,1]:=3; 
arrPermutations[2,0]:=1;//Current group for 3rd module 
arrPermutations[2,1]:=3;//Max groups for 3rd module 
iCurrent:=iMax; //2 
while (arrPermutations[0,0]<=arrPermutations[0,1]) do 
begin 
//Display arrPermutations 
if arrPermutations[iCurrent,0]=arrPermutations[iCurrent,1] then 
begin 
    Inc(arrPermutations[iCurrent-1,0]); 
    for i := iCurrent to iMax do 
    arrPermutations[i,0]:=1; 
    iCurrent:=iMax; 
end else 
begin 
    Inc(arrPermutations[iCurrent,0]); 
end; 
end; 

目前,我只有通過最後兩組穿越。 以下是我在檢查時得到的輸出:
============運行1 ==============
模塊,當前組,最大組
1,1,3
2,1,3
3,1,3
============運行2 ==============
模塊,當前組,最大團
1,1,3-
2,1,3
3,2,3
============運行3 ===== =========
模塊,當前組,最大組
1,1,3
2,1,3
3,3,3
============運行4 ============= =
模塊,當前組,最大團
1,1,3-
2,2,3-
3,1,3
============運行5 === ===========
模塊,當前組,最大團
1,1,3-
2,2,3-
3,2,3
======= =====運行6 ==============
模塊,當前組,最大團
1,1,3-
2,2,3-
3,3,3-
============運行7 ===== =========
模塊,當前組,最大團
1,1,3-
2,3,3
3,1,3
========= ===運行8 ==============
模塊,當前組,最大團
1,1,3-
2,3,3
3,2,3
============ Run 9 ==============
模塊,當前組,最大組
1,1,3
2,3 ,3
3,3,3
============運行10 ============== //////問題出在這裏
模塊,當前組,最大團
1,1,3-
2,4,3
3,1,3

回答

1

新的答案:

首先,可能COM的數目binations是每個模塊中組的數量的乘積。例如,如果有三個模塊,分別包含5,2和7組,則有5 * 2 * 7 = 70個可能的組合。調用這個TOTALCOMBOS。

所以,如果你想遍歷所有可能的組合,你可以從0循環到TOTALCOMBOS-1。

for I in 0..TOTALCOMBOS-1 do 
    COMBO = (convert I to a combination) 
    (do something with COMBO) 

現在,要將索引轉換爲組合,有必要將整數索引看作從右到左的「數字」列表。這很容易看出每個模塊是否有10個組,並且組號從0開始而不是1。然後一個整數468可以被讀爲列表(8,6,4),這意味着組8來自模塊1,組6來自模塊2,組4來自模塊3.在僞代碼中,將索引轉換爲組合將是像

DIGITS = I 
for M in 1..(number of modules) do 
    D = DIGITS mod (number of groups in module M) 
    DIGITS = DIGITS/(number of groups in module M) 
    (add group D from module M to the current combination) 

如果你想組號碼從1開始,而不是0,那麼就使用組d + 1中的最後一行,而不是d組

OLD答:

使用遞歸。遞歸函數可以獲取模塊列表,並返回組合列表。每個組合將包含輸入列表中每個模塊的一個組。

作爲基本情況,如果模塊列表爲空,則返回一個空組合列表。

否則,讓M爲第一個模塊,並讓REST成爲模塊的其餘部分。在REST上調用遞歸函數以獲得其餘模塊的所有組合(稱爲COMBOS組合列表)。請注意,在COMBOS這些組合做包含來自M.

組現在,我們要讓所有組合的列表,這次包括從M.組初始化列表答案空。使用兩個嵌套循環。對於M中的每個組G以及COMBOS中的每個組合C,將G添加到C,並將此擴展組合添加到ANSWERS。

Return ANSWERS。 (假設:沒有一個組出現在多個模塊中,或者在同一個模塊中出現兩次,模塊列表中不會出現多次模塊,如果需要,可以放鬆這些假設,但是您需要定義你想要的行爲是在這些情況下)

(註釋1:我說的「清單」之上,但所有這些列表可以很容易地是數組或一些其他類型的容器)

(。評論2:在我說的「將G添加到C」中,重要的是C本身不會被改變,因爲它將被重複使用多次,每個組在M中都會重複使用一次。)

+0

Hi C一應俱全。感謝您的快速和徹底的答覆。雖然我特意尋找順序通過排列的方式,但我希望利用每個排列而不必存儲排列。請看看我更新的帖子,以獲得更好的理解。 – Hendrik

+0

好吧,它聽起來像你想要某種陣列。我修改了答案,如果您只是想遍歷組合而不將它們全部存儲起來。 –

+0

嗨克里斯。該算法完美運行!我非常感謝你的幫助。你給我信心更頻繁地使用計算器! – Hendrik