Алгоритм многомерной оптимизации/поиска корней/что-то

У меня есть пять значений: A, B, C, D и E.

Учитывая ограничение A + B + C + D + E = 1 и пять функций F (A), F (B), F (C), F (D), F (E), мне нужно решить для A через E такое, что F(A) = F(B) = F(C) = F(D) = F(E).

Какой лучший алгоритм/подход использовать для этого? Мне все равно, придется ли мне писать это самому, я просто хотел бы знать, где искать.

EDIT: это нелинейные функции. Кроме того, они не могут быть охарактеризованы. Некоторые из них в конечном итоге могут быть интерполированы из таблицы данных.


comment
Вам нужно указать тип функций, которыми они являются. Линейные, квадратичные, экспоненциальные, тригонометрические и т.д.   -  person Lance Roberts    schedule 21.08.2009
comment
Вы должны давать своим функциям разные имена, чтобы не путать людей.   -  person starblue    schedule 21.08.2009
comment
Ваши значения A ... E также должны быть неотрицательными? Во многих задачах, когда значения ограничены суммой до 1, они также ограничены, чтобы не быть отрицательными. Есть ли другие ограничения?   -  person John D. Cook    schedule 21.08.2009
comment
По крайней мере известно, что функции имеют пересекающиеся диапазоны? Если, например, F_n(x) = atan(x) + 2n * pi, проблема не имеет решения.   -  person Richard Dunlap    schedule 21.08.2009


Ответы (8)


На этот вопрос нет общего ответа. Решателя, находящего решение любого уравнения, не существует. Как уже сказал Лэнс Робертс, вы должны знать больше о функциях. Всего несколько примеров

  • Если функции дважды дифференцируемы и вы можете вычислить первую производную, вы можете попробовать вариант Newton -Рафсон
  • Взгляните на Метод множителя Лагранжа для реализации ограничения.
  • Если функция F непрерывна (что, вероятно, так и есть, если это интерполянт), вы также можете попробовать метод деления пополам, который очень похож на бинарный поиск.

Прежде чем вы сможете решить проблему, вам действительно нужно больше узнать о функции, которую вы изучаете.

person Martijn    schedule 21.08.2009
comment
непрерывную функцию, не имеющую производной или слишком сложную, следует вычислять методом Бренца. Это комбинация параболической интерполяции и золотого деления пополам, ее можно адаптировать для минимальной и максимальной оптимизации, а код довольно прост, ознакомьтесь с ЧИСЛЕННЫМИ РЕЦЕПТАМИ на C для дальнейшего использования и методов оптимизации. - person nlucaroni; 25.08.2009
comment
Спасибо nlucaroni за предложение другого метода (о котором я не знал). - person Martijn; 26.08.2009
comment
@nlucaroni: метод Брента только 1D. И кстати, NR в C уже 15 лет. Подумайте об обновлении до (отличного) 3-го издания. - person Alexandre C.; 12.12.2010

Как уже писали другие, нам нужна дополнительная информация о функциях. Однако, учитывая это, мы все еще можем попытаться решить следующую релаксацию с помощью стандартного набора инструментов нелинейного программирования.

min k
ст.
A + B + C + D + E = 1
F1(A) - k = 0
F2(B) - k = 0
F3(C) -k = 0
F4(D) - k = 0
F5(E) -k = 0

Теперь мы можем решить это любым способом, например методом штрафа.

min k + mu*sum(Fi(x_i) - k)^2 st
A+B+C+D+E = 1

или прямой метод SQP или внутренней точки.

Более подробная информация, и я могу помочь посоветовать хороший метод.

m

person SplittingField    schedule 01.09.2009

Все функции монотонно возрастают вместе со своим аргументом. Кроме того, они не могут быть охарактеризованы. Подход, который сработал, оказался следующим:

1) Начните с A = B = C = D = E = 1/5
2) Вычислите от F1(A) до F5(E) и пересчитайте от A до E так, чтобы каждая функция равнялась этой сумме, деленной на 5 ( среднее значение).
3) Измените масштаб новых значений от A до E, чтобы все они в сумме равнялись 1, и повторно вычислите от F1 до F5.
4) Повторяйте, пока не будет получено удовлетворительное решение.

Он сходится на удивление быстро — всего за несколько итераций. Конечно, каждая итерация требует 5 корневых находок для шага 2.

person avalys    schedule 12.09.2009

Одно решение уравнений

A + B + C + D + E = 1
F(A) = F(B) = F(C) = F(D) = F(E)

состоит в том, чтобы взять A, B, C, D и E равными 1/5. Хотя не уверен, что ты этого хочешь...

Добавлено после комментария Джона (спасибо!)

Предполагая, что второе уравнение должно читаться как F1(A) = F2(B) = F3(C) = F4(D) = F5(E), я бы использовал метод Ньютона-Рафсона (см. ответ Мартейна). Вы можете удалить одну переменную, установив E = 1 - A - B - C - D. На каждом шаге итерации вам нужно решить систему 4x4. Самая большая проблема, вероятно, заключается в том, с чего начать итерацию. Один из вариантов — начать со случайной точки, выполнить несколько итераций и, если вы ничего не добились, выбрать другую случайную точку и начать заново.

Имейте в виду, что если вы действительно ничего не знаете о функции, то решения не должно быть.

person Jitse Niesen    schedule 21.08.2009
comment
Это решает вопрос, заданный вопросом, но не то, что он имел в виду. Похоже, проблема должна была сказать F_1 (A) + F_2 (B) + ... - person John D. Cook; 21.08.2009

ALGENCAN (часть TANGO) действительно хорош. Также есть привязки к Python.

http://www.ime.usp.br/~egbirgin/tango/codes.php - "общее нелинейное программирование, которое вообще не использует манипуляции с матрицами и, таким образом, способно решать чрезвычайно большие задачи с умеренным компьютерным временем. Общий алгоритм имеет расширенный лагранжев тип..."

http://pypi.python.org/pypi/TANGO%20Project%20-%20ALGENCAN/1.0

person Jonathan Graehl    schedule 21.08.2009

Погуглите OPTIF9 или ALLUNC. Мы используем их для общей оптимизации.

person Mike Dunlavey    schedule 01.09.2009

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

Прежде всего, вам нужно решить только A,B,C,D, потому что 1-E = A+B+C+D.

Во-вторых, у вас есть F(A) = F(B) = F(C) = F(D), тогда вы можете искать A. Как только вы получите F(A), вы можете решить B, C, D, если это возможно. Если не удается решить функции, вам нужно продолжить поиск каждой переменной, но теперь у вас есть ограниченный диапазон для поиска, потому что A+B+C+D ‹= 1.

Если ваш поиск является дискретным и конечным, приведенные выше оптимизации должны работать достаточно хорошо.

person leiz    schedule 01.09.2009

Я бы сначала попробовал Particle Swarm Optimization. Это очень легко реализовать и настроить. См. страницу Wiki для этого.

person Fantius    schedule 24.08.2009