Crate abc [] [src]

Runs Karaboga's Artificial Bee Colony algorithm in parallel.

To take advantage of this crate, the user must implement the Solution trait for a type of their creation. A Hive of the appropriate type can then be built, which will search the solution space for the fittest candidate.

Examples

// ABC algorithm with canonical (proportionate) fitness scaling
// to minimize the 10-dimensional Rastrigin function.

extern crate abc;
extern crate rand;

use std::f32::consts::PI;
use rand::{random, Closed01, thread_rng, Rng};
use abc::{Context, Candidate, HiveBuilder};

const SIZE: usize = 10;

#[derive(Clone, Debug)]
struct S([f32;SIZE]);

// Not really necessary; we're using this mostly to demonstrate usage.
struct SBuilder {
    min: f32,
    max: f32,
    a: f32,
    p_min: f32,
    p_max: f32,
}

impl Context for SBuilder {
    type Solution = [f32;SIZE];

    fn make(&self) -> [f32;SIZE] {
        let mut new = [0.0;SIZE];
        for i in 0..SIZE {
            let Closed01(x) = random::<Closed01<f32>>();
            new[i] = (x * (self.max - self.min)) + self.min;
        }
        new
    }

    fn evaluate_fitness(&self, solution: &[f32;10]) -> f64 {
        let sum = solution.iter()
                          .map(|x| x.powf(2.0) - self.a * (*x * 2.0 * PI).cos())
                          .fold(0.0, |total, next| total + next);
        let rastrigin = ((self.a * SIZE as f32) + sum) as f64;

        // Minimize.
        if rastrigin >= 0.0 {
            1.0 / (1.0 + rastrigin)
        } else {
            1.0 + rastrigin.abs()
        }
    }

    fn explore(&self, field: &[Candidate<[f32;SIZE]>], index: usize) -> [f32;SIZE] {
        // new[i] = current[i] + Φ * (current[i] - other[i]), where:
        //      phi_min <= Φ <= phi_max
        //      other is a solution, other than current, chosen at random

        let ref current = field[index].solution;
        let mut new = [0_f32;SIZE];

        for i in 0..SIZE {
            // Choose a different vector at random.
            let mut rng = thread_rng();
            let mut index2 = rng.gen_range(0, current.len() - 1);
            if index2 >= index { index2 += 1; }
            let ref other = field[index2].solution;

            let phi = random::<Closed01<f32>>().0 * (self.p_max - self.p_min) + self.p_min;
            new[i] = current[i] + (phi * (current[i] - other[i]));
        }

        new
    }
}

fn main() {
    let mut builder = SBuilder {
        min: -5.12,
        max: 5.12,
        a: 10.0,
        p_min: -1.0,
        p_max: 1.0
    };
    let hive_builder = HiveBuilder::new(builder, 10);
    let hive = hive_builder.build().unwrap();

    // Once built, the hive can be run for a number of rounds.
    let best_after_10 = hive.run_for_rounds(10).unwrap();

    // As long as it's run some rounds at a time, you can keep running it.
    let best_after_20 = hive.run_for_rounds(10).unwrap();

    // The algorithm doesn't guarantee improvement in any number of rounds,
    // but it always keeps its all-time best.
    assert!(best_after_20.fitness >= best_after_10.fitness);

    // The hive can be consumed to create a Receiver object. This can be
    // iterated over indefinitely, and will receive successive improvements
    // on the best candidate so far.
    let mut current_best_fitness = best_after_20.fitness;
    for new_best in hive.stream().iter().take(3) {
        // The iterator will start with the best result so far; after that,
        // each new candidate will be an improvement.
        assert!(new_best.fitness >= current_best_fitness);
        current_best_fitness = new_best.fitness;
    }
}

Modules

scaling

Manipulates the probabilities of working on different solutions.

Structs

Candidate

One solution being explored by the hive, plus additional data.

Error

Unifies the errors thrown by a hive's operation.

Hive

Runs the ABC algorithm, maintaining any necessary state.

HiveBuilder

Manages the parameters of the ABC algorithm.

Traits

Context

Context for generating and evaluating solutions.

Type Definitions

Result

Encodes the possibility of a thread panicking and corruping a mutex.