MGO is a scala library based on the cake pattern for multi-objective evolutionary / genetic algorithms:
- enforcing immutability,
- exposes a modular and extensible architecture,
- implements state of the art algorithms,
- take advantage of multi-core architectures.
MGO implements NGSAII, SMSEMOEA, CMAES and other diversity based evolutionary algorithms.
MGO is licenced under the GNU Affero GPLv3 software licence.
Define a problem, for instance ZDT4:
import fr.iscpif.mgo._
import math._
import util.Random
trait ZDT4 extends GAProblem with MGFitness {
def min = Seq.fill(genomeSize)(0.0)
def max = 1.0 :: Seq.fill(genomeSize - 1)(5.0)
type P = Seq[Double]
override def express(g: Seq[Double], rng: Random) = Seq(f1(g), f2(g))
override def evaluate(p: P, rng: Random) = p
def f1(x: Seq[Double]) = x(0)
def f2(x: Seq[Double]) = g(x) * (1 - sqrt(x(0) / g(x)))
def g(x: Seq[Double]) =
1 + 10 * (genomeSize - 1) + (1 until genomeSize).map { i => pow(x(i), 2) - 10 * cos(4 * Pi * x(i)) }.sum
}
Define the optimisation algorithm, for instance NSGAII:
val m =
new ZDT4 with NSGAII with CounterTermination {
def steps = 1000
def mu = 200
def lambda = 200
def genomeSize = 10
}
Run the optimisation:
implicit val rng = newRNG(42)
val res =
m.evolve.untilConverged {
s => println(s.generation)
}
val output = Resource.fromFile("/tmp/res.csv")
for {
r <- res.population.toIndividuals
} {
def line = m.scale(m.values.get(r.genome)) ++ m.fitness(r)
output.append(line.mkString(",") + "\n")
}
For more examples, have a look at the main/scala/fr/iscpif/mgo/test directory in the repository.
libraryDependencies += "fr.iscpif" %% "mgo" % "version"