forked from yolandalago/CIRCUST
-
Notifications
You must be signed in to change notification settings - Fork 0
/
upDownUp_NP_Code_Paralelizado.R
58 lines (46 loc) · 1.45 KB
/
upDownUp_NP_Code_Paralelizado.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
library(doParallel)
CutBySize <- function(m, block.size, nb = ceiling(m/block.size)) {
if(nb > m)
nb <- m
int <- m/nb
upper <- round(1:nb * int)
lower <- c(1, upper[-nb]+1)
size <- c(upper[1], diff(upper))
return(cbind(lower,upper,size))
}
#Funci?n para el c?lculo del mejor estimador Up-Down-Up
function1Local_par<-function(v){
#Buscamos los m?ximos y m?nimos locales que existen
extremos <- extremosLocales(v)
candL <- extremos$candL
candU <- extremos$candU
#N?mero de cores a usar en la paralelizaci?n de la b?squeda
ncores <- min(detectCores()-1,length(candL))
if(is.na(maxCores) == FALSE){
ncores <- min(ncores,maxCores)
}
programacion<-CutBySize(length(candL),nb = ncores)
cl <- makeCluster(ncores)
registerDoParallel(cl)
#Divisi?n del trabajo en los procesos hijos
mejores <- foreach(pr = iter(programacion,by='row'), .export = c("busquedaMejorC")) %dopar% {
dyn.load("pava.dll")
dyn.load("busquedaMejor.dll")
candLInt <- candL[pr[1]:pr[2]]
mejor <- busquedaMejorC(v,candLInt,candU)
return(mejor)
}
stopCluster(cl)
#Busamos el mejor de entre los mejores
mseFin <- Inf
for(elemento in mejores){
if(!is.null(elemento) && elemento$mse < mseFin){
mseFin<-elemento$mse
pavaFin<-elemento$pava
Lopt<-elemento$Lopt
Uopt<-elemento$Uopt
}
}
registerDoSEQ()
return(list(pava=pavaFin,mse=mseFin,candL=candL,candU=candU,Lopt=Lopt,Uopt=Uopt))
}