Минимизация f (x, y), где X и Y являются целыми числами

Пользователи когда-либо касаются Вашего кода? Если Вы не делаете только работы бэкенда, я рекомендую О Поверхности: Основы Пользовательского интерфейса Дизайн  — теперь в его третьем (связанном) выпуске. Я раньше думал, что мои пользователи были глупы, потому что они не "получили" мои интерфейсы. Я был, конечно, неправильно. О Поверхности изменил к лучшему меня.

6
задан Tim 24 July 2009 в 15:37
поделиться

8 ответов

Как вы определяете f (x, y)? Минимизация - сложная проблема, в зависимости от сложности вашей функции.

Генетические алгоритмы могут быть хорошим кандидатом.

Ресурсы:

Генетические алгоритмы в поиске, оптимизации и машинном обучении

Реализация генетических алгоритмов на C #

Simple C # GA

2
ответ дан 8 December 2019 в 17:25
поделиться

Have you looked at genetic algorithms? They are very, very good at finding minimums and maximums, while avoiding local minimum/maximums.

3
ответ дан 8 December 2019 в 17:25
поделиться

Здесь есть много, много решений. Фактически, существуют целые книги и учебные дисциплины, основанные на предмете. Я сейчас читаю отличный: Как это решить: современная эвристика .

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

Если вы знаете, что ваша функция квадратичная, вы можете использовать Ньютона-Гаусса , чтобы найти минимум в одном шаг. Генетический алгоритм может быть отличным инструментом общего назначения, или вы можете попробовать имитацию отжига, что менее сложно.

4
ответ дан 8 December 2019 в 17:25
поделиться

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

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

Если бы вы могли предоставить более подробную информацию, я мог бы предложить кое-что более конкретное.

1
ответ дан 8 December 2019 в 17:25
поделиться

Если это произвольная функция, нет удобного способа сделать это.

Предположим, у нас есть функция, определенная как:

f(x, y) = 0 for x==100, y==100
          100 otherwise

Как любой алгоритм может реально найти (100, 100) как минимум? Это может быть любая возможная комбинация значений.

Вы знаете что-нибудь о тестируемой функции?

2
ответ дан 8 December 2019 в 17:25
поделиться

Ответ Джона Скита правильный. Вам действительно нужна информация о f и его производных, даже если f везде непрерывно.

Самый простой способ оценить трудности того, что вы спрашиваете (минимизация f только для целых значений), - это просто подумать о f: R- > R (f - вещественная функция от вещественных чисел) одной переменной, которая делает большие колебания между отдельными целыми числами. Вы можете легко построить такую ​​функцию, чтобы не было никакой корреляции между локальными минимумами на действительной прямой и минимумами целых чисел, а также не было никакой связи с первой производной.

Для произвольной функции я не вижу другого выхода, кроме грубая сила.

1
ответ дан 8 December 2019 в 17:25
поделиться

Извините, форматирование было таким плохим раньше. Вот пример функции ошибок

double Error(x,y)
{
SetDeviceParams(x,y);
double a = QueryParamA();
double b = QueryParamB();
double c = QueryParamC();
double _fReturnable = 0;
if(a>=A_desired)
{
  _fReturnable+=(A_desired-a)*(A_desired-a);
}
if(b>=B_desired)
{
 _fReturnable+=(B_desired-b)*(B_desired-b);
}
if(c>=C_desired)
{
  _fReturnable+=(C_desired-c)*(C_desired-c);
}
return Math.sqrt(_fReturnable)
}
0
ответ дан 8 December 2019 в 17:25
поделиться

Итак, давайте посмотрим на вашу задачу с помощью математики. Все это при условии, что я понимаю ваша проблема полностью. Не стесняйтесь поправлять меня, если я ошибаюсь.

мы хотим минимизировать следующее:

\ sqrt ((a-a_desired) ^ 2 + (b-b_desired) ^ 2 + (c-c_desired) ^ 2)

или в других обозначениях || Pos (x - x_desired) || _2

где x = (a, b, c) и Pos (y) = max (y, 0) означает, что нам нужна «положительная часть» (это учитывает для ваших операторов if). Наконец, мы хотим ограничить себя к решениям, где x имеет целочисленное значение.

В отличие от вышеупомянутых плакатов, я не думаю, что генетические алгоритмы - это то, что вам вообще нужно.
На самом деле, я думаю, что решение намного проще (при условии, что я понимаю вашу проблему).

1) Запустите любую процедуру оптимизации для указанной выше функции. Это даст вам решение x ^ * = (a ^ *, b ^ *, c ^ *). Поскольку эта функция возрастает относительно к переменным, лучшее целочисленное решение, на которое вы можете надеяться, это (ceil (a ^ *), ceil (b ^ *), ceil (c ^ *)).

Теперь вы говорите, что вашу функцию, возможно, трудно вычислить. Есть инструменты для этого, которые не основаны на эвристике. Под названием Derivative-Free Оптимизация. Люди используют эти инструменты для оптимизации цели на основе моделирования (у меня даже слышал о случае, когда целевая функция основана на урожайности кукареки!)

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

1
ответ дан 8 December 2019 в 17:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: