Pareto optimization - non-dominated points

萝らか妹 提交于 2019-11-30 18:32:38

问题


I wrote an algorithm that returns a list similar to that which nsga2 returns. (nsga2 of package "mco" (pdf))

The algorithm can not itself recognize if a point is non-dominated. Some of the points it returns are dominated and it only contains the points and their values, not the logic-vector that nsga2 returns.

I am trying to get the non-dominated points (not their values).

With nsga2's result you can use paretoSet() to get the values, however that depends on that the logic-vector has been precomputed during nsga2.

I also looked at paretoFront()/paretoFilter() of "mco" and nondominated_points() of package "emoa" (pdf), however they only work with the values, there is no way to get the points.

One way to solve this would be to accept the values, and then for every value go through the points, look if it has that value and if so add it to a list. But I think there has to exist a function that returns the points.

To reproduce this you could use:

res = nsga2(func, 3, 2, lower.bounds=rep(0, 5), upper.bounds=rep(1, 5))
res$pareto.optimal = NULL
points = paretoSet(res) # points will be empty because res does 
                        # not have the logic vector

回答1:


This is a late answer but it may be useful for future visitors.

After testing your answer code more carefully with different input data, I realized that it may not work well in some situations.

Take a look at this example. The input data is here.

Results using your code (adapted):

urlfile<-'https://raw.githubusercontent.com/allanvc/pareto_non_dominated_points-test/master/data_example.txt'
dt<-read.table(urlfile, header=TRUE)

from = 1:nrow(dt)
d <- as.data.frame(cbind(dt, from))
D = d[order(d$x, d$y), ]
nondom = D[which(!duplicated(cummin(d$y))), ]

plot(d[,c(1,2)])
points(nondom, col='red')

We can see clearly that your algorithm was not able to find correctly the non-dominated points. The purple point at the bottom left (near the origin) was one of them for instance.

After seeking for an alternative and fast solution, I've found two packages that do the job: "ecr" and "emoa". Actually emoa loads ecr inside.

with ecr:

# ecr alternative:
library(ecr)
nondom_ecr <- dt[which.nondominated(t(dt)),]

plot(dt)
points(nondom_ecr, col='red')

with emoa:

library(emoa)
nondom_emoa <- nondominated_points(t(as.matrix(dt)))

plot(dt)
points(t(nondom_emoa), col='green')

Note:

In both cases we have to pass our data matrix as a "long format" to functions. So we simple transpose it with t().

More information about these packages you'll find at:

  1. https://www.rdocumentation.org/packages/ecr/versions/2.1.0/

  2. http://r.adu.org.za/web/packages/emoa/emoa.pdf

Session Info:

R version 3.4.4 (2018-03-15)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Linux Mint 18.3

Matrix products: default
BLAS: /usr/lib/libblas/libblas.so.3.6.0
LAPACK: /usr/lib/lapack/liblapack.so.3.6.0

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C               LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=pt_BR.UTF-8    LC_MESSAGES=en_US.UTF-8    LC_PAPER=pt_BR.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C             LC_MEASUREMENT=pt_BR.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] emoa_0.5-0          ecr_2.1.0           smoof_1.5.1         checkmate_1.8.5     ParamHelpers_1.10   BBmisc_1.11        
 [7] magrittr_1.5        ggplot2_2.2.1       RcppMLPACK_1.0.10-6 Rcpp_0.12.16       

loaded via a namespace (and not attached):
 [1] parallelMap_1.3     pillar_1.1.0        compiler_3.4.4      RColorBrewer_1.1-2  plyr_1.8.4          bindr_0.1          
 [7] tools_3.4.4         digest_0.6.14       viridisLite_0.2.0   jsonlite_1.5        tibble_1.4.2        gtable_0.2.0       
[13] pkgconfig_2.0.1     rlang_0.1.6         parallel_3.4.4      yaml_2.1.16         bindrcpp_0.2        stringr_1.2.0      
[19] dplyr_0.7.4         httr_1.3.1          htmlwidgets_1.0     plot3D_1.1.1        grid_3.4.4          glue_1.2.0         
[25] data.table_1.10.4-3 R6_2.2.2            plotly_4.7.1        mco_1.0-15.1        RJSONIO_1.3-0       reshape2_1.4.3     
[31] tidyr_0.7.2         purrr_0.2.4         backports_1.1.2     scales_0.5.0        htmltools_0.3.6     assertthat_0.2.0   
[37] misc3d_0.8-4        colorspace_1.3-2    labeling_0.3        stringi_1.1.6       lazyeval_0.2.1      munsell_0.4.3



回答2:


Found the answer myself. (No one answering for more than 2 days seems somewhat of a motivation)

For visualization this example shows how you would retain the color of points when you implement non-dominated-calculation, obviously you can also store their search-space coordinates in multiple columns instead. (note: this example is specialized on 2 objectives but that can be generalized)

x = runif(20)
y = runif(20)
from = 1:20
d = data.frame(x, y, from)
d
D = d[order(d$x, d$y), ]
nondom = D[which(!duplicated(cummin(D$y))), ]
nondom
plot(d[,1:2], col=d$from, xlim=c(0,1), ylim=c(0,1))
plot(nondom[,1:2], col=nondom$from, xlim=c(0,1), ylim=c(0,1))


来源:https://stackoverflow.com/questions/25585519/pareto-optimization-non-dominated-points

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!