Learn R Programming

miesmuschel: Mixed Integer Evolution Strategies

What does it do?

miesmuschel provides evolutionary black box optimization algorithms, building on the bbotk package. miesmuschel offers both ready-to-use optimization algorithms, as well as their fundamental building blocks that can be used to manually construct specialized optimization loops.

What does it do? (poem version)

(also giving a hint on how to pronounce "miesmuschel")

The R software package miesmuschel
Offers opt-algorithms, so crucial
bbotk is its base, it's a powerful tool
For optimization, it's truly no fool

Ready-made or D-I-Y, the choice is yours
With miesmuschel, your options are wide open doors
So when you do optimize, just give it a try
With miesmuschel, surely, success is nigh!

Project Status

Although miesmuschel is currently still evolving, it can already be used for optimization. All exported functions are thoroughly documented.

Installation

Install the github version, using remotes:

remotes::install_github("mlr-org/miesmuschel")

Some Code to Get Started

Preparation

library("bbotk")
library("paradox")
lgr::threshold("warn")

objective <- ObjectiveRFun$new(
  fun = function(xs) {
    z <- exp(-xs$x^2 - xs$y^2) + 2 * exp(-(2 - xs$x)^2 - (2 - xs$y)^2)
    list(Obj = z)
  },
  domain = ps(x = p_dbl(-2, 4), y = p_dbl(-2, 4)),
  codomain = ps(Obj = p_dbl(tags = "maximize"))
)

Using bbotk::Optimizer Object

This is the recommended way of using miesmuschel.

# Get a new OptimInstance
oi <- OptimInstanceSingleCrit$new(objective,
  terminator = trm("evals", n_evals = 100)
)

library("miesmuschel")

# Get operators
op.m <- mut("gauss", sdev = 0.1)
op.r <- rec("xounif", p = .3)
op.parent <- sel("random")
op.survival <- sel("best")

# Create OptimizerMies object
mies <- opt("mies", mutator = op.m, recombinator = op.r,
  parent_selector = op.parent, survival_selector = op.survival,
  mu = 3, lambda = 2)

# mies$optimize performs MIES optimization and returns the optimum
mies$optimize(oi)
#>           x        y  x_domain      Obj
#> 1: 1.935055 1.973867 <list[2]> 1.990703

Using mies_* Functions Directly

This gives more flexibility when designing ES algorithms, but it is also more verbose and error-prone.

# Get a new OptimInstance
oi <- OptimInstanceSingleCrit$new(objective,
  terminator = trm("evals", n_evals = 100)
)

library("miesmuschel")

# Get operators
op.m <- mut("gauss", sdev = 0.1)
op.r <- rec("xounif", p = .3)
op.parent <- sel("random")
op.survival <- sel("best")

# Prime operators
mies_prime_operators(list(op.m), list(op.r), list(op.parent, op.survival),
  search_space = oi$search_space)

# Sample first generation
mies_init_population(oi, 3)

# This is the first generation
oi$archive$data[, .(x, y, Obj, dob, eol)]
#>             x          y        Obj dob eol
#> 1:  3.8516312  1.2386550 0.03633278   1  NA
#> 2: -1.6478480 -0.9080712 0.02901343   1  NA
#> 3: -0.4215587  0.8250017 0.42529339   1  NA

# Select parents, recombine, mutate
offspring <- mies_generate_offspring(oi, 2, op.parent, op.m, op.r)

# This is the first offspring population
offspring
#>            x           y
#> 1:  2.762783 -0.24885684
#> 2: -1.439780 -0.05699817

# Evaluate offspring (and append to oi archive)
mies_evaluate_offspring(oi, offspring)

# State of the archive now: Second generation has `dob` == 2 
oi$archive$data[, .(x, y, Obj, dob, eol)]
#>             x           y         Obj dob eol
#> 1:  3.8516312  1.23865501 0.036332776   1  NA
#> 2: -1.6478480 -0.90807120 0.029013430   1  NA
#> 3: -0.4215587  0.82500173 0.425293387   1  NA
#> 4:  2.7627829 -0.24885684 0.007566604   2  NA
#> 5: -1.4397798 -0.05699817 0.125404228   2  NA

# Selecto for survival
mies_survival_plus(oi, 3, op.survival)

# Survivors have `eol` NA, two individuals 'died' in generation 2
oi$archive$data[, .(x, y, Obj, dob, eol)]
#>             x           y         Obj dob eol
#> 1:  3.8516312  1.23865501 0.036332776   1  NA
#> 2: -1.6478480 -0.90807120 0.029013430   1   2
#> 3: -0.4215587  0.82500173 0.425293387   1  NA
#> 4:  2.7627829 -0.24885684 0.007566604   2   2
#> 5: -1.4397798 -0.05699817 0.125404228   2  NA

# Perform MIES loop until terminated. This gives an expected `terminated` error
repeat {
  offspring <- mies_generate_offspring(oi, 2, op.parent, op.m, op.r)
  mies_evaluate_offspring(oi, offspring)
  mies_survival_plus(oi, 3, op.survival)
}

# Best result:
oi$archive$data[which.max(Obj)]
#>           x        y dob eol      Obj  x_domain           timestamp batch_nr
#> 1: 2.021887 2.164051  46  NA 1.946115 <list[2]> 2021-02-15 01:56:23       46

Copy Link

Version

Install

install.packages('miesmuschel')

Monthly Downloads

1,177

Version

0.0.4-3

License

MIT + file LICENSE

Issues

Pull Requests

Stars

Forks

Maintainer

Martin Binder

Last Published

March 19th, 2025

Functions in miesmuschel (0.0.4-3)

Filtor

Filtor Base Class
OptimInstanceMultiCrit

OptimInstanceMultiCrit Class
Mutator

Mutator Base Class
Optimizer

Optimizer Class
MiesOperator

Operator Base Class
OptimInstanceSingleCrit

OptimInstanceSingleCrit Class
MutatorNumeric

Numeric Mutator Base Class
OperatorCombination

Self-Adaptive Operator Combinations
FiltorSurrogate

Abstract Surrogate Model Filtering Base Class
MutatorDiscrete

Discrete Mutator Base Class
SelectorScalar

Selector making use of Scalors
Scalarizer

Scalarizer
ParamSetShadow

ParamSetShadow
TuningInstanceMultiCrit

TuningInstanceMultiCrit Class
Selector

Selector Base Class
Scalor

Scalor Base Class
SamplerRandomWeights

Sampler for Projection Weights
RecombinatorPair

Pair Recombinator Base Class
Recombinator

Recombinator Base Class
OptimizerMies

Mixed Integer Evolution Strategies Optimizer
dict_mutators

Dictionary of Mutators
dict_filtors_null

Null-Filtor
TuningInstanceSingleCrit

TuningInstanceSingleCrit Class
dict_filtors_surprog

Progressive Surrogate Model Filtering
crate_env

Set a Function's Environment
dict_filtors_surtour

Tournament Surrogate Model Filtering
dict_filtors_maybe

Filtor-Combination that Filters According to Two Filtors
dict_mutators_cmpmaybe

Mutator Choosing Action Component-Wise Independently
dict_filtors_proxy

Proxy-Filtor that Filters According to its Configuration Parameter
dict_filtors

Dictionary of Filtors
dict_mutators_proxy

Proxy-Mutator that Mutates According to its Configuration parameter
dict_recombinators

Dictionary of Recombinators
dict_mutators_sequential

Run Multiple Mutator Operations in Sequence
dict_mutators_erase

Uniform Sample Mutator
dict_recombinators_cmpmaybe

Recombinator Choosing Action Component-Wise Independently
dict_mutators_unif

Uniform Discrete Mutator
dict_recombinators_convex

Convex Combination Recombinator
dict_mutators_gauss

Gaussian Distribution Mutator
dict_mutators_maybe

Mutator Choosing Action Probabilistically
dict_mutators_null

Null Mutator
dict_scalors

Dictionary of Scalors
dict_recombinators_sbx

Simulated Binary Crossover Recombinator
dict_recombinators_null

Null-Recombinator
dict_recombinators_swap

Swap Recombinator
dict_recombinators_maybe

Recombinator Choosing Action Probabilistically
dict_recombinators_cvxpair

Convex Combination Recombinator for Pairs
dict_recombinators_xounif

Crossover Recombinator
dict_recombinators_sequential

Run Multiple Recombinator Operations in Sequence
dict_recombinators_proxy

Proxy-Recombinator that Recombines According to its Configuration parameter
dict_recombinators_xonary

N-ary Crossover Recombinator
dict_scalors_aggregate

Scalor giving Weighted Sum of Multiple Scalors
dict_scalors_domcount

Scalor Counting Dominating Individuals
dict_scalors_fixedprojection

Multi-Objective Fixed Projection Scalor
dict_selectors_best

Best Value Selector
dict_scalors_proxy

Proxy-Scalor that Scales According to its Configuration parameter
dict_scalors_single

Single Objective Scalor
dict_scalors_nondom

Nondominated Sorting Scalor
dict_selectors

Dictionary of Selectors
dict_scalors_hypervolume

Hypervolume Scalor
dict_scalors_one

Single Dimension Scalor
domhv_contribution

Calculate Hypervolume Contribution
domhv_improvement

Calculate Hypervolume Improvement
dict_selectors_sequential

Run Multiple Selection Operations in Sequence
dict_selectors_tournament

Tournament Selector
dict_selectors_null

Null Selector
dict_selectors_random

Random Selector
dict_selectors_proxy

Proxy-Selector that Selects According to its Configuration Parameter
dict_selectors_maybe

Selector-Combination that Selects According to Two Selectors
dist_crowding

Calculate Crowding Distance
domhv

Calculate Dominated Hypervolume
mies_aggregate_single_generation

Aggregate a Value for a given Generation
mies_filter_offspring

Filter Offspring
mies_aggregate_generations

Get Aggregated Performance Values by Generation
mies_get_generation_results

Get Performance Values by Generation
mies_generation_apply

Aggregate Values for All Generations Present
mies_get_fitnesses

Get Fitness Values from OptimInstance
mies_init_population

Initialize MIES Optimization
mies_generate_offspring

Generate Offspring Through Mutation and Recombination
mies_generation

Get the Last Generation that was Evaluated
mies_evaluate_offspring

Evaluate Proposed Configurations Generated in a MIES Iteration
mies_select_from_archive

Select Individuals from an OptimInstance
mlr_terminators_budget

Terminator that Limits Total Budget Component Evaluation
mies_step_fidelity

Re-Evaluate Existing Configurations with Higher Fidelity
mies_prime_operators

Prime MIES Operators
mies_survival_comma

Choose Survivors According to the "Mu , Lambda" ("Comma") Strategy
mlr_terminators_gens

Terminator that Counts OptimizerMies Generations
mies_survival_plus

Choose Survivors According to the "Mu + Lambda" ("Plus") Strategy
mlr_terminators_genstag

Terminator That Stops When a Generation-Wise Aggregated Value Stagnates
mlr_terminators_genperfreached

Terminator That Stops When a Generation-Wise Aggregated Value Reaches a Target
miesmuschel-package

miesmuschel: Mixed Integer Evolution Strategies
scalarizer_linear

Linear Scalarizer
terminator_get_generations

Get the Numger of Generations that a Terminator Allows
mut

Short Access Forms for Operators
rank_nondominated

Perform Nondominated Sorting
scalarizer_chebyshev

Chebyshev Scalarizer
repr

Create a 'call' Object Representation