Dallalgoritmo minimax allalgoritmo alfa-beta. MINIMAX int minimax(stato, livello) { if((livello == max_livello) || condizione_uscita(stato)) { CAMMINO.

Slides:



Advertisements
Presentazioni simili
INFORMATICA Altre Istruzioni di I/O
Advertisements

Funzioni In C++ le funzioni sono caratterizzate da un nome, dal tipo della variabile ritornata e da una lista di parametri (opzionali) La lista dei parametri.
INFORMATICA Algoritmi fondamentali
1 Automazione dellalgoritmo ricorsivo di permutazione eseguita da Mariano Melchiorri.
Calcolo del minimo comune multiplo (m.c.m.) Luigi Sante
Liste di Interi Esercitazione. Liste Concatenate Tipo di dato utile per memorizzare sequenze di elementi di dimensioni variabile Definizione tipicamente.
Le gerarchie di tipi.
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A CDL in Ingegneria Elettronica - A.A Strutture dati dinamiche.
Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A CDL in Ingegneria Gestionale (B)- A.A Programmazione Ricorsiva.
Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A CDL in Ingegneria Elettronica - A.A Strutture dati dinamiche.
Introduzione al linguaggio C
Fondamenti di Informatica
Algoritmo di MiniMax Questa presentazione è un chiaro esempio di come aggiungere i tagli Alfa-Beta per migliorare l’efficienza dell’algoritmo MiniMax.
La ricorsione Simulazione. Il Main /* Programma che usa una funzione ricorsiva*/ #include #define MAX_N 8 main() int valore, dato; printf(Introduci n:
PROGRAMMI DI RICERCA E ORDINAMENTO
Esercizi su alberi binari
Tail recursion: esempio
Allocazione dinamica della memoria
CORSO DI PROGRAMMAZIONE II
Algoritmi e Strutture Dati Alberi Binari di Ricerca.
Il linguaggio Fortran 90: 2. Istruzioni di Controllo
APPUNTI SUL LINGUAGGIO C
Modello dati ALBERO Albero: Albero: insieme di punti chiamati NODI e linee chiamate EDGES EDGE: linea che unisce due nodi distinti Radice (root): in una.
Modello dati ALBERO Albero: Albero: insieme di punti chiamati NODI e linee chiamate EDGES EDGE: linea che unisce due nodi distinti Radice (root): in una.
Esercizi su alberi binari
Selezione (=scelta) con “if-else”
1 Strutture Dinamiche Corso di Informatica A Vito Perrone.
Esercizi FUNZIONI Passaggio di parametri per valore, variabili e tipi locali e globali, prototipo.
La Programmazione Ricorsiva
Le funzioni.
Intelligenza Artificiale
Sorting: MERGESORT Vogliamo ordinare lista (a 1,…,a n ). 1.Dividi lista in 2 sottoliste aventi (quasi) la stessa dimensione: (a 1,a 3,a 5,…) e (a 2,a 4,…),
Calcolo del Massimo Comun Divisore
Radix-Sort(A,d) // A[i] = cd...c2c1
Cicli in Fortran I cicli consentono di eseguire una sequenza di istruzioni più di una volta due tipi: Cicli iterativi Cicli while.
Programmazione di Calcolatori
Programmazione di Calcolatori
Esercizi Liste.
Tail recursion: esempio
Esercizi su alberi binari di ricerca
ND-partizione (A) n   A  somma  0 M  1/2 (  a i ) for i  1 to n do S[i]  choice ({true, false}) if S[i] then somma  somma + a i if somma > M then.
Sessione live Testing. Esercizio Quesito 1 Soluzione 1.
Algoritmo di MiniMax Questa presentazione è un chiaro esempio di come aggiungere i tagli Alfa-Beta per migliorare l’efficienza dell’algoritmo MiniMax.
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 2 La ricorsione Corso di Informatica 2 a.a. 2003/04 Lezione 2.
alberi completamente sbilanciati
1 Un esempio con iteratore: le liste ordinate di interi.
#include void main() { int a,b,c,; float s, x,x1,x2,delta,alfa,beta; int num[3]; int i; printf("La forma classica dell'equazione di 2° grado è: a*x^2+b*x+c=0\n.
Flusso Statico e Dinamico 20/03/2006. Codice da Interpretare int valore; valore = funz(); if( valore > 0 ) { [codice1] } else { [codice2] } return valore;
Esercitazione su Vector. Permette di definire collezioni di dati generiche, che sono in grado di memorizzare elementi di ogni sottotipo di Object Definito.
Strutture di controllo Esercizi!. Utilizzare i metodi: I modi per poter richiamare un metodo, di una classe (ad esempio SavitchIn) sono due. 1) E’ sempre.
Informatica 4 Funzioni. FUNZIONE: definizione MATEMATICA Relazione (o applicazione) binaria tra due insiemi A e B che associa a ogni elemento di A un.
Sottoprogrammi e funzioni
Liste di Interi Esercitazione. Una variante Liste concatenate di Integers Non modificabile Costruttori per creare la lista vuota o un nodo Metodi d’istanza.
Liste Concatenate 11 Aprile E’ una delle strutture dati fondamentali in tutti i linguaggi di programmazione di alto livello Una Lista Concatenata.
Liste di Interi Esercitazione. IntList Lista di interi Una lista è una disposizione ordinata di elementi ( non in modo crescente-descrescente, ma per.
LIP: 8 Marzo 2005 Vettori. Abbiamo visto L’uso di Vector come alternativa all’uso di arrays Rivediamo l’esercizio dell’altra volta.
LIP: 2 Maggio 2008 Classi Astratte. Cos’e’ una Classe Astratta una classe astratta e’ un particolare tipo di classe permette di fornire una implementazione.
Dipartimento di Ingegneria dell’Informazione Università degli Studi di Parma Intelligenza Artificiale Risoluzione dei Problemi (parte 4) Agostino Poggi.
LIP: 11 Maggio 2007 Classi Astratte. Cos’e’ una Classe Astratta una classe astratta e’ un particolare tipo di classe permette di fornire una implementazione.
Liste Concatenate 28 Marzo Avviso Martedi’ 4 Aprile: Verifica di LIP Per iscriversi (obbligatorio) inviare un e- mail entro venerdi’ 31 Marzo a.
1 Un esempio con iteratore: le liste ordinate di interi.
Master Bioinformatica 2002: Visite di Grafi Algoritmi di visita Scopo: visitare tutti i vertici di un grafo per scoprirne proprietà di vario tipo. Alcune.
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
EVENTI Gli eventi sono delle azioni che possono essere identificate da javascript. 1 - onMouseOver, che viene messo in atto quando l'utente fa scorrere.
Corso di Algoritmi e Strutture Dati APPUNTI SUL LINGUAGGIO C Esercizi su Alberi.
6/11/01Ordinamento 1 Un esempio di algoritmi: ordinamento.
10. Programmazione Ricorsiva Ing. Simona Colucci Informatica - CDL in Ingegneria Industriale- A.A
13. Strutture dati dinamiche Ing. Simona Colucci Informatica - CDL in Ingegneria Industriale- A.A
1 MODULO STRUTTURE DATI FONDAMENTALI: Strutture dinamiche classe 4° INDUSTRIALE INFORMATICA Focus on.
Transcript della presentazione:

Dallalgoritmo minimax allalgoritmo alfa-beta

MINIMAX int minimax(stato, livello) { if((livello == max_livello) || condizione_uscita(stato)) { CAMMINO = NULL; return(statica(stato)); } else { lista_figli = genera_figli(stato); if(lista_figli == NULL)// Lista vuota, non ci sono figli { CAMMINO = NULL; return(VALORE_DI_FALLIMENTO); }

if((livello % 2) == 0)// livello e Giocatore sono in corrispondenza { max = - ; for each figlio in lista_figli { valutazione = minimax(figlio, livello + 1); if(valutazione > max) { max = valutazione; migliore = figlio; } inserisci(migliore, CAMMINO); return(max); }

else { min = + ; for each figlio in lista_figli { valutazione = minimax(figlio, livello + 1); if(valutazione < min) { min = valutazione; migliore = figlio; } inserisci(migliore, CAMMINO); return(min); }

Considerazioni Se a un livello superiore si sta minimizzando, a un livello inferiore in cui si massimizza è inutile continuare la ricerca se si è ottenuto un max provvisorio superiore o uguale ad una soglia_max, coincidente con il minimo del livello superiore. Se a un livello superiore si sta massimizzando, a un livello inferiore in cui si minimizza è inutile continuare la ricerca se si è ottenuto un min provvisorio inferiore o uguale ad una soglia_min, coincidente con il massimo del livello superiore.

ALFA-BETA provvisorio int minimax(stato, livello) { if((livello == max_livello) || condizione_uscita(stato)) { CAMMINO = NULL; return(statica(stato)); } else { lista_figli = genera_figli(stato); if(lista_figli == NULL)// Lista vuota, non ci sono figli { CAMMINO = NULL; return(VALORE_DI_FALLIMENTO); }

if((livello % 2) == 0)// livello e Giocatore sono in corrispondenza { max = - ; finito = FALSE; for each figlio in lista_figli && !finito { valutazione = minimax(figlio, livello + 1); if(valutazione > max) { max = valutazione; migliore = figlio; } if(max soglia_max)// a un livello superiore, si sta minimizzando e si è già raggiunto il valore soglia_max (coincide con ) { finito = TRUE; max = soglia_max; } inserisci(migliore, CAMMINO); return(max); }

else { min = + ; finito = FALSE; for each figlio in lista_figli && !finito { valutazione = minimax(figlio, livello + 1); if(valutazione < mim) { min = valutazione; migliore = figlio; } if(valutazione soglia_min)// a un livello superiore si sta massimizzando e si è già raggiunto il valore soglia_min (coincide con α) { finito = TRUE; min = soglia_min; } inserisci(migliore, CAMMINO); return(min); }

Ulteriori considerazioni soglia_min la chiamiamo alfa, soglia_max la chiamiamo beta: devono essere passate come parametri. La variabile max può essere inizializzata con alfa (che in fase di prima chiamata dovrà essere posta a - e che via via riflette il livello di minimo raggiunto). La variabile min può essere inizializzata con beta (che in fase di prima chiamata dovrà essere posta a + e che via via riflette il livello di massimo raggiunto).

ALFA-BETA seconda approssimazione int minimax(stato, livello, alfa, beta) { if((livello == max_livello) || condizione_uscita(stato)) { CAMMINO = NULL; return(statica(stato)); } else { lista_figli = genera_figli(stato); if(lista_figli == NULL)// Lista vuota, non ci sono figli { CAMMINO = NULL; return(VALORE_DI_FALLIMENTO); }

if((livello % 2) == 0)// livello e Giocatore sono in corrispondenza { max = alfa; finito = FALSE; for each figlio in lista_figli && !finito { valutazione = minimax(figlio, livello + 1, alfa, beta); if(valutazione > max) { max = valutazione; migliore = figlio; } if(max beta)// a un livello superiore, si sta minimizzando e si è già raggiunto il valore soglia_max (coincide con ) { finito = TRUE; max = beta; } inserisci(migliore, CAMMINO); return(max); }

else { min = beta; finito = FALSE; for each figlio in lista_figli && !finito { valutazione = minimax(figlio, livello + 1, alfa, beta); if(valutazione < mim) { min = valutazione; migliore = figlio; } if(min alfa)// a un livello superiore si sta massimizzando e si è già raggiunto il valore soglia_min (coincide con α) { finito = TRUE; min = alfa; } inserisci(migliore, CAMMINO); return(min); }

Considerazioni finali Visto luso che se ne fa e i valori assunti, la variabile max può essere chiamata direttamente alfa e min direttamente beta. Lalgoritmo finale è il seguente:

ALFA-BETA definitivo int alfa_beta(stato, livello, alfa, beta) { if((livello == max_livello) || condizione_uscita(stato)) { CAMMINO = NULL; return(statica(stato)); } else { lista_figli = genera_figli(stato); if(lista_figli == NULL)// Lista vuota, non ci sono figli { CAMMINO = NULL; return(VALORE_DI_FALLIMENTO); }

if((livello % 2) == 0)// livello e Giocatore sono in corrispondenza { finito = FALSE; for each figlio in lista_figli && !finito { valutazione = alfa_beta(figlio, livello + 1, alfa, beta); if(valutazione > alfa) { alfa = valutazione; migliore = figlio; } if(alfa beta)// a un livello superiore, si sta minimizzando e si è già raggiunto il valore soglia_max (coincide con ) { finito = TRUE; alfa = beta; } inserisci(migliore, CAMMINO); return(alfa); }

else { finito = FALSE; for each figlio in lista_figli && !finito { valutazione = alfa_beta(figlio, livello + 1, alfa, beta); if(valutazione < beta) { beta = valutazione; migliore = figlio; } if(beta alfa)// a un livello superiore si sta massimizzando e si è già raggiunto il valore soglia_min (coincide con α) { finito = TRUE; beta = alfa; } inserisci(migliore, CAMMINO); return(beta); }