mirror of
https://github.com/boostorg/math.git
synced 2026-01-19 04:22:09 +00:00
Adjust parameter order in Differential Evolution algorithm
Problem Description The optimization module implements four algorithms: Differential Evolution, Algorithm jSO, Random Search, and Evolution Strategy with Covariance Matrix Adaptation. All these algorithms accept seven parameters: `cost_function`, `params`, `gen`, `value_to_reach`, `cancellation`, `current_minimum_cost`, and `queries`. Unfortunately, the Differential Evolution algorithm doesn't maintain parameter consistency with the other three algorithms: the last two parameters (`current_minimum_cost` and `queries`) are in reverse order compared to the other algorithms. This appears to be an unintentional oversight. Solution - Adjust the parameter order in the Differential Evolution algorithm to ensure consistency with other optimization algorithms - Update the algorithm documentation accordingly (No changes to example code were needed as the examples don't use these two parameters)
This commit is contained in:
@@ -53,8 +53,8 @@
|
||||
<span class="keyword">const</span> <span class="identifier">Func</span> <span class="identifier">cost_function</span><span class="special">,</span> <span class="identifier">differential_evolution_parameters</span><span class="special"><</span><span class="identifier">ArgumentContainer</span><span class="special">></span> <span class="keyword">const</span> <span class="special">&</span><span class="identifier">de_params</span><span class="special">,</span> <span class="identifier">URBG</span> <span class="special">&</span><span class="identifier">g</span><span class="special">,</span>
|
||||
<span class="identifier">std</span><span class="special">::</span><span class="identifier">invoke_result_t</span><span class="special"><</span><span class="identifier">Func</span><span class="special">,</span> <span class="identifier">ArgumentContainer</span><span class="special">></span> <span class="identifier">target_value</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">invoke_result_t</span><span class="special"><</span><span class="identifier">Func</span><span class="special">,</span> <span class="identifier">ArgumentContainer</span><span class="special">>>::</span><span class="identifier">quiet_NaN</span><span class="special">(),</span>
|
||||
<span class="identifier">std</span><span class="special">::</span><span class="identifier">atomic</span><span class="special"><</span><span class="keyword">bool</span><span class="special">></span> <span class="special">*</span><span class="identifier">cancellation</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">,</span>
|
||||
<span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special"><</span><span class="identifier">ArgumentContainer</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">invoke_result_t</span><span class="special"><</span><span class="identifier">Func</span><span class="special">,</span> <span class="identifier">ArgumentContainer</span><span class="special">>>></span> <span class="special">*</span><span class="identifier">queries</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">,</span>
|
||||
<span class="identifier">std</span><span class="special">::</span><span class="identifier">atomic</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">invoke_result_t</span><span class="special"><</span><span class="identifier">Func</span><span class="special">,</span> <span class="identifier">ArgumentContainer</span><span class="special">>></span> <span class="special">*</span><span class="identifier">current_minimum_cost</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">);</span>
|
||||
<span class="identifier">std</span><span class="special">::</span><span class="identifier">atomic</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">invoke_result_t</span><span class="special"><</span><span class="identifier">Func</span><span class="special">,</span> <span class="identifier">ArgumentContainer</span><span class="special">>></span> <span class="special">*</span><span class="identifier">current_minimum_cost</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">,</span>
|
||||
<span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special"><</span><span class="identifier">ArgumentContainer</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">invoke_result_t</span><span class="special"><</span><span class="identifier">Func</span><span class="special">,</span> <span class="identifier">ArgumentContainer</span><span class="special">>>></span> <span class="special">*</span><span class="identifier">queries</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">);</span>
|
||||
|
||||
<span class="special">}</span> <span class="comment">// namespaces</span>
|
||||
</pre>
|
||||
@@ -139,8 +139,8 @@
|
||||
<span class="identifier">std</span><span class="special">::</span><span class="identifier">invoke_result_t</span><span class="special"><</span><span class="identifier">Func</span><span class="special">,</span> <span class="identifier">ArgumentContainer</span><span class="special">></span> <span class="identifier">value_to_reach</span>
|
||||
<span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">invoke_result_t</span><span class="special"><</span><span class="identifier">Func</span><span class="special">,</span> <span class="identifier">ArgumentContainer</span><span class="special">>>::</span><span class="identifier">quiet_NaN</span><span class="special">(),</span>
|
||||
<span class="identifier">std</span><span class="special">::</span><span class="identifier">atomic</span><span class="special"><</span><span class="keyword">bool</span><span class="special">></span> <span class="special">*</span><span class="identifier">cancellation</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">,</span>
|
||||
<span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special"><</span><span class="identifier">ArgumentContainer</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">invoke_result_t</span><span class="special"><</span><span class="identifier">Func</span><span class="special">,</span> <span class="identifier">ArgumentContainer</span><span class="special">>>></span> <span class="special">*</span><span class="identifier">queries</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">,</span>
|
||||
<span class="identifier">std</span><span class="special">::</span><span class="identifier">atomic</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">invoke_result_t</span><span class="special"><</span><span class="identifier">Func</span><span class="special">,</span> <span class="identifier">ArgumentContainer</span><span class="special">>></span> <span class="special">*</span><span class="identifier">current_minimum_cost</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">)</span>
|
||||
<span class="identifier">std</span><span class="special">::</span><span class="identifier">atomic</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">invoke_result_t</span><span class="special"><</span><span class="identifier">Func</span><span class="special">,</span> <span class="identifier">ArgumentContainer</span><span class="special">>></span> <span class="special">*</span><span class="identifier">current_minimum_cost</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">,</span>
|
||||
<span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special"><</span><span class="identifier">ArgumentContainer</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">invoke_result_t</span><span class="special"><</span><span class="identifier">Func</span><span class="special">,</span> <span class="identifier">ArgumentContainer</span><span class="special">>>></span> <span class="special">*</span><span class="identifier">queries</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">)</span>
|
||||
</pre>
|
||||
<p>
|
||||
Parameters:
|
||||
@@ -171,12 +171,6 @@
|
||||
return the best result found up to that point. N.B.: Cancellation is not
|
||||
immediate; the in-progress generation finishes.
|
||||
</li>
|
||||
<li class="listitem">
|
||||
<code class="computeroutput"><span class="identifier">queries</span></code>: An optional vector
|
||||
to store intermediate results during optimization. This is useful for debugging
|
||||
and perhaps volume rendering of the objective function after the calculation
|
||||
is complete.
|
||||
</li>
|
||||
<li class="listitem">
|
||||
<code class="computeroutput"><span class="identifier">current_minimum_cost</span></code>: An
|
||||
optional atomic variable to store the current minimum cost during optimization.
|
||||
@@ -185,6 +179,12 @@
|
||||
the computation when the progress stagnates. Refer to Price, Storn, and
|
||||
Lampinen, Section 3.2 for caveats with this approach.
|
||||
</li>
|
||||
<li class="listitem">
|
||||
<code class="computeroutput"><span class="identifier">queries</span></code>: An optional vector
|
||||
to store intermediate results during optimization. This is useful for debugging
|
||||
and perhaps volume rendering of the objective function after the calculation
|
||||
is complete.
|
||||
</li>
|
||||
</ul></div>
|
||||
<p>
|
||||
Returns:
|
||||
|
||||
@@ -32,8 +32,8 @@ LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
const Func cost_function, differential_evolution_parameters<ArgumentContainer> const &de_params, URBG &g,
|
||||
std::invoke_result_t<Func, ArgumentContainer> target_value = std::numeric_limits<std::invoke_result_t<Func, ArgumentContainer>>::quiet_NaN(),
|
||||
std::atomic<bool> *cancellation = nullptr,
|
||||
std::vector<std::pair<ArgumentContainer, std::invoke_result_t<Func, ArgumentContainer>>> *queries = nullptr,
|
||||
std::atomic<std::invoke_result_t<Func, ArgumentContainer>> *current_minimum_cost = nullptr);
|
||||
std::atomic<std::invoke_result_t<Func, ArgumentContainer>> *current_minimum_cost = nullptr,
|
||||
std::vector<std::pair<ArgumentContainer, std::invoke_result_t<Func, ArgumentContainer>>> *queries = nullptr);
|
||||
|
||||
} // namespaces
|
||||
``
|
||||
@@ -73,8 +73,8 @@ ArgumentContainer differential_evolution(const Func cost_function,
|
||||
std::invoke_result_t<Func, ArgumentContainer> value_to_reach
|
||||
= std::numeric_limits<std::invoke_result_t<Func, ArgumentContainer>>::quiet_NaN(),
|
||||
std::atomic<bool> *cancellation = nullptr,
|
||||
std::vector<std::pair<ArgumentContainer, std::invoke_result_t<Func, ArgumentContainer>>> *queries = nullptr,
|
||||
std::atomic<std::invoke_result_t<Func, ArgumentContainer>> *current_minimum_cost = nullptr)
|
||||
std::atomic<std::invoke_result_t<Func, ArgumentContainer>> *current_minimum_cost = nullptr,
|
||||
std::vector<std::pair<ArgumentContainer, std::invoke_result_t<Func, ArgumentContainer>>> *queries = nullptr)
|
||||
``
|
||||
|
||||
Parameters:
|
||||
@@ -88,11 +88,11 @@ Parameters:
|
||||
See the referenced book for clear examples of when target values can be deduced.
|
||||
* `cancellation`: An optional atomic boolean to allow the user to stop the computation and gracefully return the best result found up to that point.
|
||||
N.B.: Cancellation is not immediate; the in-progress generation finishes.
|
||||
* `queries`: An optional vector to store intermediate results during optimization.
|
||||
This is useful for debugging and perhaps volume rendering of the objective function after the calculation is complete.
|
||||
* `current_minimum_cost`: An optional atomic variable to store the current minimum cost during optimization.
|
||||
This allows developers to (e.g.) plot the progress of the minimization over time and in conjunction with the cancellation argument allow halting the computation when the progress stagnates.
|
||||
Refer to Price, Storn, and Lampinen, Section 3.2 for caveats with this approach.
|
||||
* `queries`: An optional vector to store intermediate results during optimization.
|
||||
This is useful for debugging and perhaps volume rendering of the objective function after the calculation is complete.
|
||||
|
||||
Returns:
|
||||
|
||||
|
||||
@@ -86,8 +86,8 @@ ArgumentContainer differential_evolution(
|
||||
std::invoke_result_t<Func, ArgumentContainer> target_value =
|
||||
std::numeric_limits<std::invoke_result_t<Func, ArgumentContainer>>::quiet_NaN(),
|
||||
std::atomic<bool> *cancellation = nullptr,
|
||||
std::vector<std::pair<ArgumentContainer, std::invoke_result_t<Func, ArgumentContainer>>> *queries = nullptr,
|
||||
std::atomic<std::invoke_result_t<Func, ArgumentContainer>> *current_minimum_cost = nullptr) {
|
||||
std::atomic<std::invoke_result_t<Func, ArgumentContainer>> *current_minimum_cost = nullptr,
|
||||
std::vector<std::pair<ArgumentContainer, std::invoke_result_t<Func, ArgumentContainer>>> *queries = nullptr) {
|
||||
using Real = typename ArgumentContainer::value_type;
|
||||
using DimensionlessReal = decltype(Real()/Real());
|
||||
using ResultType = std::invoke_result_t<Func, ArgumentContainer>;
|
||||
|
||||
Reference in New Issue
Block a user