AI con Python - Ricerca euristica

La ricerca euristica gioca un ruolo chiave nell'intelligenza artificiale. In questo capitolo imparerai in dettaglio a riguardo.

Concetto di ricerca euristica nell'IA

L'euristica è una regola pratica che ci porta alla probabile soluzione. La maggior parte dei problemi nell'intelligenza artificiale sono di natura esponenziale e hanno molte possibili soluzioni. Non sai esattamente quali soluzioni sono corrette e controllare tutte le soluzioni sarebbe molto costoso.

Pertanto, l'uso dell'euristica restringe la ricerca di soluzioni ed elimina le opzioni sbagliate. Il metodo di utilizzo dell'euristica per guidare la ricerca nello spazio di ricerca è chiamato Ricerca euristica. Le tecniche euristiche sono molto utili perché la ricerca può essere potenziata quando le usi.

Differenza tra ricerca non informata e informata

Esistono due tipi di strategie di controllo o tecniche di ricerca: disinformati e informati. Sono spiegati in dettaglio come indicato qui -

Ricerca disinformata

Si chiama anche ricerca cieca o strategia di controllo cieco. È denominato così perché sono disponibili solo informazioni sulla definizione del problema e non sono disponibili altre informazioni aggiuntive sugli stati. Questo tipo di tecniche di ricerca cercherà in tutto lo spazio degli stati per ottenere la soluzione. Breadth First Search (BFS) e Depth First Search (DFS) sono gli esempi di ricerca non informata.

Ricerca informata

È anche chiamata ricerca euristica o strategia di controllo euristico. È chiamato così perché ci sono alcune informazioni extra sugli stati. Queste informazioni aggiuntive sono utili per calcolare la preferenza tra i nodi figlio da esplorare ed espandere. Ci sarebbe una funzione euristica associata a ciascun nodo. Best First Search (BFS), A *, Mean e Analysis sono gli esempi di ricerca informata.

Problemi di soddisfazione dei vincoli (CSP)

Vincolo significa restrizione o limitazione. Nell'IA, i problemi di soddisfazione dei vincoli sono i problemi che devono essere risolti sotto alcuni vincoli. L'obiettivo deve essere quello di non violare il vincolo durante la risoluzione di tali problemi. Infine, quando raggiungiamo la soluzione finale, CSP deve obbedire alla restrizione.

Problema del mondo reale risolto dalla soddisfazione dei vincoli

Le sezioni precedenti hanno affrontato la creazione di problemi di soddisfazione dei vincoli. Ora, applichiamo questo anche ai problemi del mondo reale. Alcuni esempi di problemi del mondo reale risolti dalla soddisfazione dei vincoli sono i seguenti:

Risoluzione di relazioni algebriche

Con l'aiuto del problema della soddisfazione dei vincoli, possiamo risolvere le relazioni algebriche. In questo esempio, proveremo a risolvere una semplice relazione algebricaa*2 = b. Restituirà il valore dia e b all'interno dell'intervallo che definiremmo.

Dopo aver completato questo programma Python, sarai in grado di comprendere le basi per risolvere i problemi con soddisfazione dei vincoli.

Nota che prima di scrivere il programma, dobbiamo installare il pacchetto Python chiamato python-constraint. Puoi installarlo con l'aiuto del seguente comando:

pip install python-constraint

I seguenti passaggi mostrano un programma Python per risolvere la relazione algebrica usando la soddisfazione dei vincoli -

Importa il file constraint pacchetto utilizzando il seguente comando:

from constraint import *

Ora, crea un oggetto del modulo denominato problem() come mostrato di seguito -

problem = Problem()

Ora, definisci le variabili. Nota che qui abbiamo due variabili aeb e stiamo definendo 10 come loro intervallo, il che significa che abbiamo ottenuto la soluzione entro i primi 10 numeri.

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

Successivamente, definisci il particolare vincolo che vogliamo applicare a questo problema. Osserva che qui stiamo usando il vincoloa*2 = b.

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

Ora, crea l'oggetto di getSolution() modulo utilizzando il seguente comando:

solutions = problem.getSolutions()

Infine, stampa l'output utilizzando il seguente comando:

print (solutions)

È possibile osservare l'output del programma sopra come segue:

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

Magic Square

Un quadrato magico è una disposizione di numeri distinti, generalmente interi, in una griglia quadrata, dove i numeri in ogni riga, in ogni colonna e i numeri nella diagonale si sommano tutti allo stesso numero chiamato "costante magica" .

Quanto segue è un'esecuzione graduale di un semplice codice Python per la generazione di quadrati magici:

Definisci una funzione denominata magic_square, come mostrato di seguito -

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

Il codice seguente mostra il codice per la verticale dei quadrati:

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

Il codice seguente mostra il codice per l'orizzontale dei quadrati:

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

Il codice seguente mostra il codice per l'orizzontale dei quadrati:

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

Ora, dai il valore della matrice e controlla l'output -

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

Puoi osservare che l'output sarebbe False poiché la somma non è fino allo stesso numero.

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

Puoi osservare che l'output sarebbe True poiché la somma è lo stesso numero, cioè 15 Qui.