我在考古学领域开展工作,我试图用一些优先约束生成给定变量的所有序列。例如,如果我们有五个对象1 2 3 4 5
,那么有5!
种方法,但如果我们强加一些优先约束,例如:
最后我应该得到如下所示的答案
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。
答案 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