«[Figlio dell'uomo] Porgi l'orecchio e ascolta le parole di KGB
e applica la tua mente alla SUA istruzione
» Pv. 22,17

Qui si straparla di vari argomenti:
1. Il genere dei pezzi è segnalato da varie immagini, vedi Legenda
2. Istruzioni per i nuovi lettori (occasionali e non) qui
3. L'ultimo corto è questo

mercoledì 23 marzo 2016

Detto fatto (modellato)

Ieri (v. Amicizie stressanti) ho scritto che volevo programmare un modello su NetLogo per “verificare” una mia teoria sulle amicizie che potesse spiegare in maniera alternativa il fenomeno riportato nell'articolo Le persone intelligenti hanno meno amici.

Secondo la mia teoria per comunicare e socializzare è necessario raggiungere un terreno comune che renda possibile l'interazione: vuoi di interessi, vuoi di umorismo, vuoi di sensibilità, vuoi di paradigmi di pensiero.
Il peso (o la fatica o lo stress) di questo cambiamento necessario per l'interazione sociale non è però ripartito ugualmente fra le persone coinvolte: per raggiungere questo punto di incontro ideale è la persona più intelligente che deve fare la fatica maggiore per “scendere” al livello del proprio interlocutore perché questo, anche volendolo, non potrebbe “salire” più di tanto.
Il risultato è che, per le persone più intelligenti, lo sforzo fatto può essere maggiore del piacere che possono trarre dalla socializzazione.

Sulla base di questa idea ho creato il mio modello su NetLogo: fino a ieri però mi ero limitato a seguire un breve minicorso introduttivo e a giocare con diversi modelli già realizzati (*1).
Inoltre il linguaggio di programmazione di NetLogo non è generale ma estremamente specializzato per lo sviluppo di modelli con animazioni grafiche: per un programmatore esperto di linguaggi generici che non conosca NetLogo questo può comportare paradossalmente delle difficoltà. Questi cercherà infatti di realizzare alcune funzioni con strutture tradizionali, magari estremamente complesse, quando invece il linguaggio specializzato mette a disposizione un comando apposito che “magicamente” nasconde tutte le difficoltà; viceversa, a volte userà un comando complesso per poi non capire come fare a sfruttare alcuni particolari del risultato perché apparentemente inaccessibili.
Ieri mi sono imbattuto in due o tre casi di questo genere che mi hanno fatto perdere molto tempo...
Comunque alla fine, aiutandomi con la documentazione, un paio di esempi e, ovviamente, Google sono riuscito a far funzionare il mio modello.
Sono consapevole che, da un punto di vista tecnico, avrei potuto fare meglio (ho già delle idee per dei miglioramenti) ma come primo programma sono comunque soddisfatto.

Il mio modello è il seguente: inizialmente viene generato un numero N (deciso dall'utente grazie a una barra a scorrimento) di persone con un IQ variabile secondo una distribuzione normale di media 100 e deviazione standard 15 (in pratica il 95% delle persone avrà un intelligenza fra 70 e 130). Queste persone hanno una felicità iniziale pari a zero e nessun amico; successivamente vengono posizione casualmente su una griglia di 25 x 20 caselle.
Ogni turno tutti questi individui si muovono casualmente e, se si trovano abbastanza vicini fra loro, possono diventare amici.
Per determinare se si crea l'amicizia viene generata casualmente l'“affinità” della coppia pari a un valore casuale (uniforme) fra 0 e 50. Se l'affinità è maggiore di 30 allora si crea l'amicizia; ah! Ho messo anche un limite al numero di amicizie che un individuo può creare (controllabile con una barra a scorrimento).
Ogni 10 turni vengono considerate tutte le amicizie e la felicità dei singoli individui è aggiornata.
Per ogni amicizia un individuo guadagna 10 punti di felicità meno il “costo”, la fatica sociale, della relazione. Il costo è brutalmente calcolato nel seguente modo: 5 punti se si è l'individuo meno intelligente della relazione o, altrimenti, è pari alla differenza di intelligenza diviso quattro.

Chi è interessato ai dettagli tecnici può scaricare il mio modello QUI, ovviamente l'archivio deve essere poi aperto con NetLogo...

Il risultato, in tre passaggi, è il seguente:
Ah, il colore delle faccine indica l'intelligenza: <70 rosse, <85 gialle, <115 grigie, <130 verdi, >130 blu. Le facce tristi hanno una felicità <0, quelle neutrali da 0 a 100 e sorridenti quelle >100.
Inizialmente (anzi dopo 12 turni!), siccome tutti gli individui partono con felicità pari a zero, quasi tutte le faccine sono neutrali.

Dopo 63 turni, 3 dei 5 individui molto intelligenti (le facce blu) sono tristi mentre, ad occhio, conto solo altri due infelici fra gli intelligenti (le facce verdi).

Dopo 195 turni ormai quasi tutte le faccine sono felici o tristi (*2). Le uniche faccine tristi sono tre delle 5 blu: una faccia blu è felice, evidentemente ha amici abbastanza intelligenti, mentre una è ancora “indecisa”...

Ovviamente questo modello è molto rozzo e potrei fare un elenco lunghissimo delle cose che non mi piacciano, comprese regole e formule. Ma la domanda che dobbiamo porci è: ho dimostrato qualcosa con questo modello? O, meglio: qual è la sua validità?

In breve la risposta è “no, non ho dimostrato niente!” ma l'argomento è piuttosto complesso e vi ho riflettuto a lungo (beh, stanotte...) e sono giunto a varie conclusioni che ho tradotto in una serie di principi. Sono curioso di scoprire se regole analoghe alle mie saranno date esplicitamente nel corso di modellizzazione: per adesso, a un terzo della seconda lezione, la risposta è no.

Ecco i miei principi:
1. un modello per essere valido deve basarsi su regole non arbitrarie.
2. qualsiasi valore arbitrario deve essere modificabile dall'utente in maniera da potere analizzare le conseguenze di una sua variazione.
3. l'esecuzione del modello può confermare o no i nostri dati empirici: se non li conferma allora il modello è semplicemente errato (o almeno incompleto).
4. se però il principio 1 (e probabilmente anche il 2) non è rispettato allora ciò che il modello può dimostrare è solo la coerenza delle nostre regole. Ovvero che la nostra ipotesi non è in contraddizione con ciò che vuole spiegare.

Nel mio modello molte delle regole (formazione amicizie, costo relazione sociale, etc...) sono arbitrarie, basate solo sulla mia intuizione e non su dati sperimentali (sondaggi, ricerche psicosociali, etc...). Per questo motivo, il fatto che il mio modello confermi il dato sperimentale (cioè che le persone più intelligenti siano tristi con molti amicizie) significa solo che la mia teoria è coerente: potrebbe cioè essere corretta ma non lo dimostra.

Da notare che, in mancanza di informazioni più dettagliate, secondo questi miei principi, anche il modello di Schelling sulla segregazione (v. Corso sulla modellizzazione) non dimostra niente (se non la propria “coerenza”) in quanto le sue regole sono arbitrarie quanto le mie.
Al contrario ho visto almeno un paio di modelli con regole non arbitrarie: uno medico sulla diffusione dell'AIDS e uno biologico sull'evoluzione della popolazione di erba, pecore e lupi. Troppo lungo spiegarne i dettagli: scaricatevi NetLogo e dategli un'occhiata...

Conclusione: il mio modello è privo di interesse teorico ma è stato un utile esercizio di programmazione: comunque vedrò di aggiornarlo e migliorarlo via via che imparo nuove idee nel corso di modellizzazione...

PS: per curiosità le relazioni di amicizia nel mio modello (al turno 202): il colore delle relazioni indica l'intelligenza dell'individuo che ha “avviato” l'amicizia...

Nota (*1): NetLogo è fornito infatti di una libreria incorporata ricca di decine e decine di programmi con svariati tipi di simulazioni...
Nota (*2): in base alle regole del modello, dopo aver raggiunto il limite di amicizie, la felicità aumenterà o diminuirà in maniera costante ogni 10 turni...

Nessun commento:

Posta un commento