celestialgod

multiple objective pareto front

Nov 6th, 2016
235
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
R 3.08 KB | None | 0 0
  1. # multiple objective pareto front
  2. MPF <- function(P){
  3.   i = 1; n = dim(P)[1]; N = dim(P)[2]
  4.   if(length(rownames(P))==0) rownames(P) = 1:dim(P)[1]
  5.   P = as.matrix(na.omit(unique(P)))
  6.   P = P[eval(parse(text = paste0("order(", paste0("P[,", 1:ncol(P), "]", collapse=","), ",decreasing=T)"))),]
  7.   while(n > i){
  8.     x = matrix(NA, nrow=n, ncol=N); y = logical(n); m = rownames(P)
  9.     for(j in 1:N){x[,j] = P[i,j] > P[,j]} # do not delete itself
  10.     for(s in 1:n) y[s] = all(x[s,])
  11.     P[y,] <- NA; P = na.omit(P); na = na.action(P); r = rownames(P)
  12.     # cat(dim(P)[1], i,"\n");
  13.     if(m[i] %in% r) {
  14.       i = match(m[i], r)+1
  15.     } else {
  16.       if(dim(P)[1] == n)
  17.         i = n
  18.       else {
  19.         i = match(m[min((c(1:n)[-na])[i < c(1:n)[-na]], na.rm=T)], r)
  20.       }
  21.     }
  22.     n = dim(P)[1]
  23.   }
  24.   return(as.integer(rownames(as.matrix(P))))
  25. }
  26.  
  27. MPF2 <- function(P){
  28.   order_i <- 1:nrow(P)
  29.   order_rows <- eval(parse(text = paste0("order(", paste0("P[,", 1:ncol(P), "]", collapse=","), ",decreasing=T)")))
  30.   P <- P[order_rows, ]
  31.   order_i <- order_i[order_rows]
  32.   idx <- !duplicated(P)
  33.   P <- P[idx, ]
  34.   order_i <- order_i[idx]
  35.   i <- 1
  36.   while (TRUE) {
  37.     tmp <- order_i[i]
  38.     idx <- rowSums(sweep(P, 2, P[i, ], ">=")) > 0
  39.     order_i <- order_i[idx]
  40.     P <- P[idx, ]
  41.     # cat(i, length(order_i), "\n")
  42.     i <- match(tmp, order_i) + 1
  43.     if (i > length(order_i))
  44.       break
  45.   }
  46.   return(order_i)
  47. }
  48.  
  49. library(compiler)
  50. MPF_cmp <- cmpfun(MPF)
  51. MPF2_cmp <- cmpfun(MPF2)
  52. numRows <- 1e4
  53. numCols <- 6
  54. P <- matrix(rnorm(numRows * numCols), numRows)
  55. all.equal(MPF(P), MPF2(P)) # TRUE
  56. all.equal(MPF_cmp(P), MPF2_cmp(P)) # TRUE
  57.  
  58. library(Rcpp)
  59. library(RcppArmadillo)
  60. sourceCpp("MPF.cpp") # find it at http://pastebin.com/WtHY0NE1
  61. all.equal(sort(MPF2(P)), sort(MPF3(P))) # TRUE
  62. all.equal(sort(MPF2(P)), sort(MPF3(P, FALSE))) # TRUE
  63.  
  64. library(microbenchmark)
  65. microbenchmark(MPF(P), MPF2(P), MPF_cmp(P), MPF2_cmp(P), MPF3_para = MPF3(P),
  66.                MPF3_nonpara = MPF3(P, FALSE), times = 20L)
  67. # Unit: milliseconds
  68. #         expr       min        lq      mean    median        uq       max neval
  69. #       MPF(P) 2898.5075 2932.7963 2945.0281 2941.5603 2956.3465 2994.9500    20
  70. #      MPF2(P)  425.7175  439.0134  448.3850  447.7643  452.4919  479.0854    20
  71. #   MPF_cmp(P) 1606.3404 1624.9569 1644.8267 1641.9885 1666.8717 1680.6014    20
  72. #  MPF2_cmp(P)  418.9768  439.9396  447.5985  447.3701  452.4641  493.2948    20
  73. #    MPF3_para  571.9870  582.4695  605.7268  604.7585  627.4120  658.2572    20
  74. # MPF3_nonpara  465.8012  466.3910  468.7969  467.8026  470.2701  474.8473    20
  75.  
  76. numRows <- 1e5
  77. numCols <- 6
  78. P <- matrix(rnorm(numRows * numCols), numRows)
  79. microbenchmark(MPF2(P), MPF3_para = MPF3(P), MPF3_nonpara = MPF3(P, FALSE), times = 20L)
  80. # Unit: seconds
  81. #         expr      min        lq      mean    median        uq       max neval
  82. #      MPF2(P)  4.55766  4.652819  4.683523  4.675676  4.722864  4.793978    20
  83. #    MPF3_para 75.54325 77.565791 79.864403 79.633073 82.175211 83.923895    20
  84. # MPF3_nonpara 78.98010 80.252929 81.062153 80.761794 82.034476 84.191405    20
Advertisement
Add Comment
Please, Sign In to add comment