|
| 1 | +""" |
| 2 | +Parameter adaptation mechanisms for RDEx optimizer. |
| 3 | +
|
| 4 | +Handles adaptation of F, Cr, and hybrid strategy parameters. |
| 5 | +""" |
| 6 | +module AdaptationUtils |
| 7 | + |
| 8 | +import ..Constants |
| 9 | + |
| 10 | +""" |
| 11 | + weighted_mean(values::Vector{Float64}, weights::Vector{Float64}, success_filled::Int, weights_storage::Vector{Float64}) -> Float64 |
| 12 | +
|
| 13 | +Compute weighted mean of values using weights. |
| 14 | +""" |
| 15 | +function weighted_mean( |
| 16 | + values::Vector{Float64}, |
| 17 | + weights::Vector{Float64}, |
| 18 | + success_filled::Int, |
| 19 | + weights_storage::Vector{Float64} |
| 20 | +)::Float64 |
| 21 | + sum_weight = sum(weights[1:success_filled]) |
| 22 | + if sum_weight == 0.0 |
| 23 | + return 1.0 |
| 24 | + end |
| 25 | + |
| 26 | + weights_storage[1:success_filled] = weights[1:success_filled] / sum_weight |
| 27 | + |
| 28 | + sum_square = sum(weights_storage[i] * values[i] * values[i] for i = 1:success_filled) |
| 29 | + sum_val = sum(weights_storage[i] * values[i] for i = 1:success_filled) |
| 30 | + |
| 31 | + if abs(sum_val) > 1e-8 |
| 32 | + return sum_square / sum_val |
| 33 | + else |
| 34 | + return 1.0 |
| 35 | + end |
| 36 | +end |
| 37 | + |
| 38 | +""" |
| 39 | + update_memory!( |
| 40 | + parameters, |
| 41 | + temp_success_cr::Vector{Float64}, |
| 42 | + temp_success_f::Vector{Float64}, |
| 43 | + fit_delta::Vector{Float64} |
| 44 | + ) |
| 45 | +
|
| 46 | +Update memory for Cr and F parameters based on successful trials. |
| 47 | +""" |
| 48 | +function update_memory!( |
| 49 | + parameters, |
| 50 | + temp_success_cr::Vector{Float64}, |
| 51 | + temp_success_f::Vector{Float64}, |
| 52 | + fit_delta::Vector{Float64} |
| 53 | +)::Nothing |
| 54 | + if parameters.success_filled != 0 |
| 55 | + parameters.memory_cr[parameters.memory_iter+1] = 0.5 * ( |
| 56 | + weighted_mean(temp_success_cr, fit_delta, parameters.success_filled, parameters.weights) + |
| 57 | + parameters.memory_cr[parameters.memory_iter+1] |
| 58 | + ) |
| 59 | + parameters.memory_f[parameters.memory_iter+1] = weighted_mean( |
| 60 | + temp_success_f, fit_delta, parameters.success_filled, parameters.weights |
| 61 | + ) |
| 62 | + parameters.memory_iter = (parameters.memory_iter + 1) % parameters.memory_size |
| 63 | + end |
| 64 | + return nothing |
| 65 | +end |
| 66 | + |
| 67 | +""" |
| 68 | + update_eb_hybrid_param!( |
| 69 | + parameters, |
| 70 | + eb_hybrid_flag::Vector{Float64}, |
| 71 | + fit_arr_front::Vector{Float64}, |
| 72 | + fit_temp::Vector{Float64}, |
| 73 | + n_inds_front::Int |
| 74 | + ) |
| 75 | +
|
| 76 | +Update the elite-based hybrid rate parameter based on performance. |
| 77 | +""" |
| 78 | +function update_eb_hybrid_param!( |
| 79 | + parameters, |
| 80 | + eb_hybrid_flag::Vector{Float64}, |
| 81 | + fit_arr_front::Vector{Float64}, |
| 82 | + fit_temp::Vector{Float64}, |
| 83 | + n_inds_front::Int |
| 84 | +)::Nothing |
| 85 | + sum_eb_delta_fit = 0.0 |
| 86 | + sum_origin_delta_fit = 0.0 |
| 87 | + |
| 88 | + for chosen_one = 1:n_inds_front |
| 89 | + if eb_hybrid_flag[chosen_one] == 1.0 |
| 90 | + if fit_temp[chosen_one] <= fit_arr_front[chosen_one] |
| 91 | + sum_eb_delta_fit += fit_arr_front[chosen_one] - fit_temp[chosen_one] |
| 92 | + end |
| 93 | + else |
| 94 | + if fit_temp[chosen_one] <= fit_arr_front[chosen_one] |
| 95 | + sum_origin_delta_fit += fit_arr_front[chosen_one] - fit_temp[chosen_one] |
| 96 | + end |
| 97 | + end |
| 98 | + end |
| 99 | + |
| 100 | + if sum_eb_delta_fit != 0.0 && sum_origin_delta_fit != 0.0 |
| 101 | + parameters.eb_hybrid_rate = sum_eb_delta_fit / (sum_eb_delta_fit + sum_origin_delta_fit) |
| 102 | + parameters.eb_hybrid_rate = clamp(parameters.eb_hybrid_rate, 0.0, 1.0) |
| 103 | + else |
| 104 | + parameters.eb_hybrid_rate = Constants.EB_HYBRID_RATE_INIT |
| 105 | + end |
| 106 | + |
| 107 | + return nothing |
| 108 | +end |
| 109 | + |
| 110 | +end # module AdaptationUtils |
| 111 | + |
0 commit comments