Evolutionary.jl icon indicating copy to clipboard operation
Evolutionary.jl copied to clipboard

DE rastrigin tests sometimes randomly fail

Open ianatol opened this issue 3 years ago • 0 comments

The example below fails ~ 1 in every 10 times on Julia master, with the following error:

using StableRNGs
using Random
using Test
using Evolutionary

rng = StableRNG(42)

N = 3
P = 100
initState = ()->rand(rng, N)

function test_result(result::Evolutionary.EvolutionaryOptimizationResults, N::Int, tol::Float64)
    fitness = minimum(result)
    extremum = Evolutionary.minimizer(result)
    if round(fitness) == 0
        @test extremum ≈ zeros(N) atol=tol
        @test fitness ≈ 0.0 atol=tol
    else
        # @warn("Found local minimum!!!")
        @test sum(abs, extremum) < N
    end
end

# Objective function
function rastrigin(x::AbstractVector{T}) where {T <: AbstractFloat}
    n = length(x)
    return 10n + sum([ x[i]^2 - 10cos(convert(T,2π*x[i])) for i in 1:n ])
end

selections = [:rand=>random, :perm=>permutation, :rndoff=>randomoffset, :best=>best]
mutations = [:exp=>EXPX(0.5), :bin=>BINX(0.5)]
opts = Evolutionary.Options(rng=rng, successive_f_tol=25)
@testset "DE settings" for (sn,ss) in selections, (mn,ms) in mutations, n in 1:2
    Random.seed!(rng, 1)
    result = Evolutionary.optimize( rastrigin, initState,
        DE(
            populationSize = P,
            n=n,
            selection = ss,
            recombination = ms,
            F = 0.9
           ),
        opts
    )
    println("DE/$sn/$n/$mn(F=0.9,Cr=0.5) => F: $(minimum(result)), C: $(Evolutionary.iterations(result))")
    #println(Evolutionary.minimizer(result))
    test_result(result, N, 1e-4)
end

Error:

Test Summary: | Pass  Total  Time
DE settings   |    2      2  0.4s
DE/rndoff/2/exp(F=0.9,Cr=0.5) => F: 0.00038250130044303887, C: 61
DE settings: Test Failed at REPL[9]:5
  Expression: ≈(extremum, zeros(N), atol = tol)
   Evaluated: [-0.0008353205026887522, 0.0007904746949007734, 0.0026797512063458733] ≈ [0.0, 0.0, 0.0] (atol=0.0001)
Stacktrace:
 [1] macro expansion
   @ ~/master/usr/share/julia/stdlib/v1.9/Test/src/Test.jl:464 [inlined]
 [2] test_result(result::Evolutionary.EvolutionaryOptimizationResults{DE{typeof(randomoffset), Evolutionary.var"#expxvr#152"{Evolutionary.var"#expxvr#151#153"{Float64}}}, Vector{Float64}, Float64}, N::Int64, tol::Float64)
   @ Main ./REPL[9]:5
DE settings: Test Failed at REPL[9]:6
  Expression: ≈(fitness, 0.0, atol = tol)
   Evaluated: 0.00038250130044303887 ≈ 0.0 (atol=0.0001)
Stacktrace:
 [1] macro expansion
   @ ~/master/usr/share/julia/stdlib/v1.9/Test/src/Test.jl:464 [inlined]
 [2] test_result(result::Evolutionary.EvolutionaryOptimizationResults{DE{typeof(randomoffset), Evolutionary.var"#expxvr#152"{Evolutionary.var"#expxvr#151#153"{Float64}}}, Vector{Float64}, Float64}, N::Int64, tol::Float64)
   @ Main ./REPL[9]:6
Test Summary: | Fail  Total  Time
DE settings   |    2      2  0.5s
Test Summary: | Fail  Total  Time
DE settings   |    2      2  0.6s

ianatol avatar Mar 18 '22 21:03 ianatol