This is an automated email from the ASF dual-hosted git repository.

erans pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-math.git

commit 97462b1a1b6f64ab10e06db331d5b6762d979aab
Author: Gilles Sadowski <gillese...@gmail.com>
AuthorDate: Tue Aug 24 01:18:16 2021 +0200

    MATH-1622: Simulated annealing variant of "MultiDirectionalTransform".
---
 .../scalar/noderiv/MultiDirectionalTransform.java    | 20 +++++++++++++++-----
 1 file changed, 15 insertions(+), 5 deletions(-)

diff --git 
a/commons-math-legacy/src/main/java/org/apache/commons/math4/legacy/optim/nonlinear/scalar/noderiv/MultiDirectionalTransform.java
 
b/commons-math-legacy/src/main/java/org/apache/commons/math4/legacy/optim/nonlinear/scalar/noderiv/MultiDirectionalTransform.java
index 28d6c5d..b6f2a73 100644
--- 
a/commons-math-legacy/src/main/java/org/apache/commons/math4/legacy/optim/nonlinear/scalar/noderiv/MultiDirectionalTransform.java
+++ 
b/commons-math-legacy/src/main/java/org/apache/commons/math4/legacy/optim/nonlinear/scalar/noderiv/MultiDirectionalTransform.java
@@ -26,7 +26,7 @@ import 
org.apache.commons.math4.legacy.analysis.MultivariateFunction;
 import org.apache.commons.math4.legacy.optim.PointValuePair;
 
 /**
- * Multi-directional search method.
+ * <a 
href="https://scholarship.rice.edu/handle/1911/16304";>Multi-directional</a> 
search method.
  */
 public class MultiDirectionalTransform
     implements Simplex.TransformFactory {
@@ -71,7 +71,7 @@ public class MultiDirectionalTransform
     @Override
     public UnaryOperator<Simplex> create(final MultivariateFunction 
evaluationFunction,
                                          final Comparator<PointValuePair> 
comparator,
-                                         final DoublePredicate unused) {
+                                         final DoublePredicate sa) {
         return original -> {
             final PointValuePair best = original.get(0);
 
@@ -90,9 +90,19 @@ public class MultiDirectionalTransform
                                                           evaluationFunction);
                 final PointValuePair expandedBest = expandedSimplex.get(0);
 
-                return comparator.compare(reflectedBest, expandedBest) < 0 ?
-                    reflectedSimplex :
-                    expandedSimplex;
+                if (comparator.compare(expandedBest, reflectedBest) < 0) {
+                    return expandedSimplex;
+                } else if (sa != null &&
+                           sa.test(expandedBest.getValue() - 
reflectedBest.getValue())) {
+                    // SA hybridation branch (not part of Torczon's algorithm):
+                    // Create a simplex that contains
+                    //  * the reflected simplex's best point (since it is the
+                    //    best point overall), and
+                    //  * the expanded simplex's points (except its best 
point).
+                    return 
reflectedSimplex.replaceLast(expandedSimplex.asList(1, 
expandedSimplex.getSize()));
+                } else {
+                    return reflectedSimplex;
+                }
             } else {
                 // Compute the contracted simplex.
                 return original.shrink(sigma, evaluationFunction);

Reply via email to