[R] Permutations (summary)
Jordi Altirriba Gutiérrez
altirriba at hotmail.com
Fri Jul 16 16:08:16 CEST 2004
Dear R users,
This is a second summary of the permutation problem I previously posted.
This summary restates the problem as well as the solution.
First of all thanks to everyone including Erich, Robin, Gabor, Christian,
Ingmar and others for your suggestions.
With the help of an off-list discussion with Gabor I’m going to summarize.
THE PROBLEM
We have 12 elements in blocks of 3 :
1 2 3 | 4 5 6 | 7 8 9 | 10 11 12
and we want to generate random permutations of these 12 elements such that
no permutation so generated can be obtained solely through intra-block
permutations of some previously generated permutation.
In the last sentence intra-block permutations are those permutations which
shuffle the first three numbers among themselves, the second three numbers
among themselves, the third three numbers among themselves and the fourth
three numbers among themselves. Numbers in one block cannot be permuted
into another block through an intra-block permutation. (That would be an
inter-block permutation.)
For example, if we consider the following potential candidates as successive
permutations the first is ok, the second is not since its an intra-block
permutation of the first (thus the 2nd would be rejected) and the third is
ok since it is not an intra-block permutation of the first.
1 2 3 | 4 5 6 | 7 8 9 | 10 11 12 ---> perm 1
1 3 2 | 4 5 6 | 7 8 9 | 10 11 12 ---> perm 2. NO, swapping 2 & 3 is
intra-block
1 2 4 | 3 5 6 | 7 8 9 | 10 11 12 ---> perm 3. YES, swapping 3 & 4 is
inter-block
Here is another example where perm 2 is ok but perm 3 would be rejected as
perm 3 is an intra-block permutation of perm 2.
1 2 3 | 4 5 6 | 7 8 9 | 10 11 12 ---> perm 1
5 8 10 | 7 9 4 | 12 1 3 | 11 6 2 ---> perm 2. YES. not an intra-block perm
of 1
5 10 8 | 7 9 4 | 12 1 3 | 11 6 2 ---> perm 3. NO. is intra-block perm of
perm 2
SOLUTION
Erich Neuwirth defined ordered permutations to be permutations that are
increasing within each block. The ordered permutation corresponding to an
arbitrary permutation of 12 elements is formed by sorting all elements
within each of the 4 blocks to make them increasing.
With this in mind we can redefine the problem as requiring the generation of
random permutations such no two permutations on our list can correspond to
the same ordered permutation.
Gabor Grothendieck provided the following code which uses this idea. samp()
generates a permutation of 12 that is stored in z[i,] and returns the
ordered permutation that corresponds to it. Each iteration of the for loop
generates one random permutation using rejection. That is, each such
iteration uses a while loop to repeatedly call samp converting the resulting
ordered permutation to a string and looking it up in z, the vector of all
previously accepted ordered
permutations. If its found then the while loop tries again and if it is NOT
found then the permutation that samp just stored in z[i,] is accepted.
The code is followed by a test generating 10,000 random permutations.
ordered.perm2 <- function(N) {
samp <- function() c(apply(matrix(z[i,] <<- sample(12,12),3),2,sort))
s <- vector(length = N, mode = "character")
z <- matrix(nr = N, nc = 12)
for(i in 1:N)
while( (s[i]<-paste(samp(),collapse=" ")) %in% s[seq(len=i-1)] ) {}
z
}
set.seed(1)
ordered.perm2(10000)
KIRKMAN SCHOOL GIRL PROBLEM
Christian pointed out the Kirkman School Girl Problem.
It is intrigingly similar to the current problem. At the same time it is
not exactly the same because the present problem can permute only one
element and Kirkman's School Girl Problem can not.
For example, the following is an acceptable permutation in our problem but
not for the Kirkman problem:
1 2 3 | 4 5 6 | 7 8 9 | 10 11 12
1 2 4 | 3 5 6 | 7 8 9 | 10 11 12
For Kirkman’s problem, the four blocks should be different in the two
permutations.
Thanks to all, and sorry for the initial confusion with intra-block
permutations,
Jordi Altirriba
PhD student
Hospital Clinic - Barcelona - Spain
More information about the R-help
mailing list