Búsqueda aleatoria de óptimos con python

  • 0 Respuestas
  • 308 Vistas

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

Desconectado Andr0z

  • *
  • Ex-Staff
  • *****
  • Mensajes: 16
  • Actividad:
    0%
  • 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: 3438
Último mensaje Mayo 29, 2011, 01:27:34 am
por LucaSthefano
[Código] Entero / No Entero [Ejercicio - Python]

Iniciado por LucaSthefano

Respuestas: 3
Vistas: 3848
Último mensaje Enero 18, 2020, 02:43:53 am
por darkucla
Python phpmyadmin "BruteForce"

Iniciado por linkgl

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

Iniciado por d33k40

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

Iniciado por d33k40

Respuestas: 0
Vistas: 4474
Último mensaje Abril 07, 2010, 03:30:22 am
por d33k40