Búsqueda aleatoria de óptimos con python

  • 0 Respuestas
  • 207 Vistas

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Andr0z

  • *
  • Colaborador
  • *
  • Mensajes: 15
  • Actividad:
    30%
  • Country: mx
  • Reputación 2
    • Yahoo Instant Messenger - Andr0z
    • Ver Perfil
    • Email

Búsqueda aleatoria de óptimos con python

  • en: Abril 01, 2020, 03:21:57 pm
La búsqueda aleatoria para óptimos es un método directo un tanto burdo. Dicho método evalúa tantas muestras sea posible de manera aleatoria, si la cantidad de muestras es suficiente, eventualmente el óptimo se localizará.

Veamos, para que éste método funcione se tiene que definir la región a evaluar R:[xl,xu]X[yl,yu](donde los subíndices l y u indican los limites inferior y superior respectivamente) , una vez definida dicha región se dispone a evaluar un generador de números aleatorios definido por:

p=pl+(pu-pl)r   Ec. 1


Donde r es un aleatorio entre 0 y 1.

Aplicando la ecuación 1 a nuestra región para y y x quedarían de la siguiente manera:

x=xl+(xu-xl)r   Ec. 2

y=yl+(yu-yl)r   Ec. 3


Teniendo nuestros generadores de números aleatorios tanto para y y x, veamos un ejemplo práctico de su aplicación:

Tenemos que encontrar el mínimo de nuestra función z=cosx*cosy*x*exp(x-(y2/exp(x2))) en nuestra región cuadrada dada por R(x,y):[-1.5,1.5]X[-1.5,1.5]. La superficie de nuestra región para z será:

     VISTA X,Z


     VISTA Y,Z

Ahora definiendo nuestros generadores y y x, con la región dada R, mediante las ecuaciones 2 y 3 nos quedaría:

x=-1.5+3r   Ec. 4

y=-1.5+3r   Ec. 5


Escribiendo el código en python 3.6.8 para iterar nuestras funciones y evaluar Z, quedaría de la siguiente forma:

Código: Python
  1. #definimos la función
  2. def f(x,y):
  3.     z=np.cos(x)*np.cos(y)*x*np.exp(x-np.power(y,2)/np.exp(np.power(x,2)))
  4.     return(z)
  5. #Xmax=0
  6. #Xmax=0
  7.  
  8. #inicializamos nuestras variables
  9. Xmin=0
  10. Ymin=0
  11. actf=0.1
  12. iteraciones=5000
  13.  
  14. #Aplicamos el metodo iterativo con nuestras funciones generador
  15. for n in range(iteraciones):
  16.     x=-1.5+3*np.random.rand() #Ec.4
  17.     y=-1.5+3*np.random.rand() #Ec.5
  18.     if f(x,y)<actf:  #f(x,y)>actf sentencia para maximos
  19.         actf=f(x,y)
  20.         Xmin=x
  21.         Ymin=y
  22.         print(str(actf))
  23.        
  24. print("El valor mínimo encontrado para "+str(iteraciones)+" iteraciones es f(x,y) es: "+str(actf))
  25. print("para los valores 'x': " +str(Xmin)+ " y el valor 'y': " +str(Ymin))
  26.  
  27. # superficie -------------------------------------------------------------    
  28. x=np.linspace(-1.5,1.5,35)
  29. y=np.linspace(-1.5,1.5,35)
  30. xmesh,ymesh=np.meshgrid(x,y)
  31. zmesh=np.cos(xmesh)*np.cos(ymesh)*xmesh*np.exp(xmesh-np.power(ymesh,2)/np.exp(np.power(xmesh,2)))
  32. fig=plt.figure()
  33. ax=fig.add_subplot(1,1,1,projection='3d')
  34. ax.plot_surface(xmesh,ymesh,zmesh,cstride=1,rstride=1)
  35. plt.show()
  36.  

Ejecutando nuestro código para 5000 iteraciones obtenemos:


Como vemos, el código nos genera una aproximación aceptable al mínimo de la región, comparado con gráfica de la vista XZ y YZ, si quisieramos encontrar el pico máximo de la región solo habría que cambiar la sentencia f(x,y)<actf a f(x,y)>actf en el if del  código en python.


« Última modificación: Abril 01, 2020, 03:41:55 pm por Andr0z »

 

[Código] Yardas a metros - Metros a yardas [Python]

Iniciado por LucaSthefano

Respuestas: 0
Vistas: 3218
Último mensaje Mayo 29, 2011, 01:27:34 am
por LucaSthefano
Python phpmyadmin "BruteForce"

Iniciado por linkgl

Respuestas: 2
Vistas: 4914
Último mensaje Agosto 19, 2011, 12:14:37 pm
por linkgl
Python Trojan - By "bLiNdFiR3"

Iniciado por d33k40

Respuestas: 1
Vistas: 4391
Último mensaje Abril 03, 2010, 11:01:59 pm
por Dharok
Python keylogger - by "bLiNdFiR3"

Iniciado por d33k40

Respuestas: 0
Vistas: 4259
Último mensaje Abril 07, 2010, 03:30:22 am
por d33k40
[Código] Entero / No Entero [Ejercicio - Python]

Iniciado por LucaSthefano

Respuestas: 3
Vistas: 3571
Último mensaje Enero 18, 2020, 02:43:53 am
por darkucla