我有一个复杂的函数定义(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);
}
请注意,找到比算法速度更好的局部最优值更为重要。
有没有更好的算法来进行这种优化?您对如何改进此设计有任何想法吗?
答案 0 :(得分:2)
您可以使用基于Simplex的优化。它非常适合您的问题。
如果您可以使用Matlab,至少在原型设计方面,请尝试使用 fminsearch
http://www.mathworks.com/help/techdoc/ref/fminsearch.html
[1] Lagarias,J.C.,J。A. Reeds,M。H. Wright,and P. E. Wright,“Nelder-Mead Simplex Method in Low Dimensions的Convergence Properties,”SIAM Journal of Optimization,Vol。 9号1,第112-147页,1998年。
答案 1 :(得分:0)
答案 2 :(得分:0)
您的问题听起来好像元理论是理想的解决方案。您可以尝试使用Evolution Strategies (ES)等元启发式方法。 ES专为严格的多模真实矢量函数而设计。在我们的软件HeuristicLab中实现了ES和几个实际功能(Rosenbrock,Rastrigin,Ackley等)。您可以在那里实现自己的功能并对其进行优化。您不需要添加大量代码,您可以直接从其他可以作为示例的函数进行复制。您需要将代码移植到C#,但只有评估,不需要其他部分。 一个优点是,如果您在HeuristicLab中实现了您的功能,您还可以尝试使用粒子群优化(PSO)方法,遗传算法或模拟退火来优化它,这些方法也已经实现并且可以看到哪种方法效果最好。您只需要实现一次评估功能。
或者您只是扫描文献中的进化战略论文并自行重新实现。 IIRC Beyer在his website上实现了它 - 它是为MatLab编写的。