Python R2


Un tipico ejemplo de Logica Borrosa o Disfusa en Python


¿Que es la logica borrosa o difusa?

La lógica borrosa o difusa se basa en lo relativo de lo observado asì. Este tipo de lógica toma dos valores aleatorios, pero contextualizados y referidos entre sí. Así, por ejemplo, una persona que mida 2 metros es claramente una persona alta, si previamente se ha tomado el valor de persona baja y se ha establecido en 1 metro. Ambos valores están contextualizados a personas y referidos a una medida métrica lineal.[http://es.wikipedia.org/wiki/Lógica_difusa]

Las lógicas difusas tratan de crear aproximaciones matemáticas en la resolución de ciertos tipos de problemas. Pretenden producir resultados exactos a partir de datos imprecisos, por lo cual son particularmente útiles en aplicaciones electrónicas o computacionales.

un buen link de logica difusa es: http://delta.cs.cinvestav.mx/~gmorales/ldifl/ldifl.html

Un ejemplo tipico en python

En esta oportunita quería mostrar una implementación simple de lógica difusa. Para eso acudí al típico ejemplo del ventilador y la pelota.

El script principal es

#!/usr/bin/env python
#Archivo: ventiladorBorroso.py

import logicaBorrosa
import random

def borroso(objY,posY):
	distancia = objY-posY

	centrado	=logicaBorrosa.fxTriangulo   (distancia,-10.0,0.0,10.0)
	cercaA		=logicaBorrosa.fxTrapezoide  (distancia,10.0,80.0,120.0,180.0)
	normalA     =logicaBorrosa.fxTrapezoide  (distancia,120.0,160.0,240.0,280.0)
	lejosA		=logicaBorrosa.fxGrado	     (distancia,240.0,300.0)
	cercaB		=logicaBorrosa.fxTrapezoide  (distancia,-180.0,-120.0,-80.0,-10.0)
	normalB		=logicaBorrosa.fxTrapezoide  (distancia,-280.0,-240.0,-160.0,-120.0)
	lejosB		=logicaBorrosa.fxGradoInversa(distancia,-300,-240)

	tmp =(centrado*9.8+cercaA*4.0+normalA*2.0+lejosA*1.0+cercaB*14.0+normalB*15.5+lejosB*18.0)
	div = (centrado+cercaA+normalA+lejosA+cercaB+normalB+lejosB)
	try:
		tmp /= div
	except:
		pass

	return tmp

gravedad = 9.81

velY = 0.0
posY= random.randrange(150.0,450.0)
ventilador = random.randrange(1.0,120.0)/10.0
objY=300

while True:
	caos = 0.0
	ventilador = borroso(objY,posY) # Llevamos a cabo el calculo borroso
	caos = (random.randrange(-50,50))/10.0
	velY = ((gravedad-ventilador+caos)*0.01)
	posY +=velY
	print posY

el modulo que contiene a todas las funciones de membresia es

#Archivo: logicaBorrosa.py
#
#Funciones de Membresia
#
def fxBool(x,y):
	"""
		Funcion de membresia boleana.
		Solo retorna dos valores 1,0
	"""
	if x<=y:
		return 0
	else:
		return 1

def fxBoolInversa(x,y):
	"""
		Funcion inverda de la funcion de membresia boleana.
		Solo retorna dos valores 1,0
	"""
	return 1-fxBool(x,y)

def fxGrado(x,y,z):
	"""
		Funcion de membresia de grado.
	"""
	if x<=y:
		return 0.0
	elif x>y and x<z:
		return (x/(z-y))-(y/(z-y))
	else:
		return 1.0

def fxGradoInversa(x,y,z):
	"""
		Funcion de membresia de grado.
	"""
	if x<=y:
		return 1.0
	elif x>y and x<z:
		return -(x/(z-y))+(z/(z-y))
	else:
		return 0.0

def fxTriangulo(x,x0,x1,x2):
	"""
		funcion de membresia Triangulo
	"""
	if x<=x0:
		return 0.0
	elif x>x0 and x<=x1:
		return (x/(x1-x0))-(x0/(x1-x0))
	elif x>x1 and x<=x2:
		return -(x/(x2-x1))+(x2/(x2-x1))
	else:
		return 0.0

def fxTrapezoide(x,x0,x1,x2,x3):
	"""
		funcion de membresia Trapezoide
	"""
	if x<=x0:
		return 0.0
	elif x>x0 and x<=x1:
		return (x/(x1-x0))-(x0/(x1-x0))
	elif x>x1 and x<=x2:
		return 1.0
	elif x>x2 and x<=x3:
		return -(x/(x3-x2))+(x3/(x3-x2))
	else:
		return 0.0

#
# Operadores Borroso
#
def OperadorAnd(x,y):
	return min(x,y)
def OperadorOR(x,y):
	return max(x,y)
def OperadorNOT(x):
	return 1-x

Saludos y espero que les guste y les sirva 🙂

Anuncios

9 comentarios to 'Un tipico ejemplo de Logica Borrosa o Disfusa en Python'

Subscribe to comments with RSS o TrackBack to 'Un tipico ejemplo de Logica Borrosa o Disfusa en Python'.

  1. Tordek said,

    Algunas notas varias…

    Adherite al PEP-8, por favor… queda más lindo y pitónico.

    x > b and x <= c lo podés cambiar por b < x <= c

    También te podría decir (no va con bronca, lo promento), “aprendé matemática”…

    (x/(x1-x0))-(x0/(x1-x0)) es (x - x0) / (x1 - x0)

    Y, bueno, si en tu primer if dijiste xy... el chequeo no es necesario (Aunque, no sé, según la filosofía de "explícito es mejor que implícito", puede ser apropiado.

    Y, no entendí qué es "el ejemplo de la pelota y el ventilador", ¿podrías explayarte?

    Más allá de eso, interesante artículo.

  2. Tordek said,

    Ah, y, caos = (random.randrange(100.0)-50)/10.0 es caos = random.randrange(-50,50) / 10.0.

  3. arturoeanton said,

    Hola tordek.
    la verdad que lo de la simplificación de las fx me gusta más que quede igual que esta en algunos libros de lógica difusa, que simplificado. Igual tienes razón que se puede sacar factor común.
    Lo del randrange Ya esta corregido la verdad que eso si me gusta mas de la manera que dijiste vos.
    Los códigos aveces no son pythonicos ya que los transcribo de código java que tengo escrito para el trabajo o algún trabajo practico de la facu.

    Bueno Saludos y muchas gracias por tu colaboración 😉

  4. Groznny said,

    Hola.
    Fijate que yo tampoco entendí muy bien que es eso del ventilador y la pelota. De hecho cuando lo corrí, solo salieron números, como tirandole al 290. Ojalá pudieras explicar que es lo que significa.
    Por cierto, me agrada mucho tu página, gracias por compartir con los demas.

  5. Arturo Elias Anton said,

    Hola Groznny a ver si puedo explicar un poco lo del ventilador y la pelota y esos números que tienden a 290.

    El ejemplo simula un ventilador que se encuentra en la base de un tubo y dentro del tubo una pelota de tergopol.

    Y dentro del tubo el ventilador va cambiando su potencia para que la pelota se mantenga en 290 más o menos.

    #!/usr/bin/env python
          | |
          | |
    290-> |*
          | |
          | |
         \ ^ /
          \^/
           -
    

    Digamos ese seria un grafico ASCII

    Si no se entendio te piedo que me vuelvas a preguntar.
    Saludos y espero que haya quedad claro 🙂

    • juan said,

      taria bacan si ubiera un grafico como ese mostrando a la pelotita que se mueve

  6. marcel said,

    buen dia, de donde salen las formulas, en la definición de las membresias?

  7. Santiago Ochoa said,

    Hola, muy bueno tu post. me interesa saber donde conseguiste la libreria logicaBorrosa y la Random. me ayudarias mucho si me la puedes compartir.

    santi.ochoa23@gmail.com

    • Arturo Elias Antón said,

      logicaborrosa es el archivo logicaborrosa.py y la random ya viene en python.


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s


A %d blogueros les gusta esto: