, . , :)
%
NUM_ITER = 100000; %
DRAW_SZ = 12; %
SET_SZ = 3; %
FEAT_NUM = 4; %
FEAT_SZ = 3; %
%
features = {
'oval' 'squiggle' 'diamond' ; %
'red' 'purple' 'green' ; %
'one' 'two' 'three' ; %
'solid' 'striped' 'open' %
};
fIdx = arrayfun(@(k) grp2idx(features(k,:)), 1:FEAT_NUM, 'UniformOutput',0);
%
[W X Y Z] = ndgrid(fIdx{:});
cards = [W(:) X(:) Y(:) Z(:)];
%
setsInd = nchoosek(1:DRAW_SZ,SET_SZ);
%
counterValidSet = 0;
for i=1:NUM_ITER
%
ord = randperm( size(cards,1) );
cardsDrawn = cards(ord(1:DRAW_SZ),:);
%
for s=1:size(setsInd,1)
%
set = cardsDrawn(setsInd(s,:),:);
%
count = arrayfun(@(k) numel(unique(set(:,k))), 1:FEAT_NUM);
isValid = (count==1|count==3);
%# increment counter
if isValid
counterValidSet = counterValidSet + 1;
break %# break early if found valid set among candidates
end
end
end
%# ratio of found-to-notfound
fprintf('Size=%d, Set=%d, NoSet=%d, Set:NoSet=%g\n', ...
DRAW_SZ, counterValidSet, (NUM_ITER-counterValidSet), ...
counterValidSet/(NUM_ITER-counterValidSet))
Profiler , . UNIQUE. , , :
%
isValid = true;
for k=1:FEAT_NUM
count = numel(unique(set(:,k)));
if count~=1 && count~=3
isValid = false;
break %
end
end
, . , , 3- 12 . , , , UNIQUE/NUMEL ( , ).
, ( , ). , , . :
%
NUM_ITER = 100000; %
DRAW_SZ = 12; %
SET_SZ = 3; %
FEAT_NUM = 4; %
FEAT_SZ = 3; %
%
features = {
'oval' 'squiggle' 'diamond' ; %
'red' 'purple' 'green' ; %
'one' 'two' 'three' ; %
'solid' 'striped' 'open' %
};
fIdx = arrayfun(@(k) grp2idx(features(k,:)), 1:FEAT_NUM, 'UniformOutput',0);
%
[W X Y Z] = ndgrid(fIdx{:});
cards = [W(:) X(:) Y(:) Z(:)];
%
setsInd = nchoosek(1:DRAW_SZ,SET_SZ);
%
ss = setsInd(:);
set_sz2 = numel(ss)*FEAT_NUM/SET_SZ;
col = repmat(1:set_sz2,SET_SZ,1);
col = FEAT_SZ.*(col(:)-1);
M = false(FEAT_SZ,set_sz2);
%
%
%
counterValidSet = 0;
for i=1:NUM_ITER
%
%
%
ord = randperm( size(cards,1) );
cardsDrawn = cards(ord(1:DRAW_SZ),:);
%
set = reshape(cardsDrawn(ss,:)',[],SET_SZ)';
set = set(:);
%
M(:) = false; %
M(set+col) = true;
isValid = all(reshape(sum(M)~=2,FEAT_NUM,[]));
%
if any(isValid)
counterValidSet = counterValidSet + 1;
end
end
%
fprintf('Size=%d, Set=%d, NoSet=%d, Set:NoSet=%g\n', ...
DRAW_SZ, counterValidSet, (NUM_ITER-counterValidSet), ...
counterValidSet/(NUM_ITER-counterValidSet))
%
%
Parallel Processing Toolbox, FOR- PARFOR ( M : M(:) = false; M = false(FEAT_SZ,set_sz2);)
50000 (PARFOR 2 ):
» tic, SET_game2, toc
Size=12, Set=48376, NoSet=1624, Set:NoSet=29.7882
Elapsed time is 5.653933 seconds.
» tic, SET_game2, toc
Size=15, Set=49981, NoSet=19, Set:NoSet=2630.58
Elapsed time is 9.414917 seconds.
(PARFOR 12, no-PARFOR 15):
» tic, SET_game2, toc
Size=12, Set=967516, NoSet=32484, Set:NoSet=29.7844
Elapsed time is 110.719903 seconds.
» tic, SET_game2, toc
Size=15, Set=999630, NoSet=370, Set:NoSet=2701.7
Elapsed time is 372.110412 seconds.
, Peter Norvig.