~ruther/ctu-fee-eoa

ref: ab9a6739bf63ccb42baaa1a097b450ac0dbe1153 ctu-fee-eoa/codes/eoa_lib/src/random_search.rs -rw-r--r-- 2.0 KiB
ab9a6739 — Rutherther fix: implement possibility of best candidate not being found 11 days ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
use std::error::Error;

use nalgebra::Dim;
use rand::RngCore;

use crate::{comparison::BetterThanOperator, evolutionary_strategy::EvolutionaryStrategy, fitness::FitnessFunction, initializer::Initializer, local_search::{LocalSearchCandidate, LocalSearchResult, LocalSearchStats}, perturbation::PerturbationOperator, terminating::TerminatingCondition};

pub fn random_search<
    D: Dim,
    TInput,
    TResult,
    TFit,
    TTerminatingCondition,
    TPerturbationOperator,
    TBetterThanOperator,
    TEvolutionaryStrategy,
    TInitializer>(
    fit: &TFit,
    terminating_condition: &mut TTerminatingCondition,
    better_than_operator: &TBetterThanOperator,
    initializer: &TInitializer,
    size: D,
    rng: &mut dyn RngCore
) -> Result<LocalSearchResult<TInput, TResult>, Box<dyn Error>>
where
    TResult: Clone,
    TInput: Clone,
    TFit: FitnessFunction<In = TInput, Out = TResult>,
    TTerminatingCondition: TerminatingCondition<TInput, TResult>,
    TPerturbationOperator: PerturbationOperator<Chromosome = TInput>,
    TEvolutionaryStrategy: EvolutionaryStrategy<TResult, TPerturbationOperator>,
    TBetterThanOperator: BetterThanOperator<TResult>,
    TInitializer: Initializer<D, TInput>
{
    let initial = initializer.initialize_single(size, rng);
    let mut best_candidate = LocalSearchCandidate {
        fit: fit.fit(&initial)?,
        pos: initial,
        cycle: 0
    };

    let mut stats = LocalSearchStats::new();
    let mut cycle: usize = 0;

    while !terminating_condition.should_terminate(&best_candidate, &stats, cycle) {
        let next = initializer.initialize_single(size, rng);
        let next_fit = fit.fit(&next)?;

        // Minimize
        if better_than_operator.better_than(&next_fit, &best_candidate.fit) {
            best_candidate = LocalSearchCandidate {
                pos: next,
                fit: next_fit,
                cycle
            };

            stats.append(best_candidate.clone());
        }

        cycle += 1;
    }

    Ok(LocalSearchResult {
        best_candidate,
        stats,
        cycles: cycle
    })
}