Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Resolves #60: add ability to call fitness function in batch #61

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

linanqiu
Copy link

@linanqiu linanqiu commented Sep 1, 2022

Often the fixed cost of calling the fitness function is high while the variable cost is low, especially in ML applications. e.g. calling predict on xgboost for 100 rows takes X seconds, but 100,000 rows takes around 5X seconds. I'm adding an option that allows users to write a batch fitness function and expect the entire population at once.

@BrianCollinss
Copy link

BrianCollinss commented Dec 17, 2024

@linanqiu @luca-scr I hope you consider implementing this simple yet highly beneficial change. It would greatly assist users like myself who work with complex biophysical or hydrological models (within the fitness function) that are inherently multi-core. In such cases, users can efficiently run GA in batch mode, leveraging the models' built-in capabilities for speed enhancement rather than relying on often problematic and hard-to-debug parallel setups.

@BrianCollinss
Copy link

A simple test with and without the batch mode:

With Batch: 30.54 sec elapsed
Without Batch: 47.12 sec elapsed

Rastrigin <- function(X)
{
  if (!is.matrix(X)) X <- matrix(X, nrow=1)
  y <- 20 + X[,1]^2 + X[,2]^2 - 10*(cos(2*pi*X[,1]) + cos(2*pi*X[,2]))
  return(-y)
}

x1 <- x2 <- seq(-5.12, 5.12, by = 0.1)


tictoc::tic('Without Batch')

batch <<- F

GA <- MyGA(type = "real-valued", fitness = Rastrigin,
           lower = c(-5.12, -5.12), upper = c(5.12, 5.12), names = c('Brian', 'Hannah'), 
           popSize = 100000, maxiter = 20, seed = 1234)

tictoc::toc()


tictoc::tic('With Batch')

batch <<- T

GA <- MyGA(type = "real-valued", fitness = Rastrigin,
           lower = c(-5.12, -5.12), upper = c(5.12, 5.12), names = c('Brian', 'Hannah'), 
           popSize = 100000, maxiter = 20, seed = 1234)

tictoc::toc()

Results:

GA | iter = 1 | Mean = -37.087237 | Best =  -0.034033
GA | iter = 2 | Mean = -28.58191495 | Best =  -0.00231666
GA | iter = 3 | Mean = -24.34970276 | Best =  -0.00231666
GA | iter = 4 | Mean = -22.04737478 | Best =  -0.00231666
GA | iter = 5 | Mean = -20.65823630 | Best =  -0.00231666
GA | iter = 6 | Mean = -19.604626560 | Best =  -0.001265335
GA | iter = 7 | Mean = -18.834199107 | Best =  -0.001265335
GA | iter = 8 | Mean = -18.369719957 | Best =  -0.001234899
GA | iter = 9 | Mean = -17.855145020 | Best =  -0.001192352
GA | iter = 10 | Mean = -1.699187e+01 | Best = -6.763496e-05
GA | iter = 11 | Mean = -1.593261e+01 | Best = -6.763496e-05
GA | iter = 12 | Mean = -1.464233e+01 | Best = -6.115125e-05
GA | iter = 13 | Mean = -1.340488e+01 | Best = -6.115125e-05
GA | iter = 14 | Mean = -1.226420e+01 | Best = -6.115125e-05
GA | iter = 15 | Mean = -1.134467e+01 | Best = -6.115125e-05
GA | iter = 16 | Mean = -1.064123e+01 | Best = -2.406873e-05
GA | iter = 17 | Mean = -1.009580e+01 | Best = -1.958549e-05
GA | iter = 18 | Mean = -9.622322e+00 | Best = -1.958549e-05
GA | iter = 19 | Mean = -9.279214e+00 | Best = -1.496871e-06
GA | iter = 20 | Mean = -9.067810e+00 | Best = -1.496871e-06
GA | iter = 21 | Mean = -8.847282e+00 | Best = -1.496871e-06
GA | iter = 22 | Mean = -8.759628e+00 | Best = -1.496871e-06
GA | iter = 23 | Mean = -8.708347e+00 | Best = -6.336368e-07
GA | iter = 24 | Mean = -8.584083e+00 | Best = -6.336368e-07
GA | iter = 25 | Mean = -8.598304e+00 | Best = -6.336368e-07
GA | iter = 26 | Mean = -8.498997e+00 | Best = -6.336368e-07
GA | iter = 27 | Mean = -8.334180e+00 | Best = -3.352952e-07
GA | iter = 28 | Mean = -8.279732e+00 | Best = -3.352952e-07
GA | iter = 29 | Mean = -8.374429e+00 | Best = -3.352952e-07
GA | iter = 30 | Mean = -8.196381e+00 | Best = -3.352952e-07
GA | iter = 31 | Mean = -8.257026e+00 | Best = -3.352952e-07
GA | iter = 32 | Mean = -8.285562e+00 | Best = -9.622917e-08
GA | iter = 33 | Mean = -8.226192e+00 | Best = -9.622917e-08
GA | iter = 34 | Mean = -8.291178e+00 | Best = -9.622917e-08
GA | iter = 35 | Mean = -8.275468e+00 | Best = -9.622917e-08
GA | iter = 36 | Mean = -8.346961e+00 | Best = -9.622917e-08
GA | iter = 37 | Mean = -8.465490e+00 | Best = -9.622917e-08
GA | iter = 38 | Mean = -8.323611e+00 | Best = -9.622917e-08
GA | iter = 39 | Mean = -8.203824e+00 | Best = -9.622917e-08
GA | iter = 40 | Mean = -8.208880e+00 | Best = -9.622917e-08
GA | iter = 41 | Mean = -8.361962e+00 | Best = -9.622917e-08
GA | iter = 42 | Mean = -8.363373e+00 | Best = -9.622917e-08
GA | iter = 43 | Mean = -8.314893e+00 | Best = -9.622917e-08
GA | iter = 44 | Mean = -8.279376e+00 | Best = -9.622917e-08
GA | iter = 45 | Mean = -8.401661e+00 | Best = -1.530344e-08
GA | iter = 46 | Mean = -8.359198e+00 | Best = -1.530344e-08
GA | iter = 47 | Mean = -8.471020e+00 | Best = -1.530344e-08
GA | iter = 48 | Mean = -8.367658e+00 | Best = -1.530344e-08
GA | iter = 49 | Mean = -8.173462e+00 | Best = -1.530344e-08
GA | iter = 50 | Mean = -8.304040e+00 | Best = -1.530344e-08
Without Batch: 47.12 sec elapsed
GA | iter = 1 | Mean = -37.087237 | Best =  -0.034033
GA | iter = 2 | Mean = -28.58191495 | Best =  -0.00231666
GA | iter = 3 | Mean = -24.34970276 | Best =  -0.00231666
GA | iter = 4 | Mean = -22.04737478 | Best =  -0.00231666
GA | iter = 5 | Mean = -20.65823630 | Best =  -0.00231666
GA | iter = 6 | Mean = -19.604626560 | Best =  -0.001265335
GA | iter = 7 | Mean = -18.834199107 | Best =  -0.001265335
GA | iter = 8 | Mean = -18.369719957 | Best =  -0.001234899
GA | iter = 9 | Mean = -17.855145020 | Best =  -0.001192352
GA | iter = 10 | Mean = -1.699187e+01 | Best = -6.763496e-05
GA | iter = 11 | Mean = -1.593261e+01 | Best = -6.763496e-05
GA | iter = 12 | Mean = -1.464233e+01 | Best = -6.115125e-05
GA | iter = 13 | Mean = -1.340488e+01 | Best = -6.115125e-05
GA | iter = 14 | Mean = -1.226420e+01 | Best = -6.115125e-05
GA | iter = 15 | Mean = -1.134467e+01 | Best = -6.115125e-05
GA | iter = 16 | Mean = -1.064123e+01 | Best = -2.406873e-05
GA | iter = 17 | Mean = -1.009580e+01 | Best = -1.958549e-05
GA | iter = 18 | Mean = -9.622322e+00 | Best = -1.958549e-05
GA | iter = 19 | Mean = -9.279214e+00 | Best = -1.496871e-06
GA | iter = 20 | Mean = -9.067810e+00 | Best = -1.496871e-06
GA | iter = 21 | Mean = -8.847282e+00 | Best = -1.496871e-06
GA | iter = 22 | Mean = -8.759628e+00 | Best = -1.496871e-06
GA | iter = 23 | Mean = -8.708347e+00 | Best = -6.336368e-07
GA | iter = 24 | Mean = -8.584083e+00 | Best = -6.336368e-07
GA | iter = 25 | Mean = -8.598304e+00 | Best = -6.336368e-07
GA | iter = 26 | Mean = -8.498997e+00 | Best = -6.336368e-07
GA | iter = 27 | Mean = -8.334180e+00 | Best = -3.352952e-07
GA | iter = 28 | Mean = -8.279732e+00 | Best = -3.352952e-07
GA | iter = 29 | Mean = -8.374429e+00 | Best = -3.352952e-07
GA | iter = 30 | Mean = -8.196381e+00 | Best = -3.352952e-07
GA | iter = 31 | Mean = -8.257026e+00 | Best = -3.352952e-07
GA | iter = 32 | Mean = -8.285562e+00 | Best = -9.622917e-08
GA | iter = 33 | Mean = -8.226192e+00 | Best = -9.622917e-08
GA | iter = 34 | Mean = -8.291178e+00 | Best = -9.622917e-08
GA | iter = 35 | Mean = -8.275468e+00 | Best = -9.622917e-08
GA | iter = 36 | Mean = -8.346961e+00 | Best = -9.622917e-08
GA | iter = 37 | Mean = -8.465490e+00 | Best = -9.622917e-08
GA | iter = 38 | Mean = -8.323611e+00 | Best = -9.622917e-08
GA | iter = 39 | Mean = -8.203824e+00 | Best = -9.622917e-08
GA | iter = 40 | Mean = -8.208880e+00 | Best = -9.622917e-08
GA | iter = 41 | Mean = -8.361962e+00 | Best = -9.622917e-08
GA | iter = 42 | Mean = -8.363373e+00 | Best = -9.622917e-08
GA | iter = 43 | Mean = -8.314893e+00 | Best = -9.622917e-08
GA | iter = 44 | Mean = -8.279376e+00 | Best = -9.622917e-08
GA | iter = 45 | Mean = -8.401661e+00 | Best = -1.530344e-08
GA | iter = 46 | Mean = -8.359198e+00 | Best = -1.530344e-08
GA | iter = 47 | Mean = -8.471020e+00 | Best = -1.530344e-08
GA | iter = 48 | Mean = -8.367658e+00 | Best = -1.530344e-08
GA | iter = 49 | Mean = -8.173462e+00 | Best = -1.530344e-08
GA | iter = 50 | Mean = -8.304040e+00 | Best = -1.530344e-08
With Batch: 30.54 sec elapsed

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants