|
|
Re: generation of random multiset permutation with restrictions
Posted:
Jan 30, 2013 3:34 AM
|
|
Dynamic programming:
function p= allpc(a, s)
s = cellfun(@sort, s, 'unif', 0); [u, ~, J] = unique(a); n = accumarray(J(:), 1); p = fliplr(allpc_engine(s, u, n));
end % allpc
%% function p = allpc_engine(s, u, n)
s1 = s{1}; [b, loc] = ismember(s1, u); s1 = s1(b); s = s(2:end); if isempty(s) p = s1; return end loc = loc(b); p = []; for i = 1:length(s1) j = loc(i); n(j) = n(j)-1; old = u(j); if n(j) <= 0 u(j) = Inf; end q = allpc_engine(s, u, n); if ~isempty(q) q(:,end+1) = s1(i); p = [p; q]; end u(j) = old; n(j) = n(j)+1; end
end % allpc_engine
%% Test >> a = [1,1,1,2,2,3,3,3]
a =
1 1 1 2 2 3 3 3
>> s = {[3],[1,2],[1,2,3],[1,2,3],[1,2,3],[1,2,3],[2,3],[2,3]};
>> p = allpc(a,s)
p =
3 1 1 1 2 2 3 3 3 1 1 1 2 3 2 3 3 1 1 1 2 3 3 2 3 1 1 1 3 2 2 3 3 1 1 1 3 2 3 2 3 1 1 1 3 3 2 2 3 1 1 2 1 2 3 3 3 1 1 2 1 3 2 3 3 1 1 2 1 3 3 2 3 1 1 2 2 1 3 3 3 1 1 2 3 1 2 3 3 1 1 2 3 1 3 2 3 1 1 3 1 2 2 3 3 1 1 3 1 2 3 2 3 1 1 3 1 3 2 2 3 1 1 3 2 1 2 3 3 1 1 3 2 1 3 2 3 1 1 3 3 1 2 2 3 1 2 1 1 2 3 3 3 1 2 1 1 3 2 3 3 1 2 1 1 3 3 2 3 1 2 1 2 1 3 3 3 1 2 1 3 1 2 3 3 1 2 1 3 1 3 2 3 1 2 2 1 1 3 3 3 1 2 3 1 1 2 3 3 1 2 3 1 1 3 2 3 1 3 1 1 2 2 3 3 1 3 1 1 2 3 2 3 1 3 1 1 3 2 2 3 1 3 1 2 1 2 3 3 1 3 1 2 1 3 2 3 1 3 1 3 1 2 2 3 1 3 2 1 1 2 3 3 1 3 2 1 1 3 2 3 1 3 3 1 1 2 2 3 2 1 1 1 2 3 3 3 2 1 1 1 3 2 3 3 2 1 1 1 3 3 2 3 2 1 1 2 1 3 3 3 2 1 1 3 1 2 3 3 2 1 1 3 1 3 2 3 2 1 2 1 1 3 3 3 2 1 3 1 1 2 3 3 2 1 3 1 1 3 2 3 2 2 1 1 1 3 3 3 2 3 1 1 1 2 3 3 2 3 1 1 1 3 2
% Bruno
|
|