Я пытаюсь написать алгоритм для определения минимума функции Розенброка , которая может иметь N переменных.Когда N = 2, я легко могу понять это.Код, который я использую для N = 2:(это на (1,1)).Требуется немного времени, чтобы бежать, но это работает.Моя проблема для переменной N.Когда я думаю об этом, я вспоминаю, что мне понадобятся N повторяющихся структур.Вот код, как сейчас.Это не работает, но может дать некоторое представление о том, что я пытаюсь сделать:
//Calculates the value of the Rosenbrock function given n(the number of variables)
double rosen(double *x, int n){
double y;
for(int i = 0; i < n-1; i++)
{
y = y + 100*((x[i+1] - x[i]*x[i])*(x[i+1] - x[i]*x[i])) + (1 - x[i])*(1 - x[i]);
}
return y;
}
int main(void){
double *x;
//n is the number of variables and it may change
int n = 3;
x = (double*)malloc(n * sizeof(double));
double rosen(double *x, int n);
for(int i = 0; i < n; i++)
{
x[i] = INT_MIN;
}
//That's the part where I can't figure out how to compute all the possibilities, changing the value of the last variable between INT_MIN AND INT_MAX. Then this variable gets the value of INT_MIN again and I will sum 0.1 to the variable antecedent, and then do all the process again to the last variable. And so on for all the N variables.
for(int i = n - 1; i >= 0; i--)
{
while(x[i] < INT_MAX)
{
x[i] = x[i] + 0.1;
}
x[i] = INT_MIN;
}
Этот код выше, вероятно, содержит некоторые ошибки.Но единственное, что мне нужно, это изменить все значения N переменных.Итак, что я хочу сделать, это взять последнюю переменную и изменить ее значение между INT_MIN и INT_MAX, суммируя 0,1 (я знаю, что это действительно долгий путь).После этого эта переменная снова получит значение INT_MIN, а предшествующая переменная будет изменяться на +0.1.Затем последняя переменная снова изменится от INT_MIN до INT_MAX.И это произойдет для всех N переменных.
Это проблема, которую я пытаюсь решить, грубо заставить значение функции получить ее минимум.Если вы, ребята, дадите мне несколько советов или библиотеку, которая может вам помочь, я буду вам очень благодарен.