2016-05-13 114 views
0

我正在做我在考古學領域的工作,我試圖用一些優先約束來生成給定變量的所有序列。例如,如果我們有五個對象1 2 3 4 5,然後有5!方法,但如果我們施加像一些優先約束:排列中的優先約束條件

  • 序列應當總是開始從1
  • 後1只有2或3個可附着。
  • 4可以來後5或3
  • 5可以來後4或2

最後我應該可以回答諸如以下

1 2 3 5 4; 1 2 3 4 5; 1 2 5 4 3; 1 2 5 3 4; 
1 3 4 5 2; 1 3 4 2 5; 1 3 2 5 4; 1 3 2 4 5; 

給我試過像allcomb,ndgrid不同的功能,treenode,燙髮和矩陣功能,但我不能強加優先約束。而且我第一次使用MATLAB,但是我搜索了所有的問題和答案,但還沒有找到我正在尋找的那個。

我發現了一些沒有OR約束的答案,但在我的問題中我必須使用OR。

+1

1 2 3 5 4是無效的,因爲5不能3後來,相同的1 3 2 4 5 4因爲能來AF ter 5或3,而不是2 ... –

+0

@ aka.nice感謝您的編輯:)但我需要這兩個序列,雖然5不能在3之後但在那個序列2已經在那裏,所以我們可以添加5。我認爲排列不會讓我們這樣做。 –

回答

0

我建議生成1到5的所有可能的組合,並刪除無效的組合。

代碼例如:

%generates all possible combinations from 1 to 5, where 1 is the first 
%number 
allCombs = perms(2:5); 
allCombs = [ones(size(allCombs,1),1),allCombs]; 

%calclates rows in which the constraints for 1,4,5 holds 
constraintsFor1 = union(findKAfterNRows(allCombs,2,1),findKAfterNRows(allCombs,3,1)); 
constraintsFor4 = union(findKAfterNRows(allCombs, 4,5),findKAfterNRows( allCombs, 4,3)); 
constraintsFor5 = union(findKAfterNRows(allCombs, 5,2),findKAfterNRows(allCombs, 5,4)); 

%calculates the valid rows 
resultRows = intersect(constraintsFor1,constraintsFor4); 
resultRows = intersect(resultRows,constraintsFor5); 

%generates final output 
outputMask = allCombs(resultRows,:); 

凡findKAfterNRows是接收組合的矩陣的函數,並且兩個數 - k和n,並返回其中,k來Ñ後的行:

function [ validRows ] = findKAfterNRows(mat, k,n) 
kMask = single(mat==k); 
nMask = single(mat==n); 
n = size(mat,2); 
kernel = zeros(1,n); 
kernel(1:floor(n/2)) = 1; 
kMaskShiftLeft = conv2(kMask,kernel,'same'); 
validRows = find(sum(nMask==1 & kMaskShiftLeft==1,2)==1); 
end 

結果:

outputMask = 

1  3  4  2  5 
1  3  4  5  2 
1  3  2  4  5 
1  3  2  5  4 
1  2  3  4  5 
1  2  3  5  4 
1  2  5  4  3 
1  2  5  3  4 
+0

首先非常感謝你的回答。但是我的答案還需要另外兩個序列,因爲雖然4可以在5或3之後出現,但代碼應該檢查特定序列的所有數量。例如: - 我想要1 2 3 5 4,因爲5可以在2或4之後出現,但在給定情況下2已經在序列中,所以在這種情況下可以在3之後加5。對不起我的英文,我把我的問題寫錯了。我希望你明白。 –

+0

我現在明白了。我相應地更新了我的答案,現在它按照你所描述的方式工作。讓我知道你是否有任何問題或意見。 – drorco

+0

哎呀我解決了這個問題,但我發現它是不可能獲得更多的10個組件,我的電腦越來越掛,並通過互聯網搜索後,我發現它不可能有超過11個組件的排列:(有沒有其他方式做相同????? –