The package provides an implementation of particle swarm optimization which is consistent with the standard PSO 2007 and 2011 by Maurice Clerc et al. Additionally a number of ancillary routines are provided for easy testing and graphics.
package
Details
Package:
pso
Type:
Package
Version:
1.0.4
Date:
2022-04-12
License:
LGPL-3
Depends:
methods
The core function in the package is psoptim which can be used as a drop in replacement for optim. When used without additional control parameters the implementation is intended to be equivalent to SPSO 2007 (by M. Clerc et al.).
Control parameters can be specified for SPSO 2011 (in its basic implementation), to clamp the maximal velocity, provide restarting when the swarm converges to a region as well as using BFGS as a local search strategy. See psoptim for details.
## Not run:## Some examples of using the functions in the package## Using basic "optim" interface to minimize a functionset.seed(1)psoptim(rep(NA,2),function(x)20+sum(x^2-10*cos(2*pi*x)), lower=-5,upper=5,control=list(abstol=1e-8))## Parabolap <- test.problem("parabola",10)# one local=global minimumset.seed(1)o1 <- psoptim(p,control=list(trace=1,REPORT=50))show(o1)set.seed(1)o2 <- psoptim(p,control=list(trace=1,REPORT=50,w=c(.7,.1)))show(o2)set.seed(1)o3 <- psoptim(p,control=list(trace=1,REPORT=1,hybrid=TRUE))show(o3)## hybrid much faster## Griewankset.seed(2)p <- test.problem("griewank",10)# lots of local minimao1 <- psoptim(p,control=list(trace=1,REPORT=50))show(o1)## The above sometimes get stuck in a local minima.## Adding a restart to increase robustness.set.seed(2)o2 <- psoptim(p,control=list(trace=1,REPORT=50,reltol=1e-4))show(o2)## An then adding the hybridset.seed(2)o3 <- psoptim(p,control=list(trace=1,REPORT=50,reltol=1e-4, hybrid=TRUE,hybrid.control=list(maxit=10)))show(o3)## Rosenbrockset.seed(1)p <- test.problem("rosenbrock",1)o1 <- psoptim(p,control=list(trace=1,REPORT=50))show(o1)## Change to fully informedset.seed(1)o2 <- psoptim(p,control=list(trace=1,REPORT=50,p=1))show(o2)## Rastriginp <- test.problem("rastrigin",10)set.seed(1)o1 <- psoptim(p,control=list(trace=1,REPORT=50))show(o1)set.seed(1)o2 <- psoptim(p,control=list(trace=1,REPORT=50,hybrid=TRUE, hybrid.control=list(maxit=10)))show(o2)# betterplot(o1,xlim=c(0,p@maxf),ylim=c(0,100))lines(o2,col=2)# and much faster convergence## Ackleyset.seed(1)p <- test.problem("ackley",10)o1 <- psoptim(p,control=list(trace=1,REPORT=50))show(o1)## End(Not run)