优化不规则功能

时间:2012-01-05 10:07:37

标签: algorithm optimization mathematical-optimization

我有一个复杂的函数定义(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);
}

请注意,找到比算法速度更好的局部最优值更为重要。

有没有更好的算法来进行这种优化?您对如何改进此设计有任何想法吗?

3 个答案:

答案 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编写的。