排列中的优先约束

时间:2016-05-13 19:57:45

标签: matlab

我在考古学领域开展工作,我试图用一些优先约束生成给定变量的所有序列。例如,如果我们有五个对象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,perms和matrix fuction,但我无法强加优先约束。而且我第一次使用MATLAB但我搜索了所有的问题和答案,但没有找到我正在寻找的那个。

我找到了一些没有OR约束的答案,但在我的问题中我必须使用OR。

1 个答案:

答案 0 :(得分: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在n之后的行:

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