• Non ci sono risultati.

Matrici di memoria e passi computazionali

Simulazione della genesi ed evoluzione di un sistema economico con jES Open Foundation

3.9 Matrici di memoria e passi computazionali

Come in jES, anche in jES OF è possibile inserire, all’interno delle ricette, passi computazionali, cioè richiami a metodi che consentono di effettuare valutazioni e previsioni di vario tipo e che operano sulla base di dati contenuti in matrici di memoria61. Le matrici possono essere generali o specifiche per ciascuna unità e sono create nel Model con riferimento ai file presenti nelle cartelle unitData di ciascuno

61 Il numero massimo di matrici di memoria che si possono impiegare senza modificare il codice di programmazione è 10.

strato62: i file che contengono i dati relativi alle dimensioni delle matrici sono denominati memoryMatrixes.txt e sono riconosciuti dal programma attraverso un controllo dell’intestazione della prima riga63.

La lettura avviene attraverso la classe myReader, in cui è gestito anche il caso di mancanza di dati, mentre nel Model è prevista una serie di controlli per verificare che la sequenza ordinata di valori che corrisponde a ciascuna riga del file di testo (txt) sia formata da numeri interi non negativi (dal momento che si riferiscono alle dimensioni delle matrici) e che la numerazione progressiva delle matrici parta dallo zero64. Il contenuto delle matrici può essere inserito dall’esterno utilizzando il file memoryMatrixContents.txt collocato all’interno della cartella

UnitData di ciascuno strato: anche nel caso di questo file ogni operazione di get o

set è assistita da una serie di controlli sulla validità dei numeri utilizzati per indicare

lo strato, la riga e la colonna.

Per quanto riguarda le matrici generali, i vari strati della simulazione dovranno copiare i dati dalle matrici dello strato zero del modello. Le matrici pubbliche delle unità, identificate dal codice –1, avranno dimensioni 10x10 e saranno inizialmente nulle.

Le capacità computazionali di jES OF sono legate alla presenza della classe

ComputationalAssembler, che eredita le proprietà della classe ComputationalAssemblerBasic e crea, per ciascuna unità, un’instance che effettua

le computazioni65. Se nel processare il contenuto di una ricetta si rileva la presenza di un passo computazionale, terminata l’esecuzione della fase produttiva che lo segue, non si potrà procedere prima che il passo sia stato inserito nella lista d’attesa del

62 Gli strati a cui ci si riferisce corrispondono ai Model, mentre la differenziazione degli strati relativa agli ordini è presente in jES, ma non è utilizzata in jES OF (sensitive=false, cioè le matrici non sono layer sensitive con riferimento agli ordini).

63 Il cui contenuto (number(from_0_ordered)_rows_cols) è tassativo.

64 Il valore indica la posizione della matrice nel vettore, specifico per ciascuno strato, attraverso cui le matrici sono gestite nei Model.

65 I dati relativi alla computazione da effettuare sono trattati dalla classe

ComputationalSpecificationSet che gestisce gli indirizzi ed il numero delle matrici di memoria da

utilizzare, il tipo di computazione da effettuare e l’ ordine a cui il passo computazionale fa riferimento.

ComputationalAssembler e sia stato eseguito66: sarà poi il Model a controllare lo stato di avanzamento delle computazioni ed eventualmente a consentire agli ordini di procedere (checkingComputationsAndFreeingOrders).

Figura 3.15 – Il file relativo alle dimensioni delle matrici di memoria

Figura 3.16 – Il contenuto delle matrici di memoria nel file memoryMatrixContents.txt

I passi computazionali possono essere identificati con codici compresi fra i valori 1001 e 1999 ed hanno una struttura che, nella versione external format cioè

human readable, comprende una lettera c che indica che i valori successivi

all’interno della ricetta sono riferiti al passo computazionale; segue l’indicazione del

66 Il passo computazionale è eseguito al termine dell’ultimo tick richiesto dalla fase produttiva che lo segue.

codice del passo (es. 1101), il numero di matrici di memoria da impiegare (es.2) e la specificazione dei codici delle matrici necessarie (es. 1 e 3)67.

Passo computazionale 1101 : c 1101 2 1 3

Passo computazionale 1101 inserito all’interno di una ricetta:

1 s 1 c 1101 2 1 3 7 s 1

preceduto dal passo 1 della durata di un tick (1 s 1) e seguito dal passo 7 della durata di un tick (7 s 1)

Figura 3.17 – L’inserimento del passo computazionale 1101 in una ricetta

Un caso particolare nell’uso dei passi computazionali è rappresentato dalle ricette che lanciano ricette, che possono essere impiegate attraverso il passo c1002: quest’ultimo lancia la ricetta il cui codice è contenuto nella prima posizione (riga 0, colonna 0) della matrice che gli è stata passata. Per il funzionamento di questo sistema ramificato di rimandi ad altre ricette si possono impiegare matrici con un’unica casella (o di maggiori dimensioni), riempite attraverso il passo c1001 che preleva i dati dal file recipesFromRecipes.txt, contenuto nella cartella

recipeData068.

I passi computazionali sono parti di codice standard69 che possono essere applicate a situazioni molto varie (simulazione della coevoluzione di popolazioni di

67 Per concludere i passi computazionali si utilizzano passi a tempo zero (zero time steps) che si presentano nella forma 1111 s 0, dove il codice 1111 rappresenta un’unità produttiva fittizia e sono eseguiti immediatamente nell’arco di un tick, a prescindere dalla loro numerosità.

68 Possono essere lanciate fino a 10 ricette senza modificare il file

ComputationalAssemblerBasic.java ed il numero massimo di lanci per tick è pari a 1000, se non si

modifica il file OrderDistiller.java.

69 In jES OF i modelli di passi computazionali che possono essere impiegati nella simulazione sono contenuti nella classe ComputationalAssemblerBasic

prede e predatori, rappresentazione dei rapporti banca-impresa, …) ed il significato delle operazioni che compiono può essere compreso soltanto con riferimento al contesto in cui sono utilizzati. La versatilità del loro uso, unita alla possibilità di modificarli leggermente attraverso operazioni di displacement, cioè di spostamento dei riferimenti alle caselle di destinazione, senza necessità di rilevanti modifiche del codice di programmazione, permette di creare configurazioni articolate di interazioni fra gli agenti. Potendo infatti tenere traccia delle conseguenze delle azioni di alcuni agenti su altri (es. il predatore che mangia la preda, la banca che eroga credito all’impresa, …) o degli effetti dei cambiamenti che avvengono nell’ambiente simulato (es. lo scorrere del tempo che determina l’invecchiamento dei predatori o la maturazione di interessi sui prestiti, …), si possono inserire nella simulazione meccanismi di retroazione che accrescono l’interesse dell’analisi. Ad esempio, il predatore che riesce a nutrirsi vedrà aumentare la propria energia e, raggiunto un certo livello, questa gli consentirà di riprodursi; in questo modo l’agente introdurrà nel mondo simulato un elemento di perturbazione delle condizioni iniziali, poiché causerà la nascita di un nuovo agente capace di operare in modo autonomo. Una situazione analoga è quella di un’impresa che, raggiunti determinati volumi di produzione, affronti un cambiamento di scala; la modifica della capacità produttiva può essere rappresentata nella simulazione con il duplicarsi dell’unità su altri strati, in una posizione che abbia coordinate corrispondenti a quelle dell’unità di partenza ed il cambiamento potrà avere conseguenze sia sull’agente coinvolto, sia sull’intero ambiente.

I meccanismi di feedback, ancor più delle semplici regole di interazione diretta fra gli agenti, danno la misura di quanto limitata sia la capacità di previsione umana delle interazioni in una popolazione di agenti; questo avvalora il contributo delle tecnologie informatiche all’analisi svolta dai ricercatori sociali e, più in generale, da coloro che si occupano dello studio di sistemi complessi.

CAPITOLO IV

Il sistema creditizio nella realtà ed in jES Open

Outline

Documenti correlati