IA com Python - Pesquisa Heurística

A pesquisa heurística desempenha um papel fundamental na inteligência artificial. Neste capítulo, você aprenderá em detalhes sobre isso.

Conceito de pesquisa heurística em IA

Heurística é uma regra prática que nos leva à solução provável. A maioria dos problemas de inteligência artificial são de natureza exponencial e têm muitas soluções possíveis. Você não sabe exatamente quais soluções são corretas e verificar todas as soluções seria muito caro.

Assim, o uso de heurísticas restringe a busca por solução e elimina as opções erradas. O método de utilização de heurísticas para conduzir a busca no espaço de busca é denominado Busca Heurística. As técnicas heurísticas são muito úteis porque a pesquisa pode ser aumentada quando você as usa.

Diferença entre pesquisa não informada e informada

Existem dois tipos de estratégias de controle ou técnicas de busca: desinformadas e informadas. Eles são explicados em detalhes conforme fornecidos aqui -

Pesquisa Desinformada

Também é chamada de estratégia de busca cega ou controle cego. É assim chamado porque há informações apenas sobre a definição do problema e nenhuma outra informação extra está disponível sobre os estados. Esse tipo de técnica de pesquisa pesquisaria todo o espaço de estados para obter a solução. Pesquisa de amplitude inicial (BFS) e pesquisa de profundidade inicial (DFS) são os exemplos de pesquisa não informada.

Pesquisa Informada

Também é chamada de estratégia de busca heurística ou controle heurístico. Tem esse nome porque há algumas informações extras sobre os estados. Essas informações extras são úteis para calcular a preferência entre os nós filhos para explorar e expandir. Haveria uma função heurística associada a cada nó. Best First Search (BFS), A *, Mean e Analysis são os exemplos de pesquisa informada.

Problemas de satisfação de restrição (CSPs)

Restrição significa restrição ou limitação. Em IA, os problemas de satisfação de restrição são os problemas que devem ser resolvidos sob algumas restrições. O foco deve estar em não violar a restrição ao resolver tais problemas. Finalmente, quando chegarmos à solução final, o CSP deve obedecer à restrição.

Problema do mundo real resolvido por satisfação de restrição

As seções anteriores trataram da criação de problemas de satisfação de restrição. Agora, vamos aplicar isso também aos problemas do mundo real. Alguns exemplos de problemas do mundo real resolvidos pela satisfação de restrição são os seguintes -

Resolvendo a relação algébrica

Com a ajuda do problema de satisfação de restrição, podemos resolver relações algébricas. Neste exemplo, vamos tentar resolver uma relação algébrica simplesa*2 = b. Ele retornará o valor dea e b dentro do intervalo que definiríamos.

Depois de concluir este programa Python, você será capaz de entender os fundamentos da solução de problemas com satisfação de restrições.

Observe que antes de escrever o programa, precisamos instalar o pacote Python chamado python-constraint. Você pode instalá-lo com a ajuda do seguinte comando -

pip install python-constraint

As etapas a seguir mostram um programa Python para resolver a relação algébrica usando satisfação de restrição -

Importe o constraint pacote usando o seguinte comando -

from constraint import *

Agora, crie um objeto de módulo chamado problem() como mostrado abaixo -

problem = Problem()

Agora, defina as variáveis. Observe que aqui temos duas variáveis ​​aeb, e estamos definindo 10 como seu intervalo, o que significa que obtivemos a solução dentro dos primeiros 10 números.

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

A seguir, defina a restrição particular que queremos aplicar a este problema. Observe que aqui estamos usando a restriçãoa*2 = b.

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

Agora, crie o objeto de getSolution() módulo usando o seguinte comando -

solutions = problem.getSolutions()

Por último, imprima a saída usando o seguinte comando -

print (solutions)

Você pode observar a saída do programa acima da seguinte forma -

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

Quadrado mágico

Um quadrado mágico é um arranjo de números distintos, geralmente inteiros, em uma grade quadrada, onde os números em cada linha e em cada coluna, e os números na diagonal, somam todos o mesmo número chamado de "constante mágica" .

A seguir está uma execução gradual de código Python simples para gerar quadrados mágicos -

Defina uma função chamada magic_square, como mostrado abaixo -

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

O código a seguir mostra o código para a vertical dos quadrados -

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

O código a seguir mostra o código para o horizantal dos quadrados -

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

O código a seguir mostra o código para a horizontal dos quadrados -

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

Agora, dê o valor da matriz e verifique a saída -

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

Você pode observar que a saída seria False como a soma não corresponde ao mesmo número.

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

Você pode observar que a saída seria True como a soma é o mesmo número, isto é 15 aqui.