Este método evalúa en forma repetida la función mediante la selección aleatoria de valores de la variable independiente. Si un número suficiente de muestras se lleva a cabo, el óptimo será eventualmente localizado.
Dada una función f(x,y) en el dominio
acotado xÎ [xl, xu] y y Î [yl, yu], se genera un número aleatorio r
entre 0 y 1 y los valores de x y de y en el rango se calculan como:
x = xl + (xu – xl)*r
y = yl + (yu – yl)*r
Encontrar el máximo de la función f(x,y) = y –x
–2x2 - 2xy - y2 en el dominio acotado xÎ [-2, 2] y y Î [1, 3].
k |
x |
y |
f(x,y) |
0 |
0.00000 |
0.00000 |
0.00000 |
1 |
-0.84276 |
1.19252 |
1.20270 |
2 |
-0.84276 |
1.19252 |
1.20270 |
3 |
-0.84276 |
1.19252 |
1.20270 |
4 |
-0.84276 |
1.19252 |
1.20270 |
5 |
-0.84276 |
1.19252 |
1.20270 |
6 |
-0.84276 |
1.19252 |
1.20270 |
7 |
-0.84276 |
1.19252 |
1.20270 |
8 |
-0.84276 |
1.19252 |
1.20270 |
9 |
-0.84276 |
1.19252 |
1.20270 |
167 |
-0.92622 |
1.28268 |
1.22395 |
183 |
-1.11212 |
1.49897 |
1.22463 |
465 |
-1.04210 |
1.66243 |
1.23375 |
524 |
-0.96660 |
1.36514 |
1.23859 |
626 |
-0.97539 |
1.48462 |
1.24931 |
999 |
-0.97539 |
1.48462 |
1.24931 |
Implementación en Java
void
Busqueda_Aleatoria()
{
int i;
double r, x, y, max = 0, maxx = 0, maxy =
0, fx;
double xl = -2, xu = 2, yl = 1, yu = 3;
Random azar = new Random();
for(i=0; i<1000; i++)
{
r = azar.nextDouble();
x = xl + (xu - xl)*r;
r
= azar.nextDouble();
y = yl + (yu - yl)*r;
fx =
f(x,y);
if(fx
> max)
{
max = fx;
maxx = x;
maxy = y;
}
System.out.println(i + "\t "
+maxx + "\t " + maxy + "\t " + max );
}
}
double f(double x, double y)
{
return y -
x - 2*x*x - 2*x*y - y*y;
}