IA con Python: búsqueda heurística

La búsqueda heurística juega un papel clave en la inteligencia artificial. En este capítulo, aprenderá en detalle al respecto.

Concepto de búsqueda heurística en IA

La heurística es una regla empírica que nos lleva a la solución probable. La mayoría de los problemas en inteligencia artificial son de naturaleza exponencial y tienen muchas soluciones posibles. No sabe exactamente qué soluciones son correctas y verificar todas las soluciones sería muy costoso.

Por lo tanto, el uso de la heurística reduce la búsqueda de soluciones y elimina las opciones incorrectas. El método de utilizar la heurística para dirigir la búsqueda en el espacio de búsqueda se llama Búsqueda heurística. Las técnicas heurísticas son muy útiles porque la búsqueda puede potenciarse cuando las usa.

Diferencia entre búsqueda no informada e informada

Hay dos tipos de estrategias de control o técnicas de búsqueda: desinformadas e informadas. Se explican en detalle como se indica aquí:

Búsqueda desinformada

También se denomina búsqueda ciega o estrategia de control ciego. Se llama así porque solo hay información sobre la definición del problema y no hay otra información adicional disponible sobre los estados. Este tipo de técnicas de búsqueda buscarían en todo el espacio de estados para obtener la solución. Breadth First Search (BFS) y Depth First Search (DFS) son ejemplos de búsqueda desinformada.

Búsqueda informada

También se le llama búsqueda heurística o estrategia de control heurístico. Se llama así porque hay información adicional sobre los estados. Esta información adicional es útil para calcular la preferencia entre los nodos secundarios para explorar y expandir. Habría una función heurística asociada con cada nodo. Best First Search (BFS), A *, Mean y Analysis son ejemplos de búsqueda informada.

Problemas de satisfacción de restricciones (CSP)

Restricción significa restricción o limitación. En IA, los problemas de satisfacción de restricciones son los problemas que deben resolverse bajo algunas restricciones. El enfoque debe estar en no violar la restricción al resolver tales problemas. Finalmente, cuando llegamos a la solución final, CSP debe obedecer la restricción.

Problema del mundo real resuelto mediante satisfacción de restricciones

Las secciones anteriores se ocuparon de la creación de problemas de satisfacción por restricciones. Ahora, apliquemos esto también a los problemas del mundo real. Algunos ejemplos de problemas del mundo real resueltos mediante la satisfacción de restricciones son los siguientes:

Resolver relación algebraica

Con la ayuda del problema de satisfacción de restricciones, podemos resolver relaciones algebraicas. En este ejemplo, intentaremos resolver una relación algebraica simplea*2 = b. Devolverá el valor dea y b dentro del rango que definiríamos.

Después de completar este programa de Python, podrá comprender los conceptos básicos para resolver problemas con satisfacción de restricciones.

Tenga en cuenta que antes de escribir el programa, necesitamos instalar el paquete Python llamado python-constraint. Puede instalarlo con la ayuda del siguiente comando:

pip install python-constraint

Los siguientes pasos le muestran un programa de Python para resolver relaciones algebraicas usando satisfacción de restricciones:

Importar el constraint paquete usando el siguiente comando -

from constraint import *

Ahora, crea un objeto de módulo llamado problem() como se muestra a continuación -

problem = Problem()

Ahora, defina variables. Tenga en cuenta que aquí tenemos dos variables ayb, y estamos definiendo 10 como su rango, lo que significa que obtuvimos la solución dentro de los primeros 10 números.

problem.addVariable('a', range(10))
problem.addVariable('b', range(10))

A continuación, defina la restricción particular que queremos aplicar a este problema. Observe que aquí estamos usando la restriccióna*2 = b.

problem.addConstraint(lambda a, b: a * 2 == b)

Ahora, crea el objeto de getSolution() módulo usando el siguiente comando -

solutions = problem.getSolutions()

Por último, imprima la salida con el siguiente comando:

print (solutions)

Puede observar la salida del programa anterior de la siguiente manera:

[{'a': 4, 'b': 8}, {'a': 3, 'b': 6}, {'a': 2, 'b': 4}, {'a': 1, 'b': 2}, {'a': 0, 'b': 0}]

Cuadrado mágico

Un cuadrado mágico es una disposición de números distintos, generalmente enteros, en una cuadrícula cuadrada, donde los números en cada fila y en cada columna, y los números en la diagonal, se suman al mismo número llamado "constante mágica" .

La siguiente es una ejecución paso a paso de un código Python simple para generar cuadrados mágicos:

Definir una función llamada magic_square, como se muestra a continuación -

def magic_square(matrix_ms):
   iSize = len(matrix_ms[0])
   sum_list = []

El siguiente código muestra el código para vertical de cuadrados:

for col in range(iSize):
   sum_list.append(sum(row[col] for row in matrix_ms))

El siguiente código muestra el código para horizantal of squares -

sum_list.extend([sum (lines) for lines in matrix_ms])

El siguiente código muestra el código para horizontal de cuadrados:

dlResult = 0
for i in range(0,iSize):
   dlResult +=matrix_ms[i][i]
sum_list.append(dlResult)
drResult = 0
for i in range(iSize-1,-1,-1):
   drResult +=matrix_ms[i][i]
sum_list.append(drResult)

if len(set(sum_list))>1:
   return False
return True

Ahora, dé el valor de la matriz y verifique la salida:

print(magic_square([[1,2,3], [4,5,6], [7,8,9]]))

Puede observar que la salida sería False ya que la suma no llega al mismo número.

print(magic_square([[3,9,2], [3,5,7], [9,1,6]]))

Puede observar que la salida sería True como la suma es el mismo número, es decir 15 aquí.