Мне было интересно, есть ли у кого-нибудь предложения по минимизации функции f (x, y), где x и y - целые числа. Я исследовал множество методов минимизации и оптимизации, таких как BFGS и другие из GSL, а также вещи из Numerical Recipes. До сих пор я пытался внедрить несколько разных схем. Первый работает, выбирая направление наибольшего спуска f(x+1,y),f(x-1,y),f(x,y+1),f(x,y-1) и следуя этому направлению с минимизацией строки. Я также пробовал использовать симплексный метод спуска (Nelder-Mead). Оба метода застревают далеко от минимума. Оба они работают с более простыми функциями, такими как нахождение минимума параболоида, но я думаю, что оба, и особенно первый, предназначены для функций, где x и y являются действительными значениями (двойными). Еще одна проблема заключается в том, что мне нужно вызывать f(x,y) как можно меньше раз. Он взаимодействует с внешним оборудованием, и каждый вызов занимает пару секунд. Любые идеи для этого были бы очень признательны.
Вот пример функции ошибки. Извините, что не опубликовал это раньше. Эта функция занимает пару секунд для оценки. Кроме того, информация, которую мы запрашиваем с устройства, не добавляет к ошибке, если она ниже желаемого значения, только если она выше
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)
}