Заморочка такая. Есть некая функция, которая зависит от N параметров, и даёт отклик - конкретное действительное число. Надо найти её минимум. Хотя бы локальный. Положим, она нелинейная, негладкая, и даже кое-где разрывная, и не везде определена. Это не беда. Где не определена, там тупо подставим какое-нибудь значение типа 1.0E100, то есть, заведомо не оптимальное. Тогда она может считаться определённой везде.
Как стартовые условия задаётся некий стартовый вектор параметров и вектор начальных шагов по кадому из них. Ну, оно понятно. Один параметр может выражаться в метрах, другой в километрах, третий в секундах, четвёртый в долларах, пятый в килограммах... Нет единой размерности, единых масштабов и т.п. По идее, даже есть какие-то ограничения, но они неизвестны (там функция не определена, и это имитируется очень большим значением за пределами области определения).
Я хотел засадить туда что-то типа метода наискорейшего спуска. То есть, прощупываем в окрестности начального вектора N+1 точек (или для пущей точности можно 2*N+1), вычисляем градиент, и идём против него. Там делаем однопараметрическую оптимизацию с автовыбором шага (с этим делом всё чоки-поки), потом - снова... Короче, пока не съедем в самую яму, где либо градиент оказывается 0, либо очередная итерация приводит нас почти в ту же самую точку (ну, или, скажем, меньше чем 0.1 соответствующего шага по каждому параметру от прежней такой точки). Даже если градиент ненулевой (а при конечном шаге он никогда нулевой не будет).
Но не тут-то было. Просто градиент оценивать - это галимо. Одни единицы - в одной размерности, другие - в другой... Если приращение функции отклика тупо делить на шаг, то получится, что по тем параметрам, от которых она зависит сильно, скорее всего и пойдёт градиент. Но потому и шаг по ним даётся маленький, что она там сильно нелинейная... Нормировать на шаг, который задан по каждому параметру (типа, вектор шагов)? Или как лучше? А то, получается какая-то не очень оптимальная оптимизация. Хотя, тоже, в принципе, должна работать. Но только очень медленно.
Алгоритм предполагается реализовать на Лиспе. Так что, кому чужд Лисп, лучше на пальцах.
--------------------
Теперь всё, я сюда больше не приду. Никогда.
|