Нахождение минимума функции с N переменными - PullRequest
0 голосов
/ 23 сентября 2018

Я пытаюсь написать алгоритм для определения минимума функции Розенброка , которая может иметь 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 переменных.

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

1 Ответ

0 голосов
/ 23 сентября 2018

Вы можете иметь рекурсивную функцию, подобную следующей (грубая C):

void rosenMin(int maxDims, int currDim, double[] values, double* currMin)
{
    if (currDims == maxDims) {
        double rosenVal = rosen(values); // You need to implement this
        if (rosenVal < *currMax) {
            *currMin = rosenVal;
        }
    } else {
        for (double c = INT_MIN; c <= INT_MAX; c += 0.1) {
            values[currDim + 1] = c;
            rosenMin(maxDim, currDim + 1, values, currMin);
        }
    }
}

double[] values = new double[N] { 0 }; // Check with C syntax how this'll look!
double min = INT_MAX
rosenMin(N, 1, values, &min);
...