Arhn - архитектура программирования

Оптимизация нестандартных функций

У меня определена сложная функция (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);
}

Обратите внимание, что более важно найти лучший локальный оптимум, чем скорость алгоритма.

Существуют ли лучшие алгоритмы для такой оптимизации? У вас есть идеи, как улучшить этот дизайн?


Ответы:


1

Вы можете использовать симплексную оптимизацию. Он подходит именно для таких проблем, как у вас.

Если вы можете использовать Matlab хотя бы для прототипирования, попробуйте использовать fminsearch
http://www.mathworks.com/help/techdoc/ref/fminsearch.html

[1] Лагариас, Дж. К., Дж. А. Ридс, М. Х. Райт и П. Э. Райт, «Свойства сходимости симплексного метода Нелдера-Мида в малых размерностях», SIAM Journal of Optimization, Vol. 9 Номер 1, стр. 112-147, 1998.

05.01.2012
  • Нашел эту реализацию Java Apache Commons: commons .apache.org/math/apidocs/org/apache/commons/math/ 05.01.2012
  • @Grzenio, в таком случае, не могли бы вы принять ответ? :) 05.01.2012

  • 2

    Попробуйте что-нибудь классическое: http://en.wikipedia.org/wiki/Golden_section_search.

    05.01.2012
  • Кажется, этот работает только для одномодальных функций, а мой точно нет. 05.01.2012

  • 3

    Ваша проблема звучит так, как будто метаэвристика была бы идеальным решением. Вы можете попробовать метаэвристику, такую ​​как Стратегии эволюции (ES). ES был разработан для жестких мультимодальных вещественных векторных функций. ЭС и несколько реальных функций реализованы (Розенброк, Растригин, Экли и др.) в нашей программе HeuristicLab. Вы можете реализовать там свою функцию и оптимизировать ее. Вам не нужно добавлять много кода, и вы можете напрямую копировать из других функций, которые могут работать в качестве примеров для вас. Вам нужно будет перенести свой код на С#, но только оценку, другие части не нужны. Преимущество заключается в том, что если ваша функция реализована в HeuristicLab, вы также можете попытаться оптимизировать ее с помощью метода оптимизации роя частиц (PSO), генетического алгоритма или имитации отжига, которые также уже реализованы, и посмотреть, какой из них работает лучше всего. Вам нужно реализовать функцию оценки только один раз.

    Или вы просто просматриваете литературу в поисках статей по стратегиям эволюции и реализуете их самостоятельно. У IIRC Beyer есть реализации на его веб-сайте — они написаны для MatLab.

    05.01.2012
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..