let's start by defining x and y matching the properties of the points in the picture
<<*>>=
x<-c(1,2,4,5,9,3,7,6); y<-c(10,8,5,3,2,9,4,7)
plot(x,y,pch=letters[1:8])


@
along each dimension we have to compare the coordinates of the points:
<<*>>=
outer(x,x,"<")

@
we get a logical matrix:
output-start
Wed Jun  2 10:36:52 2004
     [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]  [,8]
[1,] FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
[2,] FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
[3,] FALSE FALSE FALSE  TRUE  TRUE FALSE  TRUE  TRUE
[4,] FALSE FALSE FALSE FALSE  TRUE FALSE  TRUE  TRUE
[5,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[6,] FALSE FALSE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE
[7,] FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE
[8,] FALSE FALSE FALSE FALSE  TRUE FALSE  TRUE FALSE
output-end

results of dimension x and of dimension y have to be aggregated by "&"
<<*>>=
outer(x,x,"<")&outer(y,y,"<")

@
and we get:
output-start
Wed Jun  2 10:44:56 2004
     [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]  [,8]
[1,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[2,] FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
[3,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE
[4,] FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE
[5,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[6,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[7,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[8,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
output-end

TRUE in position (i,j) indicates that x- and y-coordinates of point i are smaller
than those of point j. The sum of row i shows the number of
points that dominate point i. The sum of col j shows the number of points
that are dominated by point j.


@
so we can compute the the number of dominated points by applying function sum on the cols:
<<*>>=
apply(outer(x,x,"<")&outer(y,y,"<"),2,sum)


@
at last some polishing
<<*>>=
result<-apply(outer(x,x,"<")&outer(y,y,"<"),2,sum)+1
names(result)<-letters[1:8]
result

@
output-start
Wed Jun  2 10:59:03 2004
a b c d e f g h
1 1 1 1 1 2 2 3
output-end

in the case of more than 2 dimensions you have to add further outer-operations

Peter Wolf




Waichler, Scott R wrote:

I would like to make a ranking operation more efficient if possible.
The goal is to rank a set of points representing objective function values such that points which are "dominated" by no others have rank 1, those which are dominated by one other point have rank 2, etc. In the example with two dimensions below, objective
functions 1 and 2 are to be minimized. Points a-e are non-dominated,
rank 1 points. Point f is rank 2 because point b is superior, and point g is rank 2 because point d is superior. Point h is rank 3 because points c and d are both superior.


| a | f
| b
| h (figure requires monospaced, plain-text
display)
Obj 1 | c | g | d | e
|____________________


             Obj 2


I need to compute the ranks of the rows of a matrix, where each row
represents a point in objective space and the columns
contain the objective function values to be minimized. Rank is defined as the number of points with objective function values less than or equal to the current point (including the current point). I've written the following function with two loops:


PARETO.RANK <- function(obj.array) {
obj.array <- unique(obj.array)
ind.row <- 1:nrow(obj.array)
ind.col <- 1:ncol(obj.array)


   rank.vec <- rep(NA, length(ind.row)) # initialize

# Loop thru rows (points in objective function space)
for(i in ind.row) { set <- ind.row
for (j in ind.col) { # Loop thru objective functions
set <- set[ obj.array[set,j] <= obj.array[i,j] ]
}
rank.vec[i] <- length(set)
}
return(rank.vec)
} # end PARETO.RANK3()


Can anyone think of a way to do this more efficiently, for example by
vectorizing further?


Thanks,
Scott Waichler
[EMAIL PROTECTED]

______________________________________________
[EMAIL PROTECTED] mailing list
https://www.stat.math.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html



______________________________________________ [EMAIL PROTECTED] mailing list https://www.stat.math.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html

Reply via email to