functionExecutor.compute(expansion);
// Check reflection acceptance
+ System.err.println("stepsize = " + step);
+ System.err.println("Simplex = " + simplex);
+ System.err.println("Reflection = " + reflection);
log.debug("Computing reflection");
functionExecutor.waitFor(reflection);
} else {
log.debug("Coordinate search unsuccessful, halving step.");
step /= 2;
+ simplexComputed = false;
reductionFallback++;
}
} else {
log.debug("Coordinate search not used, halving step.");
step /= 2;
+ simplexComputed = false;
reductionFallback++;
}
log.info("Finishing optimization at point " + simplex.get(0) + " value = " +
functionExecutor.getValue(simplex.get(0)));
+ log.info("Optimization statistics: " + getStatistics());
}
private void createReflection(List<Point> base, List<Point> reflection) {
Point current = base.get(0);
reflection.clear();
+
+ /* new = - (old - current) + current = 2*current - old */
for (int i = 1; i < base.size(); i++) {
- Point p = current.mul(2).sub(base.get(i));
+ Point p = base.get(i);
+ p = current.mul(2).sub(p);
reflection.add(p);
}
}
Point current = base.get(0);
for (int i = 1; i < base.size(); i++) {
Point p = base.get(i);
+
+ /* new = (old - current)*0.5 + current = old*0.5 + current*0.5 = (old + current)*0.5 */
+
p = p.add(current).mul(0.5);
base.set(i, p);
}