bBAS is designed to solve the binary-integer-programming. It can also be employed on general optimization problems.

bBASoptim(fn, init = NULL, lower = c(-6, 0), upper = c(-1, 2),
  d0 = 1e-30, d1 = 3, eta_d = 0.99, w = 0.2, c = 0.5, n = 800,
  vmax = 4, seed = NULL, trace = 20, resolution = rep(1,
  length(lower)))

Arguments

fn

objective function; function need to be optimized

init

default = NULL, it will generate randomly; Of course, you can specify it. It should be noted that you'd better specify an integer vector as init when dealing with 0-1 problem. If you don't mind the the init vector is integer or double(numerical), just leave it alone.

lower

lower of parameters to be estimated; Default = c(-6,0) because of the test on Michalewicz function of which thelower is c(-6,0);

upper

upper of parameters; Default = c(-1,2).

d0

a constant to gurantee that sensing length of antennae d doesn't equal to zero. More specifically, $$d^t = \eta_d * d^{t-1} + d_0$$where attenuation coefficient \(\eta_d\) belongs to \([0,1]\)

d1

initial value of antenae length. You can specify it according to your problem scale

eta_d

attenuation coefficient of sensing length of antennae

w

the inertia term

c

a constant belongs to (0,1).$$V_i=wV_i \pm c*rand$$

n

iterations times

vmax

maximum speed of beetle

seed

random seed; default = NULL ; The results of BAS depend on random init value and random directions. Therefore, if you set a random seed, for example,seed = 1, the results will remain the same no matter how many times you repeat your experiments.

trace

default = 20; it means the process is printed to the console every 10 iterations.

resolution

If there are non-integer parameters in the optimization problem, resolution should be taken into consideration. You can use resolution parms to reduce the error generated in the process of translating the double(decimal) to binary. More specifically, you can set resolution as c(1,1,1,1,1) when you deal with lot-sizing problem. But you should make the resolution large enough when dealing with Michalewicz function. If the parameter belongs to [-2.048,2.048], bBAS will search binary number in [0, 4096] and translate it into decimal when you set resolution as 1000. The examples below can be referenced.

Value

A list including best beetle position (parameters) and corresponding objective function value.

References

The algorithm is developed by Miss Ruan Yue. The documents or paper about bBAS will come soon.

Examples

#======== examples start ======================= # BAS application on Michalewicz function library(rBAS) mich <- function(x){ y1 <- -sin(x[1])*(sin((x[1]^2)/pi))^20 y2 <- -sin(x[2])*(sin((2*x[2]^2)/pi))^20 return(y1+y2) } fit <- bBASoptim(fn = mich, init = c(-3,1), resolution = rep(100,2), trace = 20, c = 0.6, seed = 3)
#> Iters 0 xbest = [ -3 1 ], fbest = -2.55738e-05 #> Iters 20 xbest = [ -3.651663 1.607843 ], fbest = -0.9949117 #> Iters 40 xbest = [ -4.581213 1.568627 ], fbest = -0.9998098 #> Iters 60 xbest = [ -4.581213 1.568627 ], fbest = -0.9998098 #> Iters 80 xbest = [ -4.581213 1.568627 ], fbest = -0.9998098 #> Iters 100 xbest = [ -3.78865 1.458824 ], fbest = -1.111469 #> Iters 120 xbest = [ -3.798434 1.537255 ], fbest = -1.485165 #> Iters 140 xbest = [ -3.798434 1.537255 ], fbest = -1.485165 #> Iters 160 xbest = [ -3.798434 1.537255 ], fbest = -1.485165 #> Iters 180 xbest = [ -3.798434 1.537255 ], fbest = -1.485165 #> Iters 200 xbest = [ -3.798434 1.537255 ], fbest = -1.485165 #> Iters 220 xbest = [ -3.798434 1.537255 ], fbest = -1.485165 #> Iters 240 xbest = [ -3.798434 1.537255 ], fbest = -1.485165 #> Iters 260 xbest = [ -3.798434 1.537255 ], fbest = -1.485165 #> Iters 280 xbest = [ -3.798434 1.537255 ], fbest = -1.485165 #> Iters 300 xbest = [ -3.798434 1.537255 ], fbest = -1.485165 #> Iters 320 xbest = [ -3.798434 1.537255 ], fbest = -1.485165 #> Iters 340 xbest = [ -3.798434 1.537255 ], fbest = -1.485165 #> Iters 360 xbest = [ -3.798434 1.537255 ], fbest = -1.485165 #> Iters 380 xbest = [ -5.011742 1.6 ], fbest = -1.747737 #> Iters 400 xbest = [ -5.011742 1.6 ], fbest = -1.747737 #> Iters 420 xbest = [ -5.011742 1.6 ], fbest = -1.747737 #> Iters 440 xbest = [ -5.011742 1.6 ], fbest = -1.747737 #> Iters 460 xbest = [ -5.011742 1.6 ], fbest = -1.747737 #> Iters 480 xbest = [ -5.011742 1.6 ], fbest = -1.747737 #> Iters 500 xbest = [ -5.011742 1.6 ], fbest = -1.747737 #> Iters 520 xbest = [ -5.011742 1.6 ], fbest = -1.747737 #> Iters 540 xbest = [ -5.011742 1.6 ], fbest = -1.747737 #> Iters 560 xbest = [ -5.011742 1.6 ], fbest = -1.747737 #> Iters 580 xbest = [ -5.011742 1.6 ], fbest = -1.747737 #> Iters 600 xbest = [ -5.011742 1.6 ], fbest = -1.747737 #> Iters 620 xbest = [ -4.972603 1.537255 ], fbest = -1.919954 #> Iters 640 xbest = [ -4.972603 1.537255 ], fbest = -1.919954 #> Iters 660 xbest = [ -4.972603 1.568627 ], fbest = -1.963422 #> Iters 680 xbest = [ -4.972603 1.568627 ], fbest = -1.963422 #> Iters 700 xbest = [ -4.972603 1.568627 ], fbest = -1.963422 #> Iters 720 xbest = [ -4.972603 1.568627 ], fbest = -1.963422 #> Iters 740 xbest = [ -4.972603 1.568627 ], fbest = -1.963422 #> Iters 760 xbest = [ -4.972603 1.568627 ], fbest = -1.963422 #> Iters 780 xbest = [ -4.972603 1.568627 ], fbest = -1.963422 #> Iters 800 xbest = [ -4.972603 1.568627 ], fbest = -1.963422
fit$par;fit$value
#> [1] -4.972603 1.568627
#> [1] -1.963422
#==============lot-sizing problem==============# lot_size2 <- function(x){ R = c(100,60,40,50,80) A = 100 c = 1 x1 = 1 - x I = rep(0,5) for(m in 1:4){ t = 0 for (p in (m+1):5){ if(x1[p] == 1){ t = t + R[p] } else{break} } I[m] = t } if(x[1]!=1){ pen = 1e5 }else{ pen = 0 } cost = sum(A*x) + sum(c*I) + pen return(cost) } fit <- bBASoptim(fn = lot_size2, init = rep(1,5), lower = rep(0,5), upper = rep(1,5), resolution = rep(1,5), n = 200)
#> Iters 0 xbest = [ 1 1 1 1 1 ], fbest = 500 #> Iters 20 xbest = [ 1 0 0 1 0 ], fbest = 420 #> Iters 40 xbest = [ 1 0 0 1 0 ], fbest = 420 #> Iters 60 xbest = [ 1 0 0 1 0 ], fbest = 420 #> Iters 80 xbest = [ 1 0 1 0 1 ], fbest = 410 #> Iters 100 xbest = [ 1 0 1 0 1 ], fbest = 410 #> Iters 120 xbest = [ 1 0 1 0 1 ], fbest = 410 #> Iters 140 xbest = [ 1 0 1 0 1 ], fbest = 410 #> Iters 160 xbest = [ 1 0 1 0 1 ], fbest = 410 #> Iters 180 xbest = [ 1 0 1 0 1 ], fbest = 410 #> Iters 200 xbest = [ 1 0 1 0 1 ], fbest = 410
fit$par;fit$value
#> [1] 1 0 1 0 1
#> [1] 410
#======== examples end =======================