Anni fa fui invitato a cena da un professore di matematica; a un certo punto la discussione si spostò sugli scacchi, dopo che mi ero lasciato sfuggire la tesi che nel giro di una ventina d’anni al massimo (era il 1990) un computer avrebbe battuto facilmente il campione del mondo (cosa che è poi successa realmente nel 1997). Toccato nel suo orgoglio di uomo, il professore era nettamente contrario, sostenendo che un ammasso di ferraglia mai avrebbe oscurato la genialità e la creatività di un campione di scacchi. Gli feci presente che comunque dietro c’erano sempre degli umani, cui in teoria bastava progettare un computer superveloce che analizzasse in modo rozzo, ma efficace tutte le mosse ragionevoli a livello di un semplice giocatore di livello nazionale. Per confutare la mia tesi il professore spostò la discussione sul fatto che una semplice potenza di calcolo non era in grado di sostituirsi all’intelligenza. Un computer non sarebbe mai stato in grado di comprendere i più difficili problemi matematici. Ancora una volta non seppi star zitto e gli spiegai che, grazie a un computer, un individuo mediamente dotato era in grado di trovare la soluzione di problemi che non possono certo essere risolti con eguale facilità da un mediocre conoscitore della matematica. Per esempio, l’estrazione della radice quadrata di 754.345 è banale per un programmatore che abbia a disposizione uno strumento informatico (basta una calcolatrice), mentre con carta e penna è durissima. Il professore ribatté che i miei esempi erano solo confinati al brutale calcolo. Eravamo al secondo piatto.
Poiché nel salotto era in bella vista l’ultimo modello di personal computer, dopo il caffè posi al professore una piccola sfida. Gli pregai di risolvere questo problema, mentre io con l’ausilio del computer avrei fatto altrettanto.
Due giocatori di basket si sfidano a una gara di tiri liberi. Il giocatore X ha una percentuale di tiro del 50%, il giocatore Y del 40%; i due contendenti tirano alternativamente. Vince chi riesce, a parità di tiri, ad andare in vantaggio sull’altro di 3 canestri. Che probabilità di vincere ha il giocatore X?
Accesi il computer e in una decina di minuti scrissi il programmino che risolveva il problema (la probabilità di vittoria di X è del 77%), mentre il professore stava ancora scavando nella sue nozioni di calcolo delle probabilità. La morale della favola è che innamorarsi della propria materia e farne una soluzione a ogni aspetto razionale dell’esistenza è molto riduttivo e semplicistico. La razionalità si sviluppa con mezzi diversi e complementari che consentono sempre la risposta più efficiente.
Il programma – Implementa il seguente ragionamento in Javascript. Ci sono due vettori a 5 elementi, quello della situazione attuale (ipres) e quello della situazione dopo il prossimo tiro (ipros). Relativamente al giocatore X ogni elemento contiene la probabilità di uno dei 5 possibili stati: vantaggio di +2, vantaggio di +1, parità, svantaggio (segno negativo) di 1, svantaggio di 2.
Ovviamente dopo il primo tiro il primo e il quinto elemento del vettore ipres sono nulli.
a1 rappresenta la probabilità che X aumenti di 1 il suo vantaggio (cioè che X abbia fatto canestro e Y abbia sbagliato); a2 rappresenta il fatto che lo scarto resti uguale (entrambi hanno sbagliato o entrambi hanno fatto canestro); a3 rappresenta la probabilità che il vantaggio di X diminuisca di 1 (cioè che abbia sbagliato mentre Y ha fatto canestro).
a1, a2, e a3 permettono di passare dallo stato presente a quello successivo. In questo passaggio si deve verificare che X o Y non vincano perché il loro scarto è diventato 3 (vittxparz e vittyparz). Sommando le probabilità parziali di vittoria (relative all’n-esimo tiro) si ottiene la probabilità di vittoria fino all’n-esimo tiro. Quando la somma delle due probabilità di vittoria è superiore a 0.999 il programma termina, considerando le probabilità definitive.
Si può ampliare il risultato del programma chiedendo le percentuali di tiro dei due giocatori (anziché fissarle a 0.5 e 0.4), verificando come varia la probabilità di vittoria. Si scopre che con una percentuale di tiro doppia (50 contro 25) la probabilità di vittoria del primo giocatore è del 96,3%!
- // la prima riga della matrice ipres contiene la situazione attuale:
- // le varie probabilità degli scarti fra i due giocatori
- //gli scarti possibili vanno da ik-1 a -(ik-1) e riempiono gli elementi di ipres dall’indice 1 a ic.
- // l’indice 0 della matrice non è usato
- // inizializzazione
- // lo scarto vincente è 3, la percentuale di tiro di X, ix, è il 50%, quella di Y, iy, è il 40%
- //ic sono gli elementi dello stato della partita, gli elementi della matrice degli scarti.
- var vittxparz
- var vittyparz
- var a1
- var a2
- var a3
- var pxtot
- var pytot
- var pfine
- var ik=3
- var x=0.5
- var y=0.4var ic=2*(ik-1)+1
- var ipres = new Array()
- var ipros = new Array()
- // il limite massimo del programma è uno scarto di 50 tiri
- // dopo un tiro la probabilità che lo scarto sia +1 è a1, che sia 0 è a2, che sia -1 (vantaggio Y) è a3
- a1=x*(1-y)
- a2=(1-x)*(1-y)+x*ya3=y*(1-x)
- for (icont=0;icont<ic+1;icont++) {
- ipres[icont]=0
- }
- // inizializzazione
- ipres[ik-1]=a1
- ipres[ik]=a2
- ipres[ik+1]=a3
- // si calcola la probabilità per il tiro successivo
- // matrice ipros
- pxtot=0
- pytot=0
- pfine=0
- while (pfine<0.999)
- {
- ipros[1]=ipres[1]*a2+ipres[2]*a1
- ipros[2]=ipres[2]*a2+ipres[1]*a3+ipres[3]*a1
- ipros[3]=ipres[3]*a2+ipres[2]*a3+ipres[4]*a1
- ipros[4]=ipres[4]*a2+ipres[3]*a3+ipres[5]*a1
- ipros[5]=ipres[5]*a2+ipres[4]*a3
- vittxparz=a1*ipres[1]
- vittyparz=a3*ipres[ic]
- pxtot=pxtot+vittxparz
- pytot=pytot+vittyparz
- pfine=pxtot+pytot
- // scambio: la partita non è finita e ipros diventa ipres
- for (icont=1; icont<ic+1;icont++)
- {
- ipres[icont]=ipros[icont]
- }
- }
- document.write(“Le due probabilità di vittoria sono: “+pxtot+” “+pytot)