私は複雑な関数を定義しました(4つの二重パラメータ)。私はそれが分化可能であるべきだと考える理由はない。私が知ることができるのは、(興味深い)最適化が見つかるハイパーキューブだけです。アルゴリズムの速度よりも優れた局所最適を見つけることがより重要であることを不規則関数の最適化
public static OptimalParameters brutForce(Model function) throws FunctionEvaluationException, OptimizationException {
System.out.println("BrutForce");
double startingStep = 0.02;
double minStep = 1e-6;
int steps = 30;
double[] start = function.startingGuess();
int n = start.length;
Comparer comparer = comparer(function);
double[] minimum = start;
double result = function.value(minimum);
double step = startingStep;
while (step > minStep) {
System.out.println("STEP step=" + step);
GridGenerator gridGenerator = new GridGenerator(steps, step, minimum);
double[] point;
while ((point = gridGenerator.NextPoint()) != null) {
double value = function.value(point);
if (comparer.better(value, result)) {
System.out.println("New optimum " + value + " at " + model.timeSeries(point));
result = value;
minimum = point;
}
}
step /= 1.93;
}
return new OptimalParameters(result, function.timeSeries(minimum));
}
private static Comparer comparer(Model model) {
if (model.goalType() == GoalType.MINIMIZE) {
return new Comparer() {
@Override
public boolean better(double newVal, double optimumSoFar) {
return newVal < optimumSoFar;
}
};
}
return new Comparer() {
@Override
public boolean better(double newVal, double optimumSoFar) {
return newVal > optimumSoFar;
}
};
}
private static interface Comparer {
boolean better(double newVal, double optimumSoFar);
}
注:
は私が機能を最適化するために、実際に原油と遅いアルゴリズムを書きました。このような最適化アルゴリズムはありますか?このデザインを改善する方法はありますか?
このApache Commons javaの実装が見つかりました:http://commons.apache.org/math/apidocs/org/apache/commons/math/optimization/direct/NelderMead.html – Grzenio
@Grzenio、その場合は考慮することができます答えを受け入れる? :) –