Simulazione ad agenti e sistemi complessi

Transcript

Simulazione ad agenti e sistemi complessi
UNIVERSITÀ DEGLI STUDI DI TORINO
Facoltà di Economia
Corso di Laurea in Economia e Commercio
Tesi di Laurea in Economia Matematica
Simulazione ad agenti
e sistemi complessi.
Applicazione al caso BasicNet
Relatore:
Prof. Pietro TERNA
Correlatore:
Prof. Sergio MARGARITA
Candidato:
Roberto CROSETTO
ANNO ACCADEMICO 2003-2004
Desidero ringraziare il prof. Pietro Terna, mio relatore, e la dr.ssa Paola
Bruschi, sempre pronta a rispondere ad ogni mio dubbio.
Un particolare ringraziamento va ai miei genitori e ad Adriana.
Indice
Introduzione
1
1 Complessità e simulazione
5
1.1
La complessità
. . . . . . . . . . . . . . . . . . . . . . . . . .
5
1.2
I sistemi complessi . . . . . . . . . . . . . . . . . . . . . . . .
7
1.3
Un modello per la realtà: il formicaio . . . . . . . . . . . . . . 10
1.3.1
Le formiche . . . . . . . . . . . . . . . . . . . . . . . . 11
1.3.2
Applicazioni alla realtà . . . . . . . . . . . . . . . . . . 12
1.4
Complessità e ordine spontaneo . . . . . . . . . . . . . . . . . 14
1.5
La vita artificiale . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.5.1
Genotipo e fenotipo . . . . . . . . . . . . . . . . . . . . 17
1.5.2
Gli algoritmi genetici . . . . . . . . . . . . . . . . . . . 18
1.6
La simulazione e le scienze sociali . . . . . . . . . . . . . . . . 19
1.7
Lo sviluppo di una simulazione . . . . . . . . . . . . . . . . . 22
1.8
I vantaggi della simulazione . . . . . . . . . . . . . . . . . . . 25
1.9
I problemi della simulazione . . . . . . . . . . . . . . . . . . . 26
1.10 L’interpretazione dei modelli . . . . . . . . . . . . . . . . . . . 27
1.11 Gli agenti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2 Gli strumenti per la simulazione
2.1
32
Swarm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
2.1.1
Sviluppo di una simulazione . . . . . . . . . . . . . . . 34
I
INDICE
2.2
2.3
II
2.1.2
Caratteristiche principali . . . . . . . . . . . . . . . . . 36
2.1.3
Le ‘‘sonde’’ . . . . . . . . . . . . . . . . . . . . . . . . 38
2.1.4
Le librerie di Swarm . . . . . . . . . . . . . . . . . . . 39
NetLogo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
2.2.1
Caratteristiche principali . . . . . . . . . . . . . . . . . 41
2.2.2
Obiettivi futuri . . . . . . . . . . . . . . . . . . . . . . 42
RePast . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
2.3.1
Obiettivi . . . . . . . . . . . . . . . . . . . . . . . . . . 44
2.3.2
Caratteristiche della simulazione . . . . . . . . . . . . . 44
2.3.3
Le librerie . . . . . . . . . . . . . . . . . . . . . . . . . 45
2.3.4
Progetti futuri . . . . . . . . . . . . . . . . . . . . . . . 46
3 Impresa, imprenditore e conoscenza
47
3.1
La teoria neoclassica . . . . . . . . . . . . . . . . . . . . . . . 48
3.2
La Scuola Austriaca
. . . . . . . . . . . . . . . . . . . . . . . 50
3.2.1
L’attività imprenditoriale
. . . . . . . . . . . . . . . . 53
3.2.2
La competizione . . . . . . . . . . . . . . . . . . . . . . 55
3.3
L’imprenditore di Kirzner . . . . . . . . . . . . . . . . . . . . 55
3.4
Simon e la razionalità limitata . . . . . . . . . . . . . . . . . . 57
3.4.1
La razionalità procedurale . . . . . . . . . . . . . . . . 59
3.4.2
Il processo di scelta . . . . . . . . . . . . . . . . . . . . 60
4 jES: java Enterprise Simulator
61
4.1
Introduzione all’uso del simulatore . . . . . . . . . . . . . . . . 62
4.2
Lo schema ERA . . . . . . . . . . . . . . . . . . . . . . . . . . 63
4.3
Applicazioni a casi aziendali . . . . . . . . . . . . . . . . . . . 65
4.4
Il primo formalismo: le cose da fare . . . . . . . . . . . . . . . 66
4.4.1
Le ricette . . . . . . . . . . . . . . . . . . . . . . . . . 66
4.4.2
I layer . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
INDICE
4.5
III
4.4.3
I batch . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
4.4.4
I procurement . . . . . . . . . . . . . . . . . . . . . . . 68
4.4.5
Il processo OR . . . . . . . . . . . . . . . . . . . . . . 69
Il secondo formalismo: chi fa cosa . . . . . . . . . . . . . . . . 70
4.5.1
Le unità produttive . . . . . . . . . . . . . . . . . . . . 70
4.5.2
Le endUnit . . . . . . . . . . . . . . . . . . . . . . . . 71
4.5.3
La scelta delle unità . . . . . . . . . . . . . . . . . . . 72
4.5.4
La trasmissione delle informazioni . . . . . . . . . . . . 72
4.6
Il terzo formalismo: quando fare cosa . . . . . . . . . . . . . . 73
4.7
Le capacità computazionali . . . . . . . . . . . . . . . . . . . . 74
4.8
4.9
4.7.1
Un semplice esempio . . . . . . . . . . . . . . . . . . . 76
4.7.2
La matrice orMemoryMatrix . . . . . . . . . . . . . . . 77
4.7.3
Le ricette che lanciano ricette . . . . . . . . . . . . . . 77
Le capacità contabili . . . . . . . . . . . . . . . . . . . . . . . 79
4.8.1
I costi . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
4.8.2
I ricavi . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
4.8.3
L’utile . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
Lanciare una simulazione . . . . . . . . . . . . . . . . . . . . . 81
4.9.1
I grafici di una simulazione . . . . . . . . . . . . . . . . 82
5 L’azienda reale: BasicNet
86
5.1
La storia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
5.2
Il business system . . . . . . . . . . . . . . . . . . . . . . . . . 89
5.3
La struttura del Gruppo . . . . . . . . . . . . . . . . . . . . . 92
5.4
Le divisioni dot.com
5.5
Il ciclo di produzione . . . . . . . . . . . . . . . . . . . . . . . 96
5.6
Le attività di promozione . . . . . . . . . . . . . . . . . . . . . 97
. . . . . . . . . . . . . . . . . . . . . . . 94
INDICE
IV
6 L’azienda virtuale: Basic_jES
99
6.1
Prima analisi e possibili sviluppi . . . . . . . . . . . . . . . . . 99
6.2
Novità nell’azienda . . . . . . . . . . . . . . . . . . . . . . . . 101
6.3
Le modifiche al modello precedente . . . . . . . . . . . . . . . 102
6.4
Analisi del calendario . . . . . . . . . . . . . . . . . . . . . . . 104
6.4.1
La time-table di BasicNet . . . . . . . . . . . . . . . . 104
6.4.2
Il calendario di Basic_jES . . . . . . . . . . . . . . . . 108
6.5
Le ricette produttive . . . . . . . . . . . . . . . . . . . . . . . 109
6.6
Le memoryMatrixes . . . . . . . . . . . . . . . . . . . . . . . . 110
6.7
Le modifiche al codice . . . . . . . . . . . . . . . . . . . . . . 111
6.8
Analisi di diversi business system . . . . . . . . . . . . . . . . 115
6.9
Caso 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
6.9.1
Le unità produttive . . . . . . . . . . . . . . . . . . . . 116
6.9.2
Le nuove ricette . . . . . . . . . . . . . . . . . . . . . . 120
6.9.3
Il calendario . . . . . . . . . . . . . . . . . . . . . . . . 121
6.9.4
Le modifiche al codice . . . . . . . . . . . . . . . . . . 122
6.9.5
I parametri della simulazione
. . . . . . . . . . . . . . 126
6.10 Caso 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
6.10.1 Le modifiche al modello . . . . . . . . . . . . . . . . . 129
6.10.2 I costi delle unità produttive . . . . . . . . . . . . . . . 132
6.10.3 I ricavi aziendali . . . . . . . . . . . . . . . . . . . . . 134
6.10.4 Le modifiche al codice . . . . . . . . . . . . . . . . . . 136
6.10.5 I parametri della simulazione
. . . . . . . . . . . . . . 138
6.11 Caso 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
6.11.1 Le modifiche al modello . . . . . . . . . . . . . . . . . 140
6.11.2 Le modifiche al codice . . . . . . . . . . . . . . . . . . 141
6.11.3 I parametri della simulazione
. . . . . . . . . . . . . . 141
6.12 Risultati della simulazione . . . . . . . . . . . . . . . . . . . . 142
INDICE
V
6.13 Considerazioni sui risultati . . . . . . . . . . . . . . . . . . . . 148
6.14 Focus sui licenziatari . . . . . . . . . . . . . . . . . . . . . . . 150
6.14.1 Licenziatari con tempo 1 . . . . . . . . . . . . . . . . . 150
6.14.2 Licenziatari con tempo 0 . . . . . . . . . . . . . . . . . 153
6.15 Approfondimento di BasicSamples . . . . . . . . . . . . . . . . 154
6.16 Analisi finale . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
6.16.1 Caso 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
6.16.2 Caso 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
6.16.3 Caso 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
Appendice
165
Bibliografia
202
Elenco delle tabelle
4.1
Esempio di ricetta produttiva . . . . . . . . . . . . . . . . . . 66
4.2
Sequential batch
4.3
Stand alone batch e indicazione dell’endUnit . . . . . . . . . . 68
4.4
Procurement . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
4.5
Processo or . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
4.6
recipeData/orderSequence.xls . . . . . . . . . . . . . . . . . . . 74
4.7
Uso di passi computazionali . . . . . . . . . . . . . . . . . . . 75
4.8
Ricette che lanciano ricette . . . . . . . . . . . . . . . . . . . . 79
6.1
Successione delle fasi per una collezione . . . . . . . . . . . . . 107
6.2
Suddivisione delle royalties . . . . . . . . . . . . . . . . . . . . 117
6.3
Costi fissi delle divisioni dot.com (in euro) . . . . . . . . . . . 120
6.4
Articoli creati ed effettivamente prodotti per ogni collezione . 146
6.5
File log/grossSales
. . . . . . . . . . . . . . . . . . . . . . . . . 68
. . . . . . . . . . . . . . . . . . . . . . . . 158
VI
Elenco delle figure
2.1
Logo di SWARM . . . . . . . . . . . . . . . . . . . . . . . . . 33
2.2
Struttura di una simulazione . . . . . . . . . . . . . . . . . . . 36
2.3
Esempi di sonde . . . . . . . . . . . . . . . . . . . . . . . . . . 38
2.4
Logo di NetLogo . . . . . . . . . . . . . . . . . . . . . . . . . 41
2.5
Logo di RePast . . . . . . . . . . . . . . . . . . . . . . . . . . 43
4.1
Interazioni tra ordini e unità . . . . . . . . . . . . . . . . . . . 63
4.2
Lo schema ERA . . . . . . . . . . . . . . . . . . . . . . . . . . 64
4.3
File unitData/unitBasicData.txt . . . . . . . . . . . . . . . . . 71
4.4
File unitData/memoryMatrixes.txt
4.5
Grafico dell’andamento delle liste d’attesa . . . . . . . . . . . 83
4.6
Andamento dell’utile durante la simulazione . . . . . . . . . . 83
4.7
Rapporto
4.8
Liste d’attesa delle unità dell’impresa virtuale . . . . . . . . . 84
4.9
Livello delle endUnit . . . . . . . . . . . . . . . . . . . . . . . 85
5.1
Rappresentazione del business system di BasicNet . . . . . . . 91
5.2
La struttura del Gruppo . . . . . . . . . . . . . . . . . . . . . 92
6.1
Costi variabili e fissi di BasicNet . . . . . . . . . . . . . . . . . 119
6.2
Ricette 900 e 950 . . . . . . . . . . . . . . . . . . . . . . . . . 121
6.3
Ricetta 800 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
totaltime
totallenght
. . . . . . . . . . . . . . . 75
. . . . . . . . . . . . . . . . . . . . . . . . 84
VII
ELENCO DELLE FIGURE
VIII
6.4
Ricetta 900 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
6.5
Ricetta 302 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
6.6
Primo esperimento.
6.7
Primo esperimento. Tempi d’attesa degli ordini . . . . . . . . 145
6.8
Secondo esperimento.
6.9
Secondo esperimento. Tempi d’attesa degli ordini . . . . . . . 149
6.10 Terzo esperimento.
T empodiesecuzione
T empoprevistodallericette
6.12 Sesto esperimento.
T empodiesecuzione
T empoprevistodallericette
T empodiesecuzione
T empoprevistodallericette
6.11 Quarto esperimento.
. . . . . . . . . . . . 145
. . . . . . . . . . . . . 150
T empodiesecuzione
T empoprevistodallericette
T empodiesecuzione
T empoprevistodallericette
. . . . . . . . . . . 148
. . . . . . . . . . . . 151
. . . . . . . . . . . . . 152
T empodiesecuzione
. . . . . . . . . . 153
6.13 Licenziatari con tempo 0. T empoprevistodallericette
6.14 Approfondimento di Basicsamples.
T empodiesecuzione
T empoprevistodallericette
. . . . 156
6.15 Andamento di costi, ricavi e profitti totali (Caso 1) . . . . . . 159
6.16 Andamento di costi, ricavi e profitti giornalieri (Caso 1) . . . . 159
6.17 Andamento di costi, ricavi e profitti totali (Caso 2) . . . . . . 161
6.18 Andamento di costi, ricavi e profitti giornalieri (Caso 2) . . . . 161
6.19 Andamento di costi, ricavi e profitti totali (Caso 3) . . . . . . 162
6.20 Andamento di costi, ricavi e profitti giornalieri (Caso 3) . . . . 162
Introduzione
La simulazione ad agenti è uno strumento di grande utilità per lo studio dei
sistemi complessi legati agli esseri viventi. Con questa metodologia è possibile
creare un mondo virtuale all’interno del computer basato su agenti autonomi
che interagiscono tra loro e osservare i fenomeni emergenti, che spesso si
rivelano di una complessità straordinaria. Un sistema si dice complesso se
non è possibile analizzarlo scomponendolo nelle parti che lo costituiscono,
ma è necessario studiarlo nel suo insieme; un esempio è l’azienda, oggetto di
studio di questo lavoro.
In questa tesi si applica il metodo della simulazione al contesto di un’impresa reale, con l’obiettivo di ricreare tutte le sue componenti e di osservare
il loro funzionamento all’interno del computer. Il modello di simulazione è
stato costruito utilizzando jES, piattaforma utile per la simulazione di impresa sviluppata dal professor Pietro Terna, e l’azienda oggetto di studio è la
torinese BasicNet S.p.A., che opera nel settore dell’abbigliamento alla moda.
BasicNet ha un particolare modello di business secondo il quale non partecipa direttamente al processo produttivo, in quanto la produzione è delegata
ad imprese esterne, chiamate Sourcing Centers o Trading Company, e gli articoli sono venduti direttamente da queste ultime ai licenziatari, che hanno
il compito di commercializzare i prodotti presso il pubblico. Il ruolo principale di BasicNet consiste nella gestione del network, nella finanza strategica
e nell’attività di merketing e la principale fonte di ricavo è costituita dalle
1
INTRODUZIONE
royalties pagate dai licenziatari, pari al 10% dei loro acquisti, per i servizi
loro offerti.
La costruzione di questo modello è iniziata in Lamieri (2002) e Merlo
(2003a) e questa tesi ne rappresenta la continuazione, con l’obiettivo finale
di un raffronto tra tre possibili modelli organizzativi, illustrati qui di seguito,
che BasicNet potrebbe adottare.
Nel primo caso si rappresenta la BasicNet reale nel modo il più possibile
vicino alla realtà. Grazie alla disponibilità della dottoressa Paola Bruschi,
direttore generale dei sistemi informativi di BasicNet, è stata possibile la
realizzazione di un’azienda virtuale con una struttura, un calendario delle
attività e una configurazione dei costi e dei ricavi simili alla BasicNet reale.
Nel secondo caso si presenta un possibile modello organizzativo che BasicNet potrebbe adottare, cioè un’azienda di tipo tradizionale che produce
e vende direttamente i propri articoli. La differenza con il caso precedente è rappresentata da una diversa struttura dei costi, perché la produzione
avviene internamente, e una differente origine dei ricavi, che sono calcolati
applicando un margine di ricarico ai costi sostenuti dall’azienda.
Infine, si presenta una BasicNet ancora differente, che fa produrre in
outsourcing i propri prodotti e li vende ai licenziatari. Questo modello organizzativo è una ‘‘miscela” dei precedenti, perché la produzione è delegata ad
altri, come per la BasicNet reale, e la vendita è effettuata direttamente, come
nel caso precedente; perciò i costi totali non comprendono quelli relativi alla
produzione e i ricavi sono calcolati in base ad un mark-up.
Occorre ricordare che lo studio qui affrontato non ha l’obiettivo di fornire
risultati assoluti su quale potrebbe essere la miglior struttura organizzativa,
ma offre soltanto un’indicazione generale per le scelte aziendali che, per essere
utilizzata nella realtà, dovrebbe essere affiancata da altri tipi di valutazione.
Il motivo principale è che con la simulazione ad agenti non è possibile ‘‘cat-
2
INTRODUZIONE
turare” e rappresentare tutti gli elementi di incertezza del mondo reale.
La tesi è composta di sei capitoli che, partendo dai concetti generali,
aiutano a comprendere le ragioni dell’utilizzo della simulazione ad agenti e
come costruire modelli di simulazione.
Nel primo capitolo si presenta una trattazione sulla teoria della complessità e sui modi con cui è possibile studiare i comportamenti individuali e
globali all’interno dei sistemi. In seguito si descrive la simulazione ad agenti
e il suo ruolo nello studio dei fenomeni complessi.
Nel secondo capitolo si effettua una breve presentazione di alcuni strumenti che possono essere usati per realizzare una simulazione ad agenti. In
particolare sono presentati Swarm, un protocollo di programmazione con
il quale è possibile creare modelli di simulazione utilizzabili per lo studio
di fenomeni complessi di ogni genere, NetLogo e RePast, altri ambienti di
simulazione.
Nel terzo capitolo è presentata una rassegna della letteratura economica
a riguardo dell’impresa, riservando una particolare attenzione al modo in cui
è considerata la figura dell’imprenditore. Secondo la teoria neoclassica l’imprenditore è un semplice amministratore delle risorse interne e non ha alcuna
funzione creativa, compito che al contrario è evidenziato dagli esponenti della Scuola Austriaca, che lo immaginano come lo scopritore delle occasioni
di profitto presenti nel mercato. L’impostazione Austriaca è poi ripresa da
Israel M. Kirzner ed integrata con spunti di originalità. Infine, si presenta
la visione di Herbert A. Simon, che ha rivoluzionato la figura dell’imprenditore introducendo i principi della razionalità limitata e della decisione più
soddisfacente anziché della migliore.
Nel quarto capitolo si descrive il modello jES (java Enterprise Simulator ), basato su Swarm, con il quale è possibile effettuare delle simulazioni
3
INTRODUZIONE
di impresa. Con questa piattaforma è possibile creare delle imprese virtuali
all’interno del computer per osservare i fenomeni complessi che si creano nelle
realtà aziendali. jES inoltre può essere usato per scopi teorici per lo studio
della nascita e dell’evoluzione delle imprese.
In seguito, nel capitolo cinque, si descrive l’azienda oggetto di studio di
questa tesi, la BasicNet S.p.A., proprietaria di alcuni marchi di abbigliamento
come Kappa, Robe di Kappa, Jesus Jeans, K-Way e Superga.
Infine, nell’ultimo capitolo si descrivono le modifiche e le novità portate al
modello di BasicNet creato con jES in Lamieri (2002) e Merlo (2003a); le modifiche hanno avuto l’obiettivo di rendere il più possibile simile all’azienda
reale quella creata all’interno del computer. Inoltre sono illustrate la costruzione degli altri modelli di azienda descritti precedentemente e un’analisi
finale dei costi e dei ricavi in cui si confrontano i diversi modelli organizzativi.
4
Capitolo 1
Complessità e simulazione
1.1
La complessità
La complessità è un concetto che deriva principalmente dalla matematica e
dalla fisica e con il passare del tempo è stata oggetto di studio di altre discipline, come la biologia e le scienze sociali. Il suo carattere di multidisciplinarità
crea delle difficoltà nel momento in cui si voglia dare una definizione di questo concetto e la conseguenza principale è che non ne esiste una ampiamente
condivisa. Infatti nessuno dei tentativi, per ammissione stessa degli autori,
è in grado di spiegare in modo esaustivo ciò che gli economisti e i sociologi
intendono con questo concetto.
Una definizione generale può essere che ‘‘un sistema dinamico è complesso
se a livello endogeno non tende asintoticamente ad un punto fissato, ma
mostra comportamenti discontinui e può essere descritto come un insieme di
equazioni non lineari con elementi stocastici’’ (Rosser, 1999). Un secondo
tentativo di definizione si può trovare in Tinti (1998), dove la complessità è
definita come ‘‘lo studio interdisciplinare dei sistemi complessi adattivi e dei
fenomeni emergenti ad essi associati’’.
Infine, in Kilpatrick (2001) è illustrato il Santa Fe approach, vale a di-
5
1. COMPLESSITÀ E SIMULAZIONE
re la visione della complessità nella ricerca economica secondo gli studiosi
dell’Istituto degli Studi sulla Complessità di Santa Fe, che la considerano
caratterizzata da sei elementi chiave:
1. interazioni disperse tra agenti eterogenei che agiscono localmente;
2. nessun controllo centrale che può sfruttare tutte le opportunità e le
interazioni nell’economia;
3. organizzazioni gerarchiche che danno vita ad un groviglio di interazioni;
4. continuo adattamento e apprendimento degli agenti;
5. continue novità, ad esempio nuovi mercati, nuove tecnologie e nuovi
comportamenti;
6. dinamiche senza equilibrio.
Inoltre il mondo così immaginato è a razionalità limitata con aspettative non
razionali. Questa definizione di complessità è stata delineata precedentemente dai chimici e dai fisici delle Università di Bruxelles e Stuttgart, i quali
hanno svolto anche alcune applicazioni di carattere economico che hanno
influenzato in modo particolare l’attività dei ricercatori di Santa Fe.
La nascita del pensiero della complessità avviene alla fine degli anni Quaranta da parte degli studiosi di cibernetica e di teoria dell’informazione; con
il passare del tempo ad essi si sono aggiunti studiosi provenienti da diverse
discipline. Una delle caratteristiche più importanti della teoria della complessità è rappresentata dal fatto che essa contribuisce ad unire la filosofia e
la scienza, infatti a questi studi partecipano in egual misura filosofi, biologi,
psicologi, chimici ed informatici; alcuni parlano della complessità come di
una ‘‘terza cultura” (Tinti, 1998).
Inoltre è da sottolineare il ruolo assunto dal computer nello studio della
complessità, che è utilizzato come laboratorio in cui sperimentare i modelli
6
1. COMPLESSITÀ E SIMULAZIONE
computazionali del sistema che si intende studiare ed osservare il suo comportamento; questo tipo di esperimento è detto simulazione, della quale si
parlerà in modo più approfondito nei prossimi paragrafi di questo capitolo.
Inizialmente la maggior parte dei lavori sulla complessità hanno riguardato modelli spaziali, caratterizzati dalla possibilità per gli agenti di interagire
tra loro in modo disperso; da questi modelli si può notare l’emergere di una
struttura globale a partire da fenomeni strettamente locali, caratteristica che
rappresenta l’idea principale della moderna teoria della complessità. Questo
concetto trova l’anticipatore in un lavoro di Schelling, in cui è stato creato un modello che riguarda la segregazione razziale nelle città e può essere
dimostrato senza l’uso del computer.
Schelling considered a rectangle with many sub-rectangles, each occupied by a black or a white. He allowed for movement based
on local interactions and discovered that even a very slight preference by members of either group for living with their own kind
would eventually lead to a largely segregated city, even though
agents were only acting in relation to their immediate neighbors.
(Rosser, 1999, 176)
Il modello di Schelling è stato imitato per lo studio di sistemi formati
da agenti eterogenei che formulano strategie in base alle interazioni con gli
altri agenti; un esempio è il punto di vista della vita artificiale sviluppato da
Langton (1992), che usa automi cellulari per rappresentare agenti economici
che interagiscono tra loro.
1.2
I sistemi complessi
Gran parte del mondo è composto da sistemi complessi adattivi, strutture in
cui le componenti sono fortemente dinamiche e correlate tra loro; ciascuno di
7
1. COMPLESSITÀ E SIMULAZIONE
questi sistemi evolve e deve adattarsi al cambiamento continuo per garantirsi
la sopravvivenza. Esempi di sistema complesso possono essere la società e il
nostro sistema immunitario.
Secondo Tinti (1998) la complessità di un sistema è una proprietà del suo
modello creato dall’osservatore esterno e non una caratteristica del sistema
stesso; perciò si definisce sistema complesso una struttura la cui rappresentazione scientifica ha la peculiarità di essere complessa. I sistemi di questo
tipo presentano alcune caratteristiche comuni:
• tante componenti più o meno complesse; quanto più numerose e complesse sono le parti che lo compongono, tanto più complesso è il sistema
in generale;
• interazioni tra le componenti, che si passano informazioni tra loro; le
informazioni non possono essere né troppo numerose né troppo poche,
perché nel primo caso il sistema diventerebbe caotico e nel secondo si
‘‘cristallizzerebbe’’;
• assenza di gerarchia piramidale; in caso contrario il funzionamento del
sistema potrebbe essere spiegato osservando soltanto la componente
che si trova al vertice della struttura;
• interazione adattiva con l’ambiente; il sistema è tanto più complesso
quanto maggiori sono i fattori esterni che influiscono sul suo adattamento all’ambiente e sulla sua evoluzione. Questa caratteristica rende
adattivi i sistemi complessi.
È possibile classificare i sistemi in tre differenti categorie in base al loro
grado di complessità. Si definiscono sistemi minimamente complessi tutti i
sistemi naturali non biologici che non manifestano interazioni con l’ambiente
esterno. I sistemi di media complessità sono gli artefatti complessi, come
8
1. COMPLESSITÀ E SIMULAZIONE
ad esempio il computer; questi sistemi possono essere adattivi e manifestare
comportamenti imprevedibili. Infine, i sistemi complessi sono sistemi adattivi che manifestano fenomeni emergenti, esempi di sistemi complessi sono le
popolazioni umane e tutti i sistemi biologici.
I sistemi complessi sono detti non lineari (Sanders e McCabe, 2003),
perché le variabili al suo interno interagiscono tra loro costantemente e si
modificano in risposta alle variazioni delle altre; in questi sistemi piccoli
cambiamenti possono dare origine a variazioni di tutto il sistema. I sistemi non lineari non rispondono al principio della sovrapposizione, in quanto
anche scomponendoli nelle parti costitutive non è possibile comprendere il
funzionamento del sistema totale. La caratteristica fondamentale dei sistemi non lineari è l’importanza delle interazioni tra le parti piuttosto che le
proprietà delle sue componenti.
Al contrario, i sistemi lineari sono soggetti al principio di sovrapposizione,
cioè è possibile analizzare un sistema di questo tipo studiando separatamente
le parti che lo compongono e da esse comprendere il funzionamento completo
del sistema.
La principale differenza tra i sistemi complessi, o non lineari, e quelli
complicati, o lineari, è che per i secondi il comportamento globale è la somma
dei comportamenti locali delle sue parti; per i primi invece il comportamento
del tutto è maggiore della somma dei comportamenti locali, a causa delle
interazioni tra gli agenti del sistema (Langton, 1992).
È possibile fare un esempio legato alla realtà, mettendo a confronto il
motore di un’automobile e un formicaio (Terna, 2003a). Il primo è un sistema complicato, o lineare, perché può essere scomposto in tutte le sue parti
costitutive ed a ciascuna, ad esempio il carburatore o la marmitta, può essere
associata una particolare funzione che aiuta a comprendere il funzionamento generale del motore. Il formicaio è un sistema complesso, o non lineare,
9
1. COMPLESSITÀ E SIMULAZIONE
perché la più piccola unità di questo sistema, la formica, non è in grado di
dire nulla sulla struttura aggregata; per comprendere il funzionamento di un
formicaio, e di qualsiasi altro sistema complesso, si rivela quindi necessario
osservarlo nel suo insieme.
1.3
Un modello per la realtà: il formicaio
Secondo Ormerod (2003) la società è un sistema complesso formato da agenti interattivi che imparano e si adattano continuamente all’ambiente circostante. Questa visione è fortemente in contrasto con quella degli schemi di
pensiero tradizionali delle scienze sociali e dell’aconomia, che offrono una visione del funzionamento del mondo che può essere paragonato a quello di una
macchina.
Nella realtà si incontrano spesso fenomeni che non possono essere spiegati
con regole rigide, ma soltanto con la consapevolezza che la società è molto
simile ad un organismo vivente; ad esempio, gli individui possono prendere
delle scelte in base alle proprie opinioni, ma possono anche essere influenzati
da quelle di altri individui. Nella teoria economica convenzionale questa idea
non trova spazio, in quanto è previsto che le preferenze siano fissate per tutti.
Un modello che può essere utile per spiegare i fenomeni che si verificano nella realtà è il formicaio, un esempio di sistema complesso composto da
agenti che interagiscono tra loro e si adattano all’ambiente circostante, che
consente una via interpretativa alternativa alla teoria meccanicistica tradizionale. Infatti l’osservazione del comportamento di un gruppo di formiche
si rivela di grande utilità nel momento in cui si voglia formalizzare il comportamento di individui che si trovano di fronte a più possibilità tra cui
scegliere.
10
1. COMPLESSITÀ E SIMULAZIONE
1.3.1
Le formiche
Gli studi biologici sulle formiche hanno dato origine a risultati che sono difficili da spiegare e che mostrano l’emergere di comportamenti complessi da
parte loro che possono trovare analogie con le società umane.
Gli esperimenti entomologici condotti durante gli anni Ottanta hanno
avuto come obiettivo l’osservazione del modo in cui le formiche prendono le
decisioni e sono consistite nel posizionare due mucchietti identici di cibo a
distanze uguali da un formicaio; i due mucchietti erano reintegrati ogni volta
che una formica portava via del cibo da uno di essi.
Intuitivamente si può dire che una formica scelga in modo casuale dove
dirigersi, perciò la distribuzione delle formiche tra i due mucchietti potrebbe
essere analizzabile semplicemente lanciando una moneta e osservando la distribuzione di teste e croci. Tuttavia gli studi dei biologi hanno evidenziato
che se una formica ha successo nella ricerca di cibo in un particolare luogo,
in futuro tenderà a tornare nello stesso posto; inoltre durante il ritorno al
formicaio la formica lascia una scia di secrezioni, il ferormone, che possono
stimolare altre formiche a dirigersi verso il mucchietto in cui la prima ha
trovato cibo.
Alan Kirman, un economista e uno dei ‘‘pionieri” nell’applicazione all’economia dei modelli basati sugli agenti interattivi (Ormerod, 2003), osservando
gli studi effettuati dai biologi sulle formiche sviluppò l’idea che per comprendere il funzionamento di un intero sistema non è sufficiente osservare soltanto
il comportamento di un suo agente rappresentativo, che sia una formica oppure un agente economico o sociale. Il risultato del sistema studiato dipende
dalle interazioni che si creano tra gli agenti e dall’influenza che essi esercitano
tra loro.
Tornando all’esempio del formicaio, secondo Kirman una singola formica
può scegliere fra tre possibilità: dirigersi verso il mucchio di cibo da cui si
11
1. COMPLESSITÀ E SIMULAZIONE
è rifornita in un momento precedente, essere indotta dalla scia lasciata da
un’altra formica a scegliere un mucchio in particolare, oppure prendere una
scelta nuova in modo indipendente. Date queste ipotesi, ogni esperimento di
questo modello genera risultati imprevedibili e diversi tra loro che dipendono,
di volta in volta, dalla propensione delle formiche a cambiare comportamento
e a farsi convincere dalle altre.
Il modello di scelta fra tre possibilità descritto per le formiche è adottabile anche per la descrizione delle scelte delle persone in molte situazioni
reali, infatti i fenomeni sociali ed economici presentano le stesse proprietà del
comportamento di un formicaio: nel breve termine sono imprevedibili e nel
lungo periodo originano fenomeni di carattere complesso.
1.3.2
Applicazioni alla realtà
In Ormerod (2003) si afferma che è possibile riscontrare delle analogie con
il modello del formicaio se si osservano situazioni reali semplici, come la
scelta di una serata al cinema, o altre più elaborate, come ad esempio alcuni
fenomeni che si originano sui mercati finanziari.
Il primo esempio riguarda la scelta di più individui a riguardo di quale film
da vedere al cinema. Il processo di scelta è simile a quello della formica, anche
se in questo esempio ci sono alcune differenze con il modello sopra descritto,
ad esempio i film tra cui scegliere non saranno uguali come i mucchi di cibo
per le formiche, ma i registi cercheranno il più possibile di differenziare i loro
prodotti.
Per comprendere quali siano i fattori che portano al successo un film è
necessario usare la teoria degli agenti interattivi, rappresentati dal pubblico e
dai critici, che sono responsabili del successo o dell’insuccesso di una pellicola.
Infatti le persone che ne vanno a vedere una ‘‘lasciano una traccia’’ proprio
come le formiche con il ferormone, rappresentata in questo caso dalle opinioni
12
1. COMPLESSITÀ E SIMULAZIONE
e dai passaparola, che può influenzare le scelte degli altri individui. Perciò agli
individui è possibile applicare il modello decisionale delle formiche, infatti essi
possono decidere in modo autonomo oppure farsi influenzare dalle opinioni e
dai consigli altrui. Inoltre è anche importante l’ordine con cui i film sono visti,
in quanto il fatto di andare a vedere un film l’ultimo giorno della proiezione
esercita un effetto certamente minore rispetto a quello di chi è andato la
prima sera.
Un secondo esempio è l’applicazione sviluppata da Alan Kirman in relazione ad un fenomeno realmente avvenuto sui mercati finanziari. Nei primi
anni Ottanta iniziò a prendere forza l’opinione di un numero crescente di
operatori specializzati che il dollaro fosse sopravvalutato e, ovviamente, nel
1985 questa valuta crollò; il fatto ‘‘curioso” è che durante questo periodo
gli operatori si comportarono in modo inspiegabile, continuando a comprare
il dollaro e allo stesso tempo dichiarando che quest’ultimo era decisamente
sopravvalutato.
Per studiare questo fenomeno Kirman sviluppò un modello in cui si trovano due categorie di operatori finanziari, da un lato i fundamentalist, coloro
che ritengono che i prezzi delle attività finanziarie siano determinati dai fondamentali (ad esempio, nel caso delle azioni dal valore attuale dei dividendi
futuri), e dall’altro i chartist, secondo i quali l’andamento passato di un’attività finanziaria può aiutare a prevederne il futuro. Nel 1984 i primi ritenevano
che il dollaro avrebbe subito un brusco calo, mentre i secondi erano certi del
contrario.
Nel modello ogni operatore ha tre possibilità, come le formiche: può
scegliere di comportarsi come prima, può modificare la propria opinione influenzato dalle informazioni altrui, oppure può scegliere autonomamente di
cambiare. Come nel formicaio, per ogni attività finanziaria la ripartizione
tra i due gruppi di operatori varia continuamente e in modo rapido, pertanto
13
1. COMPLESSITÀ E SIMULAZIONE
si possono verificare grandi variazioni di prezzo in modo repentino ed inspiegabile. La volatilità dei prezzi è dunque la conseguenza della volatilità delle
scelte degli operatori.
Questo modello permette di comprendere ex post anche un comportamento senza logica come l’acquisto di una moneta considerata sopravvalutata,
dovuto a frequenti cambiamenti di opinione degli operatori, situazione che la
teoria economica tradizionale non è in grado di spiegare.
1.4
Complessità e ordine spontaneo
Le idee di Hayek secondo alcuni studiosi sono considerate anticipatrici della
teoria della complessità in quanto, in base alle loro opinioni, quest’ultima rappresenta semplicemente la riscoperta di alcuni principi hayekiani, ad esempio
la conoscenza e l’ordine spontaneo, o una rievocazione della sua filosofia del
mercato.
Ordine spontaneo e sistema auto-organizzante possono essere considerati
sinonimi (Kilpatrick, 2001), perché in un sistema complesso adattivo si può
rilevare una sorta di ordine che non è prevedibile in alcun modo.
Secondo Hayek il mercato non è mai in equilibrio e con il passare del
tempo evolve. Nella visione hayekiana il mercato è organizzato dagli agenti
senza che sia necessaria la presenza di un controllo accentrato ed è quasi
sempre in grado di raggiungere in modo autonomo la miglior configurazione;
un’eventuale autorità esterna non potrebbe migliorare la sua efficienza, ma
solo peggiorarla, a causa della complessità della società e della presenza di
una conoscenza dispersa tra gli uomini.
La maggior parte di queste idee sono condivise dai teorici della complessità, con la sola differenza che secondo la loro visione un controllo centrale
pianificatore è in grado di sistemare la configurazione del mercato nel caso
che questa non sia la migliore.
14
1. COMPLESSITÀ E SIMULAZIONE
Un altro elemento che avvicina Hayek alla teoria della complessità è il
suo interesse per la teoria biologica evoluzionistica e per la scienza cognitiva, che lo avvicinò a gran parte della letteratura studiata dai teorici della
complessità, anche se una differenza con questi ultimi è rappresentata dal
fatto che i lavori di Hayek sono di limitato utilizzo per ulteriori analisi sui
sistemi complessi, perché non considerava di grande aiuto per la loro analisi
gli strumenti statistici.
Tuttavia il pensiero di Hayek e la moderna teoria della complessità mostrano anche alcune caratteristiche che li distinguono tra loro.
Nelle opere di Hayek sembra che sia presente l’idea di un’entità soprannaturale benevolente che si cela dietro l’ordine spontaneo; secondo Hayek le
persone dovrebbero impegnarsi a lasciar guidare la società all’ordine spontaneo piuttosto di tentare il controllo del mercato per mezzo di un’autorità
centrale.
Al contrario, i teorici della complessità non vedono una forza benevolente
dietro le dinamiche complesse. Gli uomini agiscono e ciò che fanno può
causare eventi positivi o negativi, ma non esiste una mano invisibile che
guida automaticamente l’uomo verso la migliore soluzione, perciò si rende
necessaria la presenza di un controllo accentrato che in alcune situazioni
intervenga per sistemare l’andamento della società.
Si può pertanto concludere che il pensiero di Hayek in qualche modo anticipa la teoria della complessità e chi si accinge allo studio di questa disciplina
dovrebbe analizzare attentamente i lavori hayekiani. Occorre tuttavia sottolineare che le teorie espresse dalle due parti sono qualitativamente differenti
(Kilpatrick, 2001).
15
1. COMPLESSITÀ E SIMULAZIONE
1.5
La vita artificiale
La vita artificiale mira a sintetizzare comportamenti di tipo biologico in ambienti artificiali, ad esempio in un computer, e ad osservare i fenomeni complessi che sono originati dalle interazioni tra gli agenti e dal loro adattamento
all’ambiente circostante.
Tradizionalmente la biologia ha considerato un organismo vivente come
una macchina complessa ed in seguito ha proceduto a ‘‘scomporre” gli organismi nelle loro componenti più piccole al fine di comprendere i meccanismi
della vita. Grazie alla conoscenza delle parti che costituiscono gli organismi
viventi la biologia è stata in grado di proporre uno schema generale sulla
vita.
Tuttavia la vita dipende non solo dalle caratteristiche degli esseri viventi
ma anche dalle interazioni che si creano tra loro, perché i fenomeni naturali
sono non lineari e conseguentemente gli organismi devono essere studiati
osservando il comportamento che assumono se sono immersi nell’ambiente.
Perciò secondo Langton (1992) la vita artificiale applica il punto di vista
sintetico alla biologia: mette insieme gli esseri viventi e analizza le interazioni
che si generano; con il termine sintesi si intende la combinazione di più parti
diverse tra loro per formare un tutto.
Gli obiettivi della vita artificiale sono espressi in Langton (1992, 190):
la vita artificiale intende 1) sintetizzare il processo dell’evoluzione, 2) usando i calcolatori, e 3) studiare qualunque cosa emerga
da questo processo, anche quando i risultati non hanno corrispettivi nel mondo naturale. È certo interessante, dal punto di vista
scientifico, sapere quali tipi di cose possono, in linea di principio,
evolversi − che siano o no evolute, di fatto qui sulla Terra.
La vita artificiale si differenzia dall’intelligenza artificiale per la diversa
16
1. COMPLESSITÀ E SIMULAZIONE
prospettiva adottata. L’intelligenza artificiale ha sempre avuto come obiettivo la generazione di comportamenti intelligenti che non necessariamente
devono avere una corrispondenza con quanto avviene in natura. Al contrario, l’obiettivo della vita artificiale è la riproduzione dei meccanismi che
avvengono nei sistemi naturali.
Nello studio della vita artificiale i calcolatori elettronici giocano un ruolo
molto importante, perché possono essere considerati come un laboratorio
in cui effettuare gli esperimenti desiderati. Il computer offre ai ricercatori
un nuovo metodo di studio e permette l’analisi di fenomeni per i quali le
equazioni che li definiscono non hanno soluzione.
Con la simulazione della vita al calcolatore gli studiosi si sono resi conto
che i comportamenti che presentano una grande complessità a livello globale
generalmente emergono da insiemi di unità che hanno regole locali molto
semplici, perciò una conclusione che si può trarre è che anche in natura,
come si è visto precedentemente per la società, i fenomeni complessi hanno
cause semplici.
1.5.1
Genotipo e fenotipo
Dal punto di vista del comportamento dei sistemi viventi è importante la
distinzione tra genotipo e fenotipo. Il genotipo è l’insieme delle istruzioni
genetiche contenute nel DNA di un organismo, mentre il fenotipo è l’organismo fisico, cioè tutto ciò che emerge come risultato dell’interpretazione del
genotipo in un particolare ambiente.
Nel contesto di vita artificiale si rende necessaria la generalizzazione di
queste definizioni in modo che siano applicabili anche nel caso di situazioni
non biologiche. Perciò di si definisce genotipo generalizzato l’insieme
non ordinato di regole di basso livello e fenotipo generalizzato i com-
17
1. COMPLESSITÀ E SIMULAZIONE
portamenti e le strutture che emergono dalle interazioni tra le regole di basso
livello quando sono attivate in un ambiente specifico.
Nella vita artificiale si utilizza la prospettiva bottom-up, secondo cui i
sistemi sono descritti a partire da semplici regole da cui possono essere originati comportamenti di grande complessità. In questo contesto inizialmente
si definisce il genotipo, cioè il repertorio di comportamenti, e in seguito dalle interazioni dell’insieme emerge il comportamento globale del sistema, il
fenotipo.
Se si simula la vita, si può andare incontro a fenotipi complessi costituiti
su più livelli che fanno sì che emergano delle strutture gerarchiche; questa
caratteristica è evidenziata in Langton (1992, 208):
Vale la pena di notare che il fenotipo è un fenomeno a più
livelli. Anzitutto, c’è il fenotipo associato a ciascuna istruzione
particolare − l’effetto che l’istruzione ha sul comportamento di
un’entità quando viene eseguita. In secondo luogo, c’è il fenotipo associato a ciascuna entità individuale − il suo particolare
comportamento nell’aggregato. In terzo luogo, c’è il fenotipo
associato al comportamento dell’aggregato come totalità.
1.5.2
Gli algoritmi genetici
Gli studi sulla vita artificiale hanno permesso di formulare delle tecniche
evolutive che si basano sull’imitazione del processo di evoluzione biologica.
In natura le regole, o gli individui, si riproducono, mutano e si estinguono
con l’obiettivo di diffondere soltanto gli esemplari migliori.
Uno dei primi esempi di utilizzazione del modello evolutivo per la ricerca
di soluzioni è rappresentato dagli algoritmi genetici, creati da John Holland,
che con il loro utilizzo ha cercato di rappresentare il processo naturale di
18
1. COMPLESSITÀ E SIMULAZIONE
evoluzione biologica in un modello che sia utile a cercare le soluzioni dei
problemi.
In Ferraris (1999) si legge che in un algoritmo ogni genotipo è rappresentato da una stringa di caratteri (possono essere ‘‘0’’ e ‘‘1’’) che descrive
una particolare strategia; ad ogni individuo è assegnato un fitness value, che
indica il suo grado di adattamento ed è calcolato in base ai risultati ottenuti
dall’applicazione della strategia nell’ambiente circostante.
Durante ogni iterazione alcuni individui della popolazione sono selezionati
per la riproduzione, con particolare attenzione a scegliere quelli con il fitness
value più alto, e altri per l’estinzione. La riproduzione avviene copiando
e incrociando (crossover ) le stringhe dei genitori, in modo che ai figli sia
trasmesso il patrimonio genetico di entrambi, proprio come accade in natura.
Per rendere possibile gli errori nella trasmissione genetica genitori-figli è
stata introdotta la mutazione, secondo la quale alcuni caratteri possono essere
modificati in modo casuale; il meccanismo di scelta dei caratteri avviene in
base ad una data probabilità, che in genere è molto bassa.
Dopo l’esecuzione dei processi di evoluzione e di riproduzione per più
volte si può notare che la popolazione converge verso un unico tipo di individuo al quale è associato un alto fitness value; questo significa che strategia
incorporata nelle stringhe è la migliore per l’ambiente considerato.
1.6
La simulazione e le scienze sociali
Nelle scienze della natura, come la fisica e la chimica, le teorie formulate possono essere verificate direttamente in laboratorio affinché i ricercatori siano in
grado di verificare la correttezza delle loro ipotesi. Gli esperimenti di questo
tipo consentono di capire quali sono i fattori che danno origine a determinati
fenomeni e di modificare alcuni aspetti dei primi per osservare le conseguenze
al sistema generale.
19
1. COMPLESSITÀ E SIMULAZIONE
L’opportunità di verificare le teorie non è invece disponibile per le scienze
sociali, in quanto non dispongono di un vero e proprio laboratorio. La simulazione al computer offre a queste discipline un nuovo ed importante strumento
di ricerca, in quanto grazie ad essa sociologi, psicologi ed economisti possono
studiare alcuni aspetti della realtà, ad esempio processi e relazioni non lineari,
tramite la creazione nel computer di modelli accuratamente specificati.
La simulazione al computer è considerata la ‘‘terza via’’ (Gilbert e Terna, 2000) disponibile agli studiosi delle scienze sociali, in una classificazione
che comprende i modelli letterario-descrittivi e quelli matematico-statistici;
i primi sono molto flessibili ma la loro adeguatezza non può essere verificata
con strumenti di calcolo, mentre i secondi sono computabili ma hanno un
grave problema rappresentato semplificazioni imposte, che possono causare
un allontanamento dalla realtà. I modelli di simulazione offrono perciò un
giusto compromesso tra le esigenze di flessibilità dei primi e le possibilità di
computazione dei secondi (Terna, 2003a).
Una definizione del metodo simulativo è fornita in Parisi (1999, 28):
Le simulazioni sono teorie interpretative dei fenomeni della
realtà formulate come un programma che gira in un computer. Le
teorie della scienza mirano a identificare i meccanismi, i processi,
i fattori che stanno dietro ai fenomeni e che spiegano i fenomeni,
ce li fanno capire. Adottare il metodo della simulazione significa
tradurre una teoria in un programma di computer, far girare il
programma nel computer e verificare se il programma, cioè la simulazione, riproduce i fenomeni che la teoria intende spiegare. Le
simulazioni sono il terzo strumento della scienza, uno strumento
che si è aggiunto abbastanza di recente, cioè da quando computer
veloci e potenti sono divenuti accessibili a qualunque scienziato,
20
1. COMPLESSITÀ E SIMULAZIONE
ai due strumenti di ricerca tradizionali: le teorie e gli esperimenti
di laboratorio.
Axtell (2000) osserva che la tecnica della simulazione ad agenti può essere usata in tre casi distinti. Nel primo, il più semplice, si presenta quando
il fenomeno sociale che si va a studiare può essere completamente descritto
da equazioni risolvibili analiticamente o numericamente; in questo caso la
simulazione può essere usata come metodo alternativo per arrivare agli stessi
risultati o come strumento per presentarli in modo più facilmente comprensibile rispetto a quelli di un modello matematico. Un secondo uso emerge nel
caso in cui il modello matematico adottato per analizzare il processo sociale
possa essere descritto ma le sue equazioni non siano risolvibili oppure i risultati non siano stabili. Infine, il terzo tipo di utilizzo si ha nel caso di problemi
sociali per i quali non è possibile una spiegazione fondata su equazioni; la
simulazione ad agenti è perciò l’unico metodo con cui è possibile studiare
questi fenomeni.
Gli utilizzatori della simulazione possono avere diversi obiettivi e, in particolare, se ne possono distinguere almeno tre (Conte, 1998 e Edmonds,
2003):
1. la proiezione, cioè l’uso di modelli per prevedere gli avvenimenti futuri
legati ad un particolare fenomeno; queste simulazioni non sono necessariamente basate su un modello ad agenti e risultano molto utili quando
il sistema su cui si indaga è di natura complessa, ad esempio se si tratta
di un processo non lineare. La simulazione in questo caso può essere
utilizzata per prevedere gli esiti di interventi di politica economica o
sociale;
2. la sperimentazione, nel caso in cui con la simulazione si intendano spiegare dei particolari fenomeni e si desideri verificare la qualità dei modelli proposti. Il modello creato nel computer può essere usato in due
21
1. COMPLESSITÀ E SIMULAZIONE
modi: manipolando le variabili del modello, possibilità particolarmente
indicata quando non si possono realizzare modifiche nella realtà oppure
quando si intende valutare quali siano le cause scatenanti di particolari eventi, con l’obiettivo di utilizzare il computer come un vero e
proprio ‘‘laboratorio” delle scienze sociali; un secondo modo di utilizzo
è l’osservazione del comportamento del modello ‘‘così come è’’ e dei
fenomeni che hanno origine da esso;
3. infine, l’esplorazione del fenomeno costruito nel ‘‘laboratorio virtuale”, per osservare e studiare i diversi aspetti delle dinamiche sociali e
l’evoluzione della cooperazione tra gli agenti.
1.7
Lo sviluppo di una simulazione
Lo sviluppo di una simulazione prevede lo svolgimento di due fasi, la prima
di modelling, cioè la costruzione nel computer del modello da simulare, e in
seguito la simulazione vera e propria.
Modelling
Durante questa fase si crea una struttura all’interno del computer che sia in
grado di imitare un certo aspetto della realtà (Edmonds, 2003); il modello
solitamente è soggetto a dei parametri, perciò è possibile che lo stesso possa
essere adattato per simulare e analizzare diversi aspetti della stessa realtà.
La ‘‘bontà’’ di un modello è valutata in base ai seguenti criteri (Edmonds,
2003):
• la correttezza; un modello può essere costruito scegliendo uno tra i due
metodi maggiormente diffusi: il primo propone di seguire i principi che
sono stati sviluppati precedentemente per fenomeni simili ed è funzione
22
1. COMPLESSITÀ E SIMULAZIONE
del successo che essi hanno avuto; il secondo metodo consiste nel tentativo di imitare il più possibile il processo reale ed è il più impegnativo
e difficoltoso;
• la precisione dei principi utilizzati per costruire il modello, che è misurata dalla differenza tra i risultati del modello e quelli della realtà;
generalmente la perfetta correttezza non è raggiungibile a causa della
presenza persistente di fenomeni che la ostacolano;
• la generalità, che indica la possibilità di applicare un modello in diverse
circostanze; generalmente si tende a preferire un modello più versatile
rispetto ad uno più specifico;
• la semplicità, qualità importante quando il modello deve essere applicato o interpretato;
• il costo richiesto per la creazione del modello, che spesso rappresenta
uno dei criteri guida nelle scelte dei modelli di simulazione con lo scopo
di ricerca;
Un aspetto importante di questa fase riguarda la scelta del modello da
utilizzare, in quanto ne esistono di diversi tipi. In particolare, i modelli usati
dagli economisti e dai teorici dei giochi sono detti matematici e hanno la
caratteristica di definire gli agenti in base ai valori assegnati a determinate
variabili. Un secondo tipo di modelli, detti procedurali, definiscono gli agenti
in base a delle sequenze di azioni eseguite secondo regole interne.
Infine è necessario stabilire l’affidabilità del modello usato. Occorre osservare che si possono riscontrare diverse cause di inaffidabilità in un modello
(Conte, 1998), da un primo caso in cui sono elaborate previsioni non verificate
nella realtà fino a situazioni più gravi in cui non è possibile verificare l’attendibilità del modello perché le previsioni sviluppate sono troppo generiche e
perciò impossibili da valutare.
23
1. COMPLESSITÀ E SIMULAZIONE
Simulazione
Durante questa fase si fa funzionare il modello nel computer. Si presenta
però un interrogativo, che riguarda l’utilità della simulazione per un modello
per cui è possibile l’esecuzione analitica; in almeno tre casi l’utilizzo della
simulazione si rende necessario (Conte, 1998):
1. negli studi su sistemi che presentano capacità di apprendimento, in cui
gli agenti imparano interagendo con l’ambiente e con gli altri agenti;
2. negli studi in cui possono emergere nuovi fenomeni a partire da situazioni conosciute, riscontrabili nell’osservazione di sistemi dinamici
auto-organizzanti, che possono subire delle modifiche per adattarsi ai
cambiamenti dell’ambiente esterno;
3. negli studi sull’evoluzione e sull’adattamento dei sistemi, come nel caso
degli studi dell’Istituto di Santa Fe sui sistemi complessi adattivi.
In tutti questi casi l’esecuzione analitica non può sostituire la simulazione,
perché questa tecnica si rende necessaria per tutti i sistemi il cui studio
prevede delle interazioni con l’ambiente; infatti solo con questo metodo è
possibile consentire ai sistemi di agire in un mondo artificiale, ed in seguito a
queste azioni si possono osservare fenomeni di apprendimento e di evoluzione
dei sistemi.
Infine, ci sono casi per cui l’uso della simulazione è fondamentale, in quanto di essi non si può ottenere una soluzione da un modello analitico. Alcuni
esempi riguardano lo studio degli effetti dei sistemi complessi e di quelli semplici; questo secondo caso è molto interessante, perché in queste situazioni la
simulazione ha un carattere esplorativo, cioè è usata per formulare una teoria
e per evidenziare le proprietà più importanti del modello e non per verificare
delle ipotesi, come avviene nel primo caso.
24
1. COMPLESSITÀ E SIMULAZIONE
1.8
I vantaggi della simulazione
Un vantaggio della simulazione consiste nella possibilità di studiare fenomeni
e realtà non direttamente accessibili; questa caratteristica si è rivelata molto
importante per archeologi e storici, che con la simulazione dispongono così
di un nuovo e importante strumento di studio.
Con la simulazione si possono perciò studiare tutti i sistemi, sia quelli
semplici sia quelli complessi; da questo punto di vista la simulazione rappresenta per i ricercatori un metodo più completo rispetto al laboratorio,
all’interno del quale si possono analizzare soltanto i sistemi semplici, perché quasi tutti i fenomeni che interessano le scienze della natura e dell’uomo
danno origine a sistemi complessi (Parisi, 1999).
La simulazione consente inoltre di elaborare modelli che mirano ad ottenere particolari risposte, ad esempio conoscere quali saranno le conseguenze
originate da un particolare insieme di fattori; grazie a questo metodo gli studiosi delle scienze sociali possono valutare gli effetti originati da particolari
provvedimenti economici o sociali prima della loro applicazione nella realtà.
L’uso della simulazione costringe l’utilizzatore a specificare il modello in
modo molto dettagliato, senza lasciare spazio a ‘‘scatole nere’’ di cui non si
conosce il funzionamento. Quindi grazie questo metodo i ricercatori possono
conoscere la realtà in modo molto approfondito e sono in grado di formulare
le loro teorie in un modo chiaro ed esplicito (Parisi, 1999).
Infine, un altro pregio della simulazione è l’aver reso possibile l’incontro
fra diverse discipline, sia per quanto riguarda il metodo di ricerca scelto sia
per i temi di studio, che si sono rivelati, in alcuni casi, di carattere multidisciplinare. I temi unificanti che sono emersi dai vari studi sono i seguenti
(Conte, 1998):
• l’emergenza, cioè la manifestazione spontanea di fenomeni inaspettati
a partire da modelli conosciuti;
25
1. COMPLESSITÀ E SIMULAZIONE
• la complessità, che si può concretizzare, ad esempio, nella formazione
di organizzazioni oppure nella specializzazione funzionale;
• l’evoluzione degli agenti e dei sistemi in risposta all’ambiente circostante;
• la distribuzione, ovvero la condivisione di proprietà e comportamenti
da parte delle unità del modello;
• la comunicazione, che è necessaria al coordinamento ed alla diffusione
di regolarità.
1.9
I problemi della simulazione
Il più noto dei problemi legati all’uso della simulazione riguarda l’interpretazione dei dati che sono originati dal modello, una questione approfondita nel
paragrafo seguente. Da un lato, se questi ultimi non confermano le ipotesi
iniziali, è difficile capire se il risultato sia attribuibile ad un errore di specificazione del modello o semplicemente ad uno di programmazione; dall’altro
lato, se le ipotesi sono confermate, risulta difficoltoso affermare l’adeguatezza dei risultati, perché oltre a quelli espliciti possono essercene anche altri
impliciti.
Un secondo tipo di problema riguarda la progettazione del modello. Pur
avendo il vantaggio di usare linguaggi di programmazione non particolarmente difficili, questa fase ha un primo tipo di costo che può essere misurato
nel tempo dedicato alla progettazione del modello, in quanto è necessario
imparare il linguaggio da usare; dopo aver scritto il codice si presenta un
altro costo, rappresentato dal tempo impiegato a controllare che non ci siano
errori nel programma.
Un ulteriore problema consiste nella definizione delle assunzioni relative
ai diversi aspetti delle realtà che si studiano e nella scelta del modello e dei
26
1. COMPLESSITÀ E SIMULAZIONE
valori da assegnare ai parametri, che possono richiedere del tempo, necessario
all’utilizzatore per scegliere la migliore delle possibilità.
Infine, un ultimo problema riguarda il realismo della simulazione, definito
in Conte (1998) come la trappola della verosimiglianza. La simulazione rappresenta una semplificazione della realtà, individuando i fattori fondamentali
che determinano i fenomeni oggetto di studio, e ogni miglioramento che si
vuole portare richiede maggiori sforzi di progettazione. Tuttavia è anche importante trovare il giusto bilanciamento tra i dettagli necessari e quelli che
non lo sono, per non correre il rischio di fare un’errata specificazione e creare
un modello che non è in grado di rappresentare la realtà studiata.
1.10
L’interpretazione dei modelli
Il problema dell’interpretazione dei risultati di una simulazione ha una grande
importanza perché, come argomentato in Axtell e Epstein (1994), se non si
è in grado di comprendere i sistemi complessi artificiali meglio di quanto si
riesce a fare per quelli reali non si è giunti a nessun miglioramento.
Per rendere comprensibili per se stessi e per gli altri i modelli è necessario
seguire alcune indicazioni descritte in Gilbert e Terna (2000).
Occorre innanzitutto considerare gli agenti come degli oggetti, cioè parti
di codice informatico in grado di contenere dati e regole su come agire su
essi; queste regole forniscono la spiegazione di come gli agenti reagiscono ai
messaggi provenienti dall’ambiente esterno.
Inoltre è necessario osservare sia il comportamento individuale degli agenti, determinato dalle variabili di stato di ognuno di essi, sia il comportamento che emerge dalle loro interazioni a livello aggregato. In Terna (1998)
si afferma che, da un punto di vista metodologico, possono esistere due tipi di emergenza: l’emergenza imprevista, ma in qualche modo prevedibile,
cioè quando all’interno del modello compare un comportamento ricorrente
27
1. COMPLESSITÀ E SIMULAZIONE
le cui cause sono nascoste all’interno della struttura stessa del modello, e
l’emergenza imprevedibile, che si manifesta quando i dati di un esperimento
hanno caratteristiche simili a quelli di un fenomeno caotico; il caos è osservabile nei fenomeni economici e sociali, ma non è facile tentare di riprodurlo
in un modello ad agenti.
Infine, occorre valutare se la simulazione ha successo e per fare ciò si
potrebbe utilizzare un metodo matematico-statistico, ma siccome potrebbe
risultare difficile da applicare ad un modello computazionale, spesso si utilizzano criteri differenti. Un primo modo consiste nel confrontare ciò che si
conosce del comportamento degli agenti appartenenti al modello con le loro
reali azioni durante la simulazione.
Un metodo di valutazione più rigoroso è rappresentato dall’esame degli
effetti degli agenti a livello aggregato, considerando le strutture ed i gruppi
che emergono; secondo Axtell e Epstein (1994) i modelli ad agenti possono
essere classificati in base a quattro livelli:
Livello 0, se il modello è una caricatura della realtà, come stabilito tramite
l’utilizzo di semplici dispositivi grafici.
Livello 1, se il modello è conforme qualitativamente con le macro-strutture
empiriche, come dimostrato se si tracciano le distribuzioni di alcune
caratteristiche della popolazione di agenti.
Livello 2, se il modello è conforme quantitativamente con le macro-strutture
empiriche, come stabilito da procedure statistiche.
Livello 3, quando il modello mostra coerenza qualitativamente e quantitativamente con le micro-strutture empiriche determinate da analisi
cross-section sugli agenti della popolazione.
Questi livelli sono progressivi, perciò se un modello presenta performance
di livello n conseguentemente sarà soddisfacente anche al livello n−1.
28
1. COMPLESSITÀ E SIMULAZIONE
I risultati della simulazione riguardanti il comportamento collettivo potrebbero risultare difficili da comprendere tanto quanto la stessa realtà; questo problema è simile a quello incontrato nella vita artificiale riguardante la
comprensione dei legami tra il genotipo e il suo fenotipo1 . In questo ambito l’idea fondamentale è che il comportamento degli agenti è semplice ma
si adatta all’ambiente esterno e alle relazioni con gli altri agenti, perciò è
possibile che dalle interazioni emergano fenomeni complessi e inattesi.
Nel problema dell’interpretazione del modello è necessario includere anche la comprensione del programma utilizzato per far funzionare il modello
al computer (Axtell e Epstein, 1994), per verificare che esso faccia ciò che
l’utilizzatore desidera e che non ci siano delle imprecisioni dovute alla disattenzione del programmatore, ad esempio errori nell’indicizzazione delle
matrici usate dagli agenti.
1.11
Gli agenti
Wooldridge e Jennings (1995) sostengono che la definizione più generale che
può essere data al termine agente consiste nel considerarlo un sistema computazionale posto in un certo ambiente dotato delle seguenti caratteristiche:
• autonomia, che gli consente di operare senza la necessità di un intervento umano;
• abilità sociale, cioè capacità di interagire e comunicare con altri agenti;
• reattività, che gli permette di reagire in modo tempestivo ai cambiamenti dell’ambiente circostante;
• capacità di prendere iniziative guidate da obiettivi interni, o pro-attività.
1
vedi paragrafo 1.5.1
29
1. COMPLESSITÀ E SIMULAZIONE
Secondo coloro che studiano l’intelligenza artificiale, l’agente è un sistema
computerizzato che, oltre a possedere le caratteristiche sopra descritte, è
concepito usando concetti che sono abitualmente applicati agli esseri umani.
Ad esempio, è possibile definire gli agenti usando caratteristiche come la
conoscenza, le opinioni, le intenzioni, i desideri e i doveri.
Una teoria soddisfacente degli agenti deve essere in grado di illustrare
in modo approfondito tutti gli attributi sopra considerati e di mostrare in
che modo sono collegati questi ultimi; ad esempio, dovrà specificare come
l’ambiente influisce sul comportamento dell’agente e come gli obiettivi e le
informazioni guidano le sue azioni.
È possibile effettuare una classificazione generale degli agenti usati in una
simulazione in base ai loro meccanismi di decisione, alla capacità di adattamento e di apprendere; se gli agenti sono privi di capacità di apprendimento
sono detti ‘‘senza mente”, in caso contrario ‘‘con mente”. Inoltre si può effettuare una distinzione anche secondo l’ambiente in cui si trovano, che può
essere neutrale o strutturato, cioè dotato di regole precise a cui gli agenti
devono attenersi. Ne consegue che gli agenti possono essere raggruppati in
quattro categorie (Terna, 2003a):
1. agenti ‘‘senza mente’’ in un ambiente neutrale, o non strutturato;
2. agenti ‘‘senza mente’’ in un ambiente strutturato;
3. agenti ‘‘con mente’’ in un ambiente neutrale;
4. agenti ‘‘con mente’’ in un ambiente strutturato.
Nel primo caso, agenti senza mente in ambiente neutrale, si osserva che
dalla simulazione emerge un fenomeno complesso, con elementi di caos generati indirettamente dagli agenti; in questi tipi di esperimenti si possono
30
1. COMPLESSITÀ E SIMULAZIONE
notare due tipi di emergenza, quella imprevista e quella imprevedibile, illustrate nel paragrafo 1.10. Tuttavia i fenomeni provocati da agenti di questo
tipo non sono realistici, perciò sono di scarso interesse scientifico.
Al contrario, se si inseriscono agenti senza mente in un ambiente strutturato, ad esempio la borsa, si nota che si creano fenomeni complessi che
originano risultati realistici grazie alla presenza di un ambiente con regole.
L’aspetto interessante di questo esempio è che l’emergenza di situazioni complesse è dovuta alle caratteristiche dell’ambiente e non a quelle degli agenti
operanti.
Nel terzo caso si presentano agenti con mente in un ambiente neutrale.
In questa situazione gli agenti economici sono in grado di imparare ad agire
in modo coerente, conoscendo a mano a mano quali sono le conseguenze
che derivano da una particolare azione; per un osservatore esterno gli agenti
di questo tipo sembrano operare seguendo obiettivi e strategie interne, ma
in realtà sono guidati soltanto da semplici regole e il loro comportamento
è dovuto soltanto alla loro capacità di adattamento. I risultati indicano
l’emergere di un ordine in linea con la prospettiva dell’ordine spontaneo di
Hayek.
Infine, utilizzando agenti con mente in un ambiente strutturato si va incontro all’emergenza di fenomeni complessi come nel secondo caso; inoltre in
questa situazione gli agenti si adattano ed imparano e sono in grado di determinare risultati importanti anche a livello individuale, sviluppando strategie
che ad un osservatore esterno possono sembrare non ovvie.
31
Capitolo 2
Gli strumenti per la simulazione
In questo capitolo si presentano Swarm, NetLogo, e RePast, alcuni strumenti
con i quali è possibile costruire all’interno del computer modelli di simulazione
ad agenti.
Tra essi Swarm è quello che vanta la maggior diffusione e la maggior robustezza del codice (Terna, 2003a) ed è presentato in modo più approfondito,
perché è il protocollo di programmazione su cui si basa jES (java Enterprise
Simulator), che sarà descritto nel capitolo 4.
Su NetLogo e RePast sono fornite soltanto alcune informazioni che consentono di comprendere come è strutturato l’ambiente di simulazione.
2.1
Swarm
Il progetto Swarm1 nasce nel 1994 dall’idea di Chris Langton ed è successivamente sviluppato all’interno dell’Istituto degli Studi sulla Complessità di
Santa Fe.
Swarm è una piattaforma informatica con cui è possibile effettuare simulazioni di sistemi complessi adattivi; l’unità base della simulazione è lo sciame,
1
Disponibile alla pagina web http://www.swarm.org e http://wiki.swarm.org
32
2. GLI STRUMENTI PER LA SIMULAZIONE
che è definito come un insieme di agenti che eseguono una serie di azioni.
Swarm offre delle librerie di componenti con le quali si possono costruire
modelli e analizzarli.
Figura 2.1: Logo di SWARM
In Minar, Burkhart, Langton e Askenazi (1996) si legge che uno dei principali motivi della nascita del progetto Swarm è l’esigenza di disporre di uno
strumento versatile per lo studio dei sistemi complessi che possa essere facilmente comprensibile ed utilizzabile dai ricercatori di diverse discipline; il
progetto deve pertanto la sua nascita al lavoro congiunto di più studiosi, che
hanno avuto come obiettivo primario la creazione di una ‘‘lingua franca della
simulazione ad agenti” (Terna, 2003a).
Prima della sua creazione nell’ambito dello studio dei sistemi complessi
era presente un grande numero di modelli di simulazione, che risultavano di
difficile interpretazione e comprensione per chi tentasse di avvicinarsi allo
studio di un particolare fenomeno. Il motivo principale è che le piattaforme
di simulazione esistenti erano molto specifiche e contenevano un numero di
assunzioni implicite che erano chiare soltanto ai creatori del software.
Swarm presenta il vantaggio di poter essere utilizzato in diverse area di
ricerca, ad esempio nella chimica, nell’ecologia, nell’economia e nelle scienze
33
2. GLI STRUMENTI PER LA SIMULAZIONE
sociali, grazie al fatto che il codice informatico relativo al comportamento
degli agenti deve essere integralmente scritto dall’utilizzatore; il progetto
infatti fornisce soltanto le funzioni generiche di gestione del tempo, dei cicli
di funzionamento e di interazione grafica con l’utente.
2.1.1
Sviluppo di una simulazione
Il formalismo adottato da Swarm prevede un insieme di agenti che interagiscono tra loro mediante eventi. L’agente è l’oggetto principale all’interno di
una simulazione e può generare eventi che interessano se stesso o altri agenti.
Il verificarsi degli eventi è regolato da un calendario interno che descrive
le azioni nel preciso ordine in cui devono essere eseguite; il tempo avanza solo
nel momento in cui gli eventi inseriti nella sequenza sono stati eseguiti.
La componente che organizza gli agenti è detto sciame (o swarm) e rappresenta un intero modello, in quanto contiene gli agenti e la rappresentazione
del tempo, vale a dire una sequenza di attività che devono essere eseguite.
Gli sciami possono essere anche agenti, oltre che i loro contenitori; un
agente per definizione è costituito da un insieme di regole e di capacità di risposta agli stimoli ma, come si legge in Minar, Burkhart, Langton e Askenazi
(1996), può essere allo stesso tempo anche uno sciame, cioè una collezione di
oggetti e di sequenze di azioni da svolgere. In questa situazione il comportamento dell’agente è definito dalle interazioni che si svolgono all’interno dello
sciame.
Un semplice esempio di quanto esposto si può avere nel caso di una simulazione di carattere economico; se si sceglie di studiare un distretto industriale,
si ottiene che lo sciame è composto dalle aziende che compongono il distretto
e ogni azienda rappresenta un agente con un proprio comportamento. Ma si
può raggiungere un livello di dettaglio maggiore del sistema economico se si
afferma che ogni impresa appartenente al distretto è anch’essa uno sciame:
34
2. GLI STRUMENTI PER LA SIMULAZIONE
infatti può essere composta da agenti che rappresentano, per esempio, le unità produttive, gli impiegati e gli operai, e ha un calendario interno distinto
da quello del modello generale. Nel caso si volesse studiare il comportamento
dei singoli agenti all’interno di un’impresa, per analizzare ad esempio il ruolo
dell’imprenditore, si potrebbe creare uno sciame che lo rappresenta, formato da agenti che determinano il suo comportamento generale e un orologio
interno che indica gli eventi da svolgere. Si creerebbe in questo modo una
gerarchia di modelli interdipendenti tra loro.
Per effettuare una simulazione in qualsiasi ambito di ricerca occorre portare a termine una serie di azioni che possono essere riassunte in uno schema
generale:
• l’utilizzatore deve definire gli agenti e stabilire le regole che definiscono
il loro comportamento; inoltre deve decidere quali relazioni intercorrono
tra loro;
• in seguito deve inserire tutti gli agenti all’interno di uno sciame, descrivendo un elenco di attività da svolgere con l’indicazione dei tempi in
cui devono essere portate a termine;
• il ricercatore deve anche definire quali strumenti utilizzare per osservare
l’andamento della simulazione (grafici, statistiche, ...); essi sono messi a
disposizione dalle librerie di Swarm e sono anch’essi agenti appartenenti
ad uno sciame, detto observer. Il motivo del ricorso a questa opzione
dipende dal fatto che il fine ultimo dei ricercatori non è far funzionare il
modello, ma analizzare la nascita e l’evoluzione dei fenomeni complessi
nei mondi da loro costruiti;
• dopo aver definito e combinato il model e l’observer, l’apparato di
simulazione è completo ed è possibile far ‘‘funzionare” l’universo creato.
35
2. GLI STRUMENTI PER LA SIMULAZIONE
Dallo schema proposto risalta il fatto che la struttura di Swarm è composta da due livelli differenti (Terna, 1998): al primo livello si ha il modello
(model ), che rappresenta il fenomeno che si vuole analizzare, al secondo l’osservatore, (observer ) che considera il modello come un unico oggetto con
il quale interagisce per ottenere i risultati richiesti dagli strumenti che il
ricercatore utilizza per analizzare il mondo creato.
Riprendendo l’esempio precedente sul distretto industriale, nella Figura 2.2 è mostrato un esempio sintetico della struttura della simulazione. Nel
model sono presenti gli agenti, cioè le industrie, e un gestore del tempo che
contiene le azioni da svolgere; nell’observer vi sono altri tipi di agenti, vale a
dire gli strumenti di controllo del modello, e un altro gestore del tempo. Sia
il model sia l’observer sono sciami.
Figura 2.2: Struttura di una simulazione
2.1.2
Caratteristiche principali
La struttura di Swarm è realizzata con il linguaggio di programmazione ad
oggetti Objective C. Questo stile di programmazione consiste nella definizione
36
2. GLI STRUMENTI PER LA SIMULAZIONE
di varie classi di oggetti; un oggetto è la combinazione di variabili di stato, che
ne definiscono le caratteristiche interne, e di metodi, che ne rappresentano il
comportamento.
Dalla versione 2.0 di Swarm gli utilizzatori possono scrivere i modelli
con il linguaggio Java, creato dalla Sun Microsystem; i vantaggi principali
di questo linguaggio sono la scarsa possibilità di creare errori all’interno del
modello e la sua grande diffusione (Johnson e Lancaster, 2000).
Le caratteristiche più importanti della programmazione object-oriented
dal punto di vista dell’utilizzo di Swarm sono l’incapsulamento e l’ereditarietà, che permettono di creare software utilizzabili in più situazioni richiamando semplicemente la classe di una libreria che si vuole utilizzare.
Secondo il principio dell’incapsulamento i dettagli interni di un oggetto sono protetti e non possono essere messi a disposizione dell’utente, ad
eccezione di quei metodi che sono scritti con l’obiettivo di trasmettere informazioni all’esterno. Come spiegato in Sciabarrà (2003), la programmazione
object-oriented applica all’informatica dei concetti che sono comuni nel modo
in cui le persone considerano gli oggetti fisici. Prendendo una semplice radio
come esempio di oggetto, possiamo notare che presenta la caratteristica di
essere incapsulato: infatti, per poterla utilizzare non occorre essere esperti
di elettronica, è sufficiente agire sui pulsanti; la stessa cosa avviene nel caso
degli oggetti informatici, dal momento che gli utenti possono agire solo sui
metodi che sono messi a loro disposizione dall’oggetto, senza dover conoscere
le sue caratteristiche interne.
L’ereditarietà permette che ogni sottoclasse erediti le variabili ed i metodi
della classe base, che è chiamata superclasse. In questo modo si può creare
una classe che contiene i metodi della classe di livello superiore e ne aggiunge
di nuovi. Tornando all’esempio della radio, possono essercene di diverse tra
loro che hanno una maggiore ricezione o un altoparlante più potente; queste
37
2. GLI STRUMENTI PER LA SIMULAZIONE
ultime ereditano le caratteristiche di base dalla radio normale, che, con una
metafora informatica, potrebbe essere definita la superclasse delle radio.
2.1.3
Le ‘‘sonde’’
Le sonde, o probes, permettono all’utilizzatore di interagire con gli oggetti
della simulazione osservando e modificando i valori delle variabili; il loro
maggior vantaggio sta nel non dover aggiungere nuovo codice informatico
per poterle utilizzare.
Una sonda è una finestra rettangolare nelle cui righe sono descritti gli
attributi dell’oggetto preso in considerazione; i dati mostrati possono riguardare il modello in generale oppure possono rappresentare le informazioni di
un semplice agente che opera all’interno del modello. Tutti i progetti costruiti con Swarm hanno almeno due sonde: quella del ModelSwarm, che
indica i parametri del modello, e quella dell’ObserverSwarm, che contiene
le caratteristiche degli strumenti utilizzati per analizzare l’andamento della
simulazione.ella Figura 2.3 sono mostrati due esempi di sonde di model e
observer.
Figura 2.3: Esempi di sonde
38
2. GLI STRUMENTI PER LA SIMULAZIONE
2.1.4
Le librerie di Swarm
Le librerie di Swarm hanno due funzioni principali: elencano una serie di classi che i costruttori del modello possono utilizzare e sono impiegate per creare
delle sottoclassi più specifiche per le particolari finalità della simulazione.
In Minar, Burkhart, Langton e Askenazi (1996) le librerie sono suddivise
in due gruppi: da un lato quelle fondamentali per ogni modello di simulazione, swarmobject, activity e simtools, dall’altro le librerie di supporto, utili per
la creazione di modelli che rispondano a particolari esigenze, defobj, collections, random, tkobjc.
La libreria swarmobject contiene le classi principali su cui si basano gli
agenti creati nel modello. Questa libreria contiene la classe SwarmObject,
dalla quale tutti gli agenti ereditano il loro comportamento, e la classe Swarm,
che è utile per la scrittura del ModelSwarm e dell’ObserverSwarm.
La libreria activity permette la definizione del calendario degli eventi e
supporta l’esecuzione della simulazione.
Infine, l’ultima libreria specifica è simtools, un insieme di classi che controllano l’intero svolgimento della simulazione. Le classi contenute in questa
libreria possono, ad esempio, creare grafici riassuntivi ed elaborare statistiche.
Passando al secondo gruppo di liberie, defobj definisce le indicazioni standard per la creazione degli oggetti, per l’archiviazione di dati e per il trattamento degli errori.
La libreria collections mette a disposizione le classi utili per seguire gli
oggetti, per esempio mappe e liste.
La libreria random offre all’utente una serie di classi che generano numeri
casuali e che possono trasformare sequenze di numeri casuali in numerose
distribuzioni di probabilità. Nella simulazione al computer la fase della gene-
39
2. GLI STRUMENTI PER LA SIMULAZIONE
razione di numeri casuali è molto importante, in quanto influenza i risultati
finali, pertanto è fondamentale evitare di utilizzare generatori di numeri con
distorsioni o correlazioni tra loro.
L’ultima libreria del supporto di base di Swarm è tkobjc, che contiene gli
oggetti base per la creazione di un’interfaccia per l’utente; con le sue classi è
possibile creare bottoni, istogrammi e grafici.
In aggiunta alle librerie base richieste per la simulazione ci sono molte altre librerie che possono essere utilizzate per la costruzione di particolari modelli. Esistono librerie che supportano gli spazi bidimensionali, gli algoritmi
genetici e le reti neurali.
La libreria space è utile nella costruzione di ambienti in cui gli agenti
interagiscono tra loro; è prevista la definizione di uno spazio a due dimensioni, simile ad una griglia di punti nella quale sono collocati gli oggetti della
simulazione.
Infine, ga rappresenta la prima libreria creata dal gruppo di utilizzatori
di Swarm e consente l’uso di algoritmi genetici, mentre neuro permette di
utilizzare le reti neurali artificiali.
2.2
NetLogo
NetLogo2 è un ambiente per la simulazione di fenomeni naturali e sociali
scritto in Java.
Nasce nel 1999 dall’unione di StarLisp e Logo. Dal primo, un parallelo del
Lisp, eredita la struttura a più agenti, mentre dal secondo deriva la possibilità
di controllare una ‘‘tartaruga’’ (turtle); Logo era molto popolare per l’ottima
grafica, ma aveva il difetto, superato da NetLogo, che nel modello poteva
esserci una sola tartaruga. NetLogo rappresenta inoltre il risultato degli
2
Disponibile alla pagina web http://ccl.northwestern.edu/netlogo
40
2. GLI STRUMENTI PER LA SIMULAZIONE
studi su StarLogoT fatti dai suoi creatori, che hanno riscritto completamente
il linguaggio e ridisegnato l’interfaccia grafica.
Figura 2.4: Logo di NetLogo
Gli utilizzatori possono inserire istruzioni per gli agenti indipendenti che
operano in parallelo nel modello; questo rende possibile l’analisi delle connessioni tra i comportamenti individuali degli agenti e la caratteristiche che
emergono dall’interazione di popolazioni di individui.
Gli studi di fenomeni complessi effettuati con NetLogo possono interessare
una grande varietà di ambiti di studio, quali, per esempio, le scienze naturali,
la biologia, la medicina, la matematica, le scienze sociali, l’economia e la
psicologia.
2.2.1
Caratteristiche principali
Il mondo di NetLogo è popolato da agenti che seguono le istruzioni impartite
dall’utilizzatore. Nel modello possono esserci tre tipi di agenti (Wilensky,
1999):
• la tartarughe, turtles, che si muovono ed interagiscono tra loro nel mondo in cui si trovano; si possono anche definire diversi tipi di tartarughe, in modo da associare ad essi differenti variabili e comportamenti
e valutare i fenomeni che emergono dalla loro interazione;
• i patch, che sono delle sezioni quadrate di uno spazio continuo a due
dimensioni in cui le tartarughe si possono muovere. I patch hanno
delle coordinate chiamate pxcor, per la dimensione orizzontale, e pycor,
41
2. GLI STRUMENTI PER LA SIMULAZIONE
per la dimensione verticale; il patch al centro del mondo ha coordinate
(0, 0). Il mondo in cui si trovano le tartarughe non è limitato, è un
toroide, perciò se una tartaruga si muove oltre il limite sinistro del
mondo scompare per poi riapparire all’estremo destro della zona che
rappresenta il mondo;
• l’observer, che osserva ciò che accade nel modello; quando si avvia
il modello non esistono tartarughe ed è compito dell’observer crearne
nuove.
Un’importante e nuova caratteristica del linguaggio di NetLogo è l’introduzione dell’agentset, o collezione di agenti, che permette la definizione di un
insieme di agenti aventi le stesse caratteristiche e lo stesso comportamento.
Un agentset può essere costituito da un insieme di più tartarughe o di più
patch di un certo tipo, ad esempio solo tartarughe rosse oppure una colonna
di patch, cioè una serie di patch con la stessa coordinata per l’ascissa.
Oltre alle speciali strutture che supportano il modelli formati da più agenti, NetLogo prevede anche le altre possibilità della programmazione standard
come ad esempio i cicli, le condizioni, le recursioni e le liste.
2.2.2
Obiettivi futuri
In Tisue e Wilensky (2004) si legge che gli obiettivi per il futuro riguardano
l’aumento della velocità di simulazione e una maggiore estendibilità.
Per quanto riguarda il secondo aspetto, NetLogo è nato con la caratteristica di ‘‘piattaforma chiusa”: gli utilizzatori non potevano modificarlo o
controllarlo con codice esterno. I primi miglioramenti si sono avuti con la
versione 2.0.1, nella quale è presente un’interfaccia per le estensioni che consente all’utente di inserire nuovi elementi al modello base; per esempio è ora
possibile far produrre un suono agli agenti usando le capacità midi di Java.
42
2. GLI STRUMENTI PER LA SIMULAZIONE
Tra gli obiettivi delle future versioni del software si ricordano:
• la creazione di 3-D NetLogo, che al linguaggio base aggiunge la grafica
tridimensionale;
• ulteriori miglioramenti nel codice informatico;
• una maggiore flessibilità degli agenti.
2.3
RePast
RePast3 , acronimo per REcursive Porous Agent Simulation Toolkit, è uno
strumento per la simulazione ad agenti scritto completamente in Java e simile
a Swarm creato dal Social Science Research Computing dell’Università di
Chicago.
Questo software offre una libreria di classi utili per creare e far funzionare
i modelli di simulazione e per l’uso di grafici che visualizzino i risultati.
Figura 2.5: Logo di RePast
Inizialmente RePast era stato concepito con l’idea di creare una serie
di librerie Java da affiancare a Swarm per semplificarne l’utilizzo; tuttavia
questo progetto venne abbandonato nel momento in cui uscì la versione Java
di Swarm, in quanto RePast rappresentava soltanto un doppione. Pertanto
lo sviluppo di questo software è continuato in modo indipendente da Swarm
all’interno dell’Università di Chicago ed anche in altri ambienti di ricerca.
3
Disponibile alla pagina web http://repast.sourceforge.net/index.php
43
2. GLI STRUMENTI PER LA SIMULAZIONE
2.3.1
Obiettivi
In Collier (2003) si legge che gli obiettivi principali dei creatori di RePast
sono il raggiungimento di un buon livello di astrazione della struttura della
simulazione, l’estendibilità, e la performance ‘‘good enough’’.
L’astrazione è una delle caratteristiche più importanti di RePast, che
astrae la maggior parte degli elementi chiave della simulazione ad agenti e li
rappresenta in classi Java. La versione 1.4 di RePast offre una serie di classi
per molte delle più comuni astrazioni della simulazione ad agenti, come ad
esempio le sequenze e la raccolta di dati, componenti utili alla costruzione di
rappresentazioni.
L’estendibilità è resa possibile dall’uso del linguaggio Java, in quanto
la programmazione ad oggetti permette la creazione di strutture estendibili
grazie alle proprietà dell’ereditarietà e dell’incapsulamento.
Il concetto della performance ‘‘good enough’’ si riferisce al livello delle
prestazioni di RePast in rapporto agli altri benefici di questo strumento di
analisi. L’attenzione maggiore dei creatori di RePast è concentrata sulla
minimizzazione del numero di oggetti creati e sulla velocità della simulazione,
che si basa principalmente sui miglioramenti che saranno portati alla Java
Virtual Machine.
2.3.2
Caratteristiche della simulazione
Con RePast è possibile realizzare una simulazione concepita come una state machine costituita dagli stati di tutte le sue componenti; queste ultime
possono essere divise in due gruppi, l’infrastruttura e la rappresentazione.
L’infrastruttura rappresenta tutti i meccanismi che permettono di far funzionare la simulazione, come ad esempio mostrare e raccogliere dati. Lo stato
dell’infrastruttura è lo stato dei grafici e degli oggetti che raccolgono dati.
La rappresentazione è ciò che l’utilizzatore della simulazione costruisce,
44
2. GLI STRUMENTI PER LA SIMULAZIONE
cioè il modello. Lo stato della rappresentazione è lo stato degli agenti appartenenti al modello, indicato dai valori delle loro variabili e dello spazio in cui
operano.
Qualsiasi modifica agli stati dell’infrastruttura e della rappresentazione
sono realizzati attraverso un calendario; questo meccanismo permette una
grande flessibilità per l’utilizzatore della simulazione.
L’unità di tempo usata dal simulatore è, come in Swarm, il tick e il
passare del tempo è scandito dall’esecuzione delle attività programmate nel
calendario; durante la simulazione si passa al tick successivo solo nel momento
in cui l’azione programmata per un dato tick si è conclusa, perciò in RePast i
tick rappresentano soltanto un modo per far trascorrere gli eventi in un certo
ordine.
Una tipica simulazione costruita con RePast è composta da una serie di
agenti, che possono essere omogenei oppure inseriti all’interno di una gerarchia, e da un modello che controlla che gli agenti eseguano i loro comportamenti secondo il calendario interno. Il calendario ha anche il compito
di controllare gli eventi all’interno del modello, ad esempio aggiornando il
monitor e raccogliendo dati, e può essere può essere creato internamente al
modello o esternamente da parte dell’utilizzatore.
Nel formalismo di RePast gli eventi sono chiamati azioni (Collier, 2003).
2.3.3
Le librerie
RePast è composto da 210 classi Java organizzate nelle seguenti librerie:
• la libreria analysis contiene le classi che sono usate per raccogliere dati
e rappresentarli su grafici;
• le classi contenute nel pacchetto engine sono responsabili dell’organizzazione e del controllo di una simulazione;
45
2. GLI STRUMENTI PER LA SIMULAZIONE
• le classi del pacchetto event sono usate internamente da RePast e sono
incaricate, insieme ad alcune della libreria engine, della comunicazione
tra le parti interne del modello non di competenza del calendario della
simulazione;
• la libreria games contiene le classi utili a simulare giochi cooperativi
come il dilemma del prigioniero;
• le classi gui sono responsabili della visualizzazione grafica della simulazione e della possibilità di creare delle animazioni del modello con
QuickTime;
• la libreria network contiene le classi incaricate di creare la rete della simulazione; la classe interna NetworkFactory è usata per creare il
network o per caricarlo da un file;
• il pacchetto space contiene le classi che si occupano delle relazioni
spaziali e possono rappresentare vari tipi di spazio;
• la libreria util contiene classi che possono essere sfruttate sia internamente da RePast sia dall’utilizzatore; le più importanti sono la classe
Random, che contiene un grande numero di distribuzioni casuali, e
SimUtilities, in cui ci sono metodi per creare sonde e liste.
2.3.4
Progetti futuri
Il lavoro dei creatori di RePast è concentrato su Evolver, un rapido ambiente di simulazione che può essere composto da diverse parti, ad esempio da
modelli predefiniti e da componenti di analisi; tutto ciò che non è incluso nel
modello base può essere inserito usando il linguaggio NQPython (Not Quite
Python), simile a Python e più semplice di Java, specificamente creato per
integrare RePast.
46
Capitolo 3
Impresa, imprenditore e
conoscenza
In questo capitolo si presentano gli studi di diversi economisti che hanno avuto come oggetto l’impresa e le sue influenze sull’ambiente economico generale.
Nell’esposizione è riservata una particolare attenzione alla figura dell’imprenditore e al ruolo assunto dalla conoscenza, con l’obiettivo di comprendere l’importanza che hanno nell’impresa e nel sistema economico secondo le diverse
teorie presentate.
La teoria neoclassica ha presentato la figura dell’imprenditore considerandolo come un semplice fattore produttivo dell’impresa, il cui compito è
organizzare al meglio le risorse e scegliere la miglior funzione di produzione.
In piena contrapposizione con i neoclassici si trovano gli esponenti della
Scuola Austriaca, secondo i quali la figura dell’imprenditore è molto importante sia per l’impresa sia per il sistema economico in generale. L’imprenditore ha un ruolo di primo piano all’interno dell’impresa e il suo compito
è scoprire nuove opportunità di profitto nel mercato; questa funzione emerge anche dal significato etimologico del termine imprenditore, che deriva dal
verbo latino prehendo, il cui significato è ‘‘vedere, scoprire, percepire, ren-
47
3. IMPRESA, IMPRENDITORE E CONOSCENZA
dersi conto di qualcosa”. L’imprenditore inoltre ha la funzione di trasmettere
nuove conoscenze a tutti gli appartenenti al mercato, perciò nella visione
Austriaca ha una grande importanza per il sistema economico generale.
La visione della Scuola Austriaca è ripresa e approfondita da uno dei
suoi allievi, Israel M. Kirzner, che aggiunge degli elementi nuovi alla figura
dell’imprenditore, la cui principale caratteristica è la capacità di notare nel
mercato ciò che altri imprenditori non sono stati in grado di vedere e in
questo modo di sfruttare nuove occasioni di profitto.
Una nuova posizione emerge dagli studi di Herbert Simon sulle decisioni nelle organizzazioni, secondo i quali l’imprenditore agisce in condizioni
di razionalità limitata; questa situazione è causata dall’impossibilità per gli
individui di raggiungere il grado di conoscenza completa, che consentirebbe
loro di effettuare le scelte in modo perfettamente razionale. Perciò secondo Simon l’imprenditore non è in grado di prendere la decisione migliore
possibile, bensì la più soddisfacente in base alle informazioni di cui dispone.
3.1
La teoria neoclassica
Secondo la visione neoclassica l’impresa rappresenta un insieme di fattori che
sono utilizzati per produrre un bene che possa essere venduto ad un prezzo
almeno pari alla somma dei costi affrontati (Colombatto, 2001).
Il processo produttivo per ogni bene è una funzione a se stante all’interno dell’impresa ed agisce secondo meccanismi conosciuti che possono essere
modificati da eventuali variazioni delle variabili esogene, ad esempio il costo
dei fattori produttivi.
Nella prospettiva neoclassica non esistono l’incertezza e le asimmetrie
informative, infatti gli unici dubbi sul futuro riguardano i valori che le variabili esterne all’impresa possono assumere e non il funzionamento interno
o l’attività dell’imprenditore.
48
3. IMPRESA, IMPRENDITORE E CONOSCENZA
L’imprenditore ha il semplice ruolo di amministratore delle risorse, deve
scegliere la funzione di produzione che meglio si adatta all’impresa e verifica
che il funzionamento dell’impresa sia coerente al modello adottato. Le sue
responsabilità non comprendono la scoperta di nuove opportunità di profitto
o qualsiasi altra attività volta a produrre innovazioni; inoltre la perfetta
informazione non permette l’esistenza di imprenditori migliori di altri, che
siano cioè in grado di ottenere condizioni più vantaggiose nel mercato.
Tuttavia non è vero dire che l’impresa non è soggetta a nessun tipo di
incertezza, in quanto gli stessi neoclassici sostengono che il concetto di imprenditori tutti uguali è soltanto una finzione per rendere più semplice la
modellistica. In questo contesto se si considerasse l’esistenza di aleatorietà,
questa potrebbe essere eliminata dalla perfetta informazione, cioè dalla possibilità per gli imprenditori di conoscere tutte le caratteristiche degli eventi
che li potrebbero riguardare in modo da poter decidere la miglior strategia da
adottare. Ma le informazioni possono avere un costo e l’imprenditore sceglierà di non usufruirne più nel momento in cui la spesa generata sarà superiore
ai benefici creati.
Pertanto in Colombatto (2001) si sostiene che nell’ambito neoclassico è
possibile ottenere imprenditori e imprese diversi tra loro quando almeno una
delle seguenti ipotesi sia soddisfatta:
• gli imprenditori hanno una diversa percezione riguardo al beneficio generato dall’acquisto dell’informazione, pertanto le loro conoscenze si
distingueranno per contenuto e dimensione;
• a parità di spesa corrispondono insiemi di informazione distinti; in
questo caso gli imprenditori scelgono funzioni di produzione diverse
a seconda dell’informazione da loro posseduta.
Inoltre possono esistere elementi di incertezza legati anche alle risorse
49
3. IMPRESA, IMPRENDITORE E CONOSCENZA
interne all’azienda che, secondo l’impostazione neoclassica, possono essere
eliminati con l’acquisto di ulteriori informazioni.
Perciò si può concludere che l’imprenditore neoclassico è soggetto a due
forme di rischio, il rischio interno, che riguarda le variabili interne all’azienda, e il rischio esterno, che si riferisce alle variabili esogene.
L’idea di equilibrio della teoria neoclassica prevede il conseguimento di
profitti nulli sia nel caso di prodotti omogenei sia in presenza di prodotti
differenziati; in questo secondo caso l’azzeramento dei profitti è provocato
dall’entrata nel mercato di nuove imprese che, avendo notato la possibilità
di conseguire utili, cercano di cogliere le occasioni di profitto.
Ma non è sempre vero che i profitti dell’impresa neoclassica sono nulli,
perché se sono soddisfatte le ipotesi di incertezza sopra descritte è possibile
che esistano imprenditori migliori di altri che siano in grado di conseguire
profitti positivi anche in mercato concorrenziale. Tuttavia i profitti saranno
annullati con il passare del tempo, quando gli altri imprenditori imiteranno
le scelte del migliore, perciò nel medio-lungo termine soltanto delle variazioni
nelle variabili esogene possono causare differenziazioni tra le imprese.
Considerato in questo modo, il lungo periodo non è visto come un intervallo temporale esteso, ma come somma di più brevi periodi (Colombatto, 2001)
in cui possono avvenire dei cambiamenti che modificano l’assetto economico
generale.
3.2
La Scuola Austriaca
La Scuola Austriaca ha profondamente criticato la visione neoclassica dell’economia di mercato. Infatti, in contrasto con le assunzioni neoclassiche di
completa informazione e perfetto equilibrio, questa scuola di pensiero sostiene
che il sistema economico si trova perennemente in situazioni di disequilibrio,
50
3. IMPRESA, IMPRENDITORE E CONOSCENZA
dal momento che gli agenti operano in situazioni di incertezza e non conoscono tutti gli elementi dell’ambiente esterno che possono avere influenza su
di loro.
Il concetto di studio dell’economia secondo Mises, uno dei maggiori esponenti della Scuola Austriaca, è il seguente:
lo studio dell’economia non consiste nell’esame delle condizioni di
ottimo; bensì nell’analisi delle possibilità, in condizioni di incertezza, di allentare i vincoli tipici dell’attività economica − la scarsità delle risorse a disposizione dei produttori − e di accrescere la
soddisfazione dei consumatori, aumentando il loro potere d’acquisto e offrendo loro l’opportunità di acquistare nuovi beni e servizi,
in grado di soddisfare meglio le loro esigenze. (Colombatto, 2001,
14-15)
Secondo questa impostazione l’importanza dell’economia di mercato sta
nella capacità di creare le condizioni per cui gli agenti, o imprenditori, si
impegnino a superare i vincoli imposti dalle funzioni di produzione tramite
le innovazioni o con la ricerca di nuove opportunità, in modo da raggiungere
nuovi mercati e diversi tipi di domanda.
Secondo gli Austriaci l’attività imprenditoriale coincide con l’azione umana. Il significato etimologico della parola ‘‘imprenditore” illustrato nell’introduzione a questo capitolo aiuta a comprendere che, secondo la Scuola Austriaca, la sua attività consiste nel percepire e scoprire nuove opportunità nel
mercato e comportarsi in modo da ottenere un profitto.
L’attività imprenditoriale è un processo di apprendimento continuo, grazie alle scoperte degli agenti che generano nuove informazioni e nuove conoscenze; secondo la teoria Austriaca la conoscenza ha determinate caratteristiche (Huerta De Soto, 2003):
• è di tipo pratico;
51
3. IMPRESA, IMPRENDITORE E CONOSCENZA
• è esclusiva e dispersa nella mente di tutti gli uomini;
• è tacita e non articolabile;
• è trasmissibile.
La conoscenza imprenditoriale è definita pratica perché non è rappresentabile in modo formale, ad esempio con un modello matematico; la sua
principale caratteristica è che rappresenta tutte le informazioni che un agente considera importanti ai fini di una situazione in cui si trova. È possibile
acquisire nuove conoscenze attraverso concrete azioni umane.
Inoltre le conoscenze sono considerate esclusive perché il modo in cui la
mente degli uomini assimila e interpreta le informazioni è strettamente personale e varia da una persona all’altra. Perciò gli agenti che svolgono la
funzione di imprenditore lo fanno in modo assolutamente personale ed irripetibile, perché le decisioni adottate dipendono dalla loro personale visione
del mondo e dall’insieme di informazioni che non possono essere replicate da
nessun altro.
La conoscenza ha anche la caratteristica di essere dispersa, perché non
rappresenta un complesso di informazioni prestabilite e offerte alla comunità
nello stesso modo, ma è ottenibile da diverse fonti, quali, ad esempio, le
statistiche, i media o i libri.
L’ultima peculiarità della conoscenza è il fatto di essere tacita, in quanto
l’agente sa come effettuare determinate azioni, ma non conosce tutte le parti
e le caratteristiche di ciò che sta facendo; per comprendere meglio questa
caratteristica si riporta un esempio di Polanyi descritto in Huerta De Soto
(2003, 38):
È anche possibile citare, rifacendosi a Polanyi, l’esempio di
quella persona che impara ad andare in bicicletta cercando di
52
3. IMPRESA, IMPRENDITORE E CONOSCENZA
mantenere l’equilibrio muovendo il manubrio verso il lato dal quale sta per cadere, causando in tal modo una forza centrifuga che
tende a mantenerlo in equilibrio. Tutto ciò senza che nessun ciclista sia cosciente né conosca i principî fisici sui quali si basa la
sua abilità. Al contrario ciò che il ciclista utilizza è il suo ‘‘senso
di equilibrio” che gli indica, in qualche modo, come comportarsi
in ogni momento per non cadere.
È possibile comprendere il principio di conoscenza tacita prendendo come
esempio una sua manifestazione, l’intuizione, che è definita come ‘‘conoscenza
immediata delle cose ottenuta mediante una visione diretta di esse”; un’intuizione è difficile da spiegare agli altri individui, ed è per questo che la
conoscenza imprenditoriale è anche non articolabile.
Altri esempi di conoscenza tacita sono rappresentati dalle abitudini, dalle
tradizioni e dalle norme giuridiche e morali, a cui gli individui si adeguano
senza essere in grado di spiegare il ruolo che queste norme hanno nei processi
sociali in cui intervengono.
3.2.1
L’attività imprenditoriale
L’attività imprenditoriale è creativa, perché non comporta nessun costo per
la sua esecuzione e origina dei benefici che nascono dal nulla, che sono detti
benefici imprenditoriali puri.
Ogni atto imprenditoriale comporta tre effetti: crea informazioni nuove
che precedentemente non esistevano, permette la trasmissione delle informazioni sul mercato e, infine, fa sì che gli agenti imparino a comportarsi in
funzione delle necessità degli altri.
53
3. IMPRESA, IMPRENDITORE E CONOSCENZA
Creazione delle informazioni
Un’azione imprenditoriale consiste nella scoperta, da parte di un agente economico, di un’occasione di profitto sul mercato; grazie a questa scoperta si ha
la creazione dal nulla di una nuova informazione, che consiste semplicemente
nella conoscenza dell’esistenza dell’opportunità in questione.
La creazione di conoscenza può coinvolgere anche più di un solo soggetto,
infatti se si considera un’operazione di arbitraggio, come illustrato in Huerta De Soto (2003), gli agenti che apprendono nuove informazioni sono tre:
l’arbitraggista e i due soggetti da lui coinvolti. L’arbitraggista si rende conto
della possibilità di acquistare un bene ad un certo prezzo e rivenderlo o ad
uno superiore; il soggetto che vende impara che il suo bene ha un valore di
mercato maggiore di quello che gli era stato dato erroneamente; infine il soggetto che compra apprende che sul mercato esiste il bene di cui aveva bisogno
e grazie ad esso può intraprendere nuove iniziative.
La trasmissione delle informazioni
La creazione di informazioni comporta la sua immediata trasmissione nel
mercato.
Occorre ricordare che le informazioni, poiché sono percepite e trasmesse
dagli individui, non possono essere divise dallo scopritore e circolare indipendentemente. Si può perciò concludere che la trasmissione delle informazioni
nella società è tacita e soggettiva, cioè esse sono perfettamente comprensibili
a chi le diffonde, ma potrebbero non esserlo per tutti gli altri agenti presenti
sul mercato.
Il coordinamento
Grazie alle nuove informazioni gli agenti imparano ad agire in modo coordinato, modificando le loro attività in funzione dei bisogni degli altri; inoltre
54
3. IMPRESA, IMPRENDITORE E CONOSCENZA
apprendono senza rendersi conto e in un contesto in cui ognuno cerca di
conseguire i propri obiettivi.
Si può concludere che l’attività imprenditoriale è la funzione sociale per
eccellenza, perché rende possibile la vita degli agenti nella società adattando
e coordinando continuamente il loro comportamento.
Il processo di coordinamento sociale originato dall’attività imprenditoriale non si ferma mai, perché le informazioni che sono create modificano la
percezione degli obiettivi e dei mezzi degli altri imprenditori e creano nuove
opportunità ripristinando perciò il ciclo.
3.2.2
La competizione
L’attività imprenditoriale è per definizione competitiva, in quanto gli agenti
cercano continuamente nuove opportunità di profitto nei mercati per affermarsi nella società.
La competizione è pertanto intesa come un processo dinamico di rivalità,
in cui tutti gli imprenditori cercano di prevalere sugli altri, e non come il
modello di concorrenza perfetta in cui tutti vendono allo stesso prezzo.
3.3
L’imprenditore di Kirzner
Israel M. Kirzner, allievo di Mises, sviluppò notevolmente l’idea della funzione imprenditoriale della Scuola Austriaca.
Secondo Kirzner l’imprenditore è colui che è in grado di trovare occasioni
di profitto nei mercati e di trasformarle in fonte di reddito per se stesso e per
la comunità.
L’imprenditore kirzneriano cerca nel mercato imperfezioni che si possano
tradurre in attività fruttifere, ma la sua attività non si manifesta in un’assidua indagine degli errori compiuti dai rivali o delle occasioni da loro manca-
55
3. IMPRESA, IMPRENDITORE E CONOSCENZA
te, bensì in una costante attenzione dell’ambiente che lo circonda; infatti in
Kirzner (1997) si precisa che l’attività imprenditoriale consiste nel guardare
all’orizzonte senza sapere cosa si stia cercando e senza attuare una particolare
tecnica di ricerca, in attesa di sfruttare le scoperte che si presenteranno.
Nella visione kirzneriana e austriaca l’imprenditore esiste nel solo caso in
cui all’interno del mercato vi siano situazioni di disequilibrio o imperfezioni
di varia natura, grazie alle quali è possibile la presenza di occasioni di profitto, che sono viste come un segnale di vitalità imprenditoriale, di crescita
e miglioramento per il benessere collettivo. Pertanto quanto più è intenso lo
squilibrio nei mercati, tanto maggiori sono le opportunità di profitto per gli
agenti economici.
Il profitto è considerato in una nuova prospettiva, non è più il compenso per le capacità organizzative, perché questi incarichi non competono all’imprenditore, ma all’amministratore. Il profitto remunera la capacità dell’imprenditore di cogliere le opportunità di miglioramento prima ancora che
queste siano realizzate all’interno dell’azienda; anche se il guadagno si concretizza nel momento in cui si realizza l’attività nell’impresa, questo valore è
riferito all’atto precedente dell’imprenditore, alla ‘‘scoperta imprenditoriale”.
La teoria kirzneriana porta anche spunti di originalità alla figura dell’imprenditore delineata dagli Austriaci. Infatti questi ultimi sostengono che un
agente può decidere di dedicare del tempo all’attività imprenditoriale, al contrario Kirzner sottolinea che l’individuazione di occasioni profittevoli avviene
per caso, senza un’azione di ricerca alle spalle; se così non fosse, profitto sarebbe non solo la remunerazione della la scoperta, ma anche del tempo e delle
risorse impiegati nella ricerca.
Da queste osservazioni si può affermare che, secondo Kirzner, chiunque
può essere un imprenditore, in quanto l’unica qualità richiesta è l’alertness,
ossia vivacità, prontezza mentale, senza la necessità di mezzi di produzione.
56
3. IMPRESA, IMPRENDITORE E CONOSCENZA
Questa tesi tuttavia può creare alcune perplessità per due principali motivi (Colombatto, 2001). Da un lato, la conoscenza delle caratteristiche del
settore e dei potenziali consumatori può sicuramente costituire un vantaggio
per alcuni imprenditori a sfavore di altri. Dall’altro, se l’imprenditore non ha
una struttura produttiva alla quale appoggiarsi difficilmente vedrà realizzate
le occasioni scoperte nel mercato e pertanto non otterrà nessun profitto.
Pertanto è possibile rivedere la visione di Kirzner sostenendo che, a parità
di alertness, non tutti hanno le stesse possibilità di essere imprenditori di
successo.
3.4
Simon e la razionalità limitata
Herbert A. Simon propone, con le sue teorie, un modo nuovo per analizzare
le scelte fatte nelle organizzazioni capovolgendo le assunzioni neoclassiche
secondo le quali il decisore sceglie sempre la migliore delle possibilità. Lo
studio delle decisioni nelle organizzazioni può essere applicato anche allo
studio delle scelte all’interno delle imprese che, secondo Simon (1985), sono
organizzazioni formali.
La figura dell’imprenditore è studiata introducendo la teoria della razionalità limitata, secondo la quale in certe situazioni non è possibile avere una
conoscenza completa e pertanto le decisioni prese non sono le migliori, ma le
più soddisfacenti in base alle informazioni possedute.
L’idea della bounded rationality nasce dalla consapevolezza che il modello
classico dell’agire razionale non è più in grado di descrivere il comportamento
degli imprenditori, in quanto secondo Simon le decisioni sono prese in un
ambiente in cui è difficile valutare tutte le opzioni e le loro conseguenze
(Egidi, 2003).
Per illustrare il modo in cui i manager prendono le decisioni Simon fece
una serie di studi sui giocatori di scacchi, le cui mosse possono essere compa-
57
3. IMPRESA, IMPRENDITORE E CONOSCENZA
rate con le scelte imprenditoriali ma con il vantaggio di essere in un contesto
maggiormente dominabile rispetto a quello dell’impresa. Il giocatore di scacchi deve cercare in modo razionale la soluzione migliore e per fare ciò deve
avere essere in grado di prevedere le conseguenze che ogni spostamento della
pedina potrebbe generare. Tuttavia si pone il seguente problema:
In media, ad ogni data posizione in una partita di scacchi,
corrispondono circa trenta mosse possibili − in cifra tonda, considerando una mossa e le sue risposte, una media di circa 103
continuazioni della posizione data. Quaranta mosse non sono una
stima irragionevole della lunghezza media di una partita. Quindi
ci sarebbero circa 10120 possibilità di svolgimento di una partita di
scacchi. Ovviamente il numero esatto non ha importanza: un numero come 1040 sarebbe meno spettacolare, ma sufficientemente
grande per avallare le nostre conclusioni.
Studi sui processi decisionali degli scacchisti indicano attendibilmente che anche i giocatori forti guardano raramente ad un
centinaio di possibilità − cioè un centinaio di proseguimenti dalla posizione data − nella scelta di una mossa o di una strategia.
Cento è un numero ragionevolmente grande, rispetto ad altri parametri, ma è un po’ più piccolo di 10120 ! Gli scacchisti non prendono in considerazione tutte le strategie possibili scegliendo poi
la migliore, ma ne ipotizzano ed esaminano un numero piuttosto
piccolo, facendo una scelta appena ne trovano una che ritengono
soddisfacente. (Simon, 1985, 263-264)
Da queste righe si comprende come sia difficile per un giocatore di scacchi raggiungere la razionalità nelle decisioni, a causa del grande numero che
sarebbero necessarie. Simon conclude perciò che a maggior ragione la razionalità non è raggiungibile neanche nel mondo reale, perché in questo contesto
58
3. IMPRESA, IMPRENDITORE E CONOSCENZA
le variabili da conoscere sono di gran lunga più numerose rispetto a quelle
necessarie per una partita di scacchi.
Le ragioni per cui non è raggiungibile la completa razionalità nella realtà
sono l’incertezza sulle conseguenze che deriveranno dalle decisioni, il grande
numero di possibilità di scelta, le loro informazioni incomplete e la complessità dei calcoli necessari per valutare le diverse opzioni.
Un ulteriore ostacolo è rappresentato dalla difficoltà di previsione, perché
per gli individui può essere difficile descrivere completamente le conseguenze,
dal momento che la mente umana difficilmente è in grado di prevedere tutto
ciò che deriverà da una particolare scelta; questa motivazione emerge anche
dalla lettura dell’analisi di Simon sul gioco degli scacchi.
Per risolvere il problema dell’incompletezza della conoscenza si potrebbe
cercare di capire quali siano le variabili ed i fattori che hanno la maggiore importanza in relazione ad una determinata situazione (Simon, 1958). La scelta
si baserebbe perciò su quell’insieme di fattori e poterebbe essere considerata
razionale nel solo caso in cui non emergessero altri effetti non considerati
legati a quella decisione.
3.4.1
La razionalità procedurale
Simon introduce il concetto di razionalità procedurale nell’ambito dello studio
delle decisioni. Secondo questo principio non si prende più in esame la scelta
finale dell’individuo, ma il processo mentale che conduce ad essa. Un decisore è pertanto definito razionale se il suo comportamento è razionale in senso
procedurale. Il principio della razionalità procedurale è necessaria nel momento in cui si introduce nel modello di scelta l’incertezza, l’apprendimento
e la complessità.
Il processo di scelta segue delle regole che possono essere rappresentate
59
3. IMPRESA, IMPRENDITORE E CONOSCENZA
da semplici regole empiriche, o thumb rules, da routines complesse all’interno
dell’organizzazione, o da algoritmi computazionali.
Razionalità limitata e razionalità procedurale sono due aspetti dello stesso concetto (Avvisati, 2003), perché se si accetta l’idea che la razionalità
umana ha dei limiti è necessario introdurre un modello di comportamento
rule-follower, secondo il quale non è importante la scelta finale ma l’iter che
conduce ad essa.
3.4.2
Il processo di scelta
Nei casi in cui non è possibile raggiungere la completa razionalità per effettuare le scelte, il processo di formazione delle decisioni è caratterizzato
da quello che nella teoria dell’organizzazione è definito subgoal identification
(Simon, 1985). Secondo questo principio gli essere umani valutano le decisioni in base ad obiettivi subordinati, la cui formulazione è funzione delle
conoscenze, dell’esperienza e dell’ambiente organizzativo di chi decide.
I punti chiave del processo di scelta sono search e satisficing. La teoria
della ricerca prevede che se il decisore non dispone delle alternative per la
scelta deve cercarle. Durante la ricerca la massimizzazione dell’utilità può
non essere l’obiettivo guida, in quanto il soggetto può decidere un livello di
bontà che deve essere raggiunto dalle possibilità prese in esame; questo modo
di agire è definito statisficing, secondo cui l’individuo si indirizza sulla scelta
che raggiunge il livello di utilità prestabilito.
Con questo metodo è pertanto possibile effettuare delle scelte anche nel
caso in cui non si disponga di informazioni complete.
Questa teoria sovverte il modello classico secondo il quale per effettuare
una decisione è necessaria la completa conoscenza delle alternative e delle
loro conseguenze, modello più rigoroso ma che, come dimostrato da Simon,
non trova riscontro nella realtà.
60
Capitolo 4
jES: java Enterprise Simulator
Il modello java Enterprise Simulator (jES ) è una struttura interamente
basata sulla versione Java di Swarm, con la quale è possibile sviluppare modelli di simulazione di impresa per studiare l’attività di un’azienda reale o
per studiare la nascita e l’evoluzione di imprese ‘‘virtuali”, in una prospettiva
esclusivamente teorica.
Con la piattaforma jES è possibile effettuare lo studio del modo in cui
le scelte complesse sono trattate all’interno delle organizzazioni, in quanto
con esso si possono ricostruire le imprese reali all’interno del computer e
osservare il loro funzionamento durante tutte le fasi produttive. È inoltre
possibile effettuare il confronto tra più modalità organizzative per trovare
quale potrebbe essere la miglior struttura dell’impresa.
La simulazione ad agenti offre un importante strumento di studio della
realtà, tuttavia occorre ricordare che potrebbe essere ‘‘pericoloso” utilizzarla
come base unica su cui poggiare per le scelte aziendali, in quanto i risultati forniscono risposte adatte per il mondo creato all’interno del computer,
che potrebbe essere, e spesso è, diverso da quello reale, nel quale possono
verificarsi eventi diversi da quelli ipotizzati nella simulazione.
61
4. JES: JAVA ENTERPRISE SIMULATOR
4.1
Introduzione all’uso del simulatore
Per comprendere le funzionalità di jES è necessario illustrare il significato
di unità produttiva, ordine e ricetta. L’unità produttiva rappresenta una
struttura, che può essere interna o esterna all’azienda, in grado di eseguire
uno o più passi produttivi. Un ordine è un oggetto che rappresenta un bene
da produrre o un’attività da svolgere; le sue caratteristiche sono descritte
da una ricetta. La ricetta è una sequenza di passi produttivi che devono
essere portati a termine per la produzione di un bene o di un servizio; i passi
produttivi sono espressi da una sequenza di numeri.
Per la rappresentazione della realtà il formalismo jES consente tre differenti descrizioni del mondo:
• la prima, detta WD side (What to Do), è rappresentata dall’elenco
delle attività da svolgere, descritte da ricette che indicano i passi che
le unità produttive devono compiere;
• nella seconda, definita DW side (which is Doing What), si delinea la
struttura produttiva, elencando le unità che possono svolgere i passi
indicati nelle ricette;
• nell’ultima, denominata WDW side (When Doing What), si definisce
la sequenza degli eventi nel tempo.
L’assegnazione delle lavorazioni alle unità durante una simulazione avviene nel seguente modo: le unità che hanno eseguito un passo produttivo
chiedono alle altre unità e a se stesse per sapere quale sia l’unità in grado di eseguire il passo successivo della ricetta, e inviano l’ordine alla prima
unità che risponde. Questo meccanismo si ripete sino ad aver ultimato la
produzione e varia da caso a caso a seconda delle code nelle liste d’attesa
delle unità, dei parametri del modello e di tutte le interazioni che nascono
62
4. JES: JAVA ENTERPRISE SIMULATOR
Figura 4.1: Interazioni tra ordini e unità
tra ordini, ricette e unità. Per valutare come agisce l’impresa virtuale in diverse situazioni è possibile effettuare delle modifiche al modello, ad esempio
ipotizzando una riduzione delle unità produttive o un aumento degli ordini
da eseguire, o ancora introducendo nuovi criteri di scelta per valutare quale
potrebbe essere il migliore.
Dai risultati delle interazioni tra ordini e unità che emergono nelle situazioni simulate è possibile studiare i problemi interni alle organizzazioni e
analizzare gli eventuali fenomeni complessi che si creano (Figura 4.1).
4.2
Lo schema ERA
Durante la simulazione gli agenti devono effettuare delle scelte di vario tipo e il meccanismo su cui si basa la decisione è fondato sul formalismo
Environment-Rules-Agents (ERA) illustrato in Gilbert e Terna (2000).
Secondo questo schema, mostrato in Figura 4.2, gli agenti non sono in grado di comunicare direttamente tra loro, ma soltanto attraverso l’ambiente;
63
4. JES: JAVA ENTERPRISE SIMULATOR
questo non è obbligatorio, è soltanto un artificio volto a rendere il codice
meno complesso di quello che risulterebbe se gli agenti potessero comunicare
direttamente tra loro.
Figura 4.2: Lo schema ERA
Il comportamento degli agenti del modello è determinato da un oggetto
esterno, un gestore di regole, detto Rule Master. Quest’ultimo può essere
rappresentato da un insieme di regole, da una rete neurale o da un algoritmo genetico; si potrebbe anche scegliere di far operare come Rule Master un
agente umano e ciò permetterebbe di studiare in che modo le persone prendono le decisioni nelle organizzazioni e quali sono le scelte in diverse situazioni
aziendali.
L’oggetto Rule Master è a sua volta collegato all’oggetto Rule Maker, che
ha il compito di creare e modificare le regole su cui si basa il comportamento
degli agenti.
La rigidità della struttura dello schema ERA conduce ad una maggior
64
4. JES: JAVA ENTERPRISE SIMULATOR
chiarezza del codice, che può essere visto come un vantaggio per l’utilizzatore finale. Un secondo vantaggio è la possibilità di agire separatamente sui
generatori e sui gestori di regole potendo passare a diversi sistemi di gestori
di regole, per esempio ad algoritmi genetici o a reti neurali.
4.3
Applicazioni a casi aziendali
Sono state e sono tuttora eseguite alcune applicazioni di simulazione di impresa su casi reali. I files utilizzati per la rappresentazione e le simulazioni si
trovano nella cartella appCases/.
Il primo caso (appCases/Case_i ) riguarda un’azienda del settore meccanico, la VIR S.p.A., che produce su larga scala prodotti per lo più simili ma
molto segmentati per quanto riguarda le dimensioni e alcune caratteristiche.
In questa applicazione il problema principale concerne l’assegnazione delle
priorità alle lavorazioni tenendo conto della disponibilità dei macchinari; la
simulazione ad agenti è stata utile per trovare quali sono i cosiddetti ‘‘colli
di bottiglia” legati alla produzione.
Il secondo caso (appCases/Case_ii ) è riferito ad un’azienda che opera
nel settore della moda, la BasicNet S.p.A., che gestisce la propria attività
esclusivamente tramite il web. Lo studio di questo caso è approfondito nei
capitoli che seguono.
Nel terzo caso (appCases/Case_iii ) è analizzata la struttura aziendale
del 118 di Grugliasco, che si occupa del trasporto medico di urgenza.
È in corso lo studio di una nuova versione di jES, chiamato jESopenfoundation, con il quale è possibile, all’interno di un’applicazione chiamata
jESevol, simulare e analizzare la nascita e l’evoluzione delle imprese. Si crea
pertanto un ‘‘sistema evolutivo” in cui da una parte ci sono le cose da fare
e dall’altra chi è in grado di eseguirle; con questo modello è possibile osser-
65
4. JES: JAVA ENTERPRISE SIMULATOR
vare in che modo le nuove imprese sopravvivono o scompaiono e come e se
interagiscono tra loro, creando, ad esempio, dei distretti di imprese.
4.4
4.4.1
Il primo formalismo: le cose da fare
Le ricette
Gli ordini che l’impresa virtuale deve eseguire sono descritti nelle ricette
produttive. Una ricetta è composta da una sequenza di passi seguiti dall’indicazione del tempo necessario per l’esecuzione; nella Tabella 4.1 è mostrato
un semplice esempio di ricetta produttiva composta da un solo passo nella
quale n1 indica il passo produttivo da eseguire, ts l’unità di misura temporale, che può essere il secondo (second), l’ora (hour) o il giorno (day), e m1
rappresenta la quantità di tempo necessaria per l’esecuzione dell’ordine.
n1 ts
m1
Tabella 4.1: Esempio di ricetta produttiva
4.4.2
I layer
I layer possono essere definiti come delle ‘‘etichette” che contraddistinguono
prodotti simili tra loro ma che sono trattati in modo indipendente tra loro
dal simulatore; l’utilizzo dei layer all’interno del simulatore introduce la possibilità di differenziare due ordini associati ad una stessa ricetta produttiva
ma con caratteristiche qualitative diverse.
Ad esempio, se si considera un’impresa che opera nel settore della moda,
le T-shirt possono essere considerate un prodotto omogeneo se si guarda il
processo di creazione, ma sono diverse se si va a vedere dal punto di vista delle
collezioni; in questo caso due magliette appartenenti a collezioni diverse sono
66
4. JES: JAVA ENTERPRISE SIMULATOR
considerate prodotti distinti tra loro. I layer sono utili per operare questa
distinzione nell’impresa simulata e il loro utilizzo è automatico all’interno di
jES.
Il numero di layer utilizzati è indicato dal parametro della simulazione
totalLayerNumber. Il numero di layer è pari a (totalLayerN umber − 1); se
il parametro è impostato su 1 significa che non si usano layer durante la
simulazione.
L’assegnazione degli ordini ai layer è effettuata dall’utente nel momento
in cui crea il file recipeData/orderSequence.xls 1 , che contiene il calendario
delle cose che devono essere fatte dall’impresa.
4.4.3
I batch
In alcune situazioni aziendali non è realistico considerare la produzione come
una serie di processi indipendenti tra loro, pertanto è più corretto ragionare
in termini di gruppi di prodotti uguali tra loro.
Sequential batch
Un processo sequential batch esegue contemporaneamente un insieme di ordini uguali; può essere impiegato per lavorazioni che richiedono un tempo
molto ridotto per essere portate a termine, perciò è più realistico considerare
che la loro produzione avvenga solo quando c’è un certo numero di ordini in
attesa.
Nella Tabella 4.2 è mostrato un esempio di sequential batch: l’unità che
deve svolgere il passo n1 deve attendere che b1 ordini simili siano arrivati
nella sua waiting list prima di iniziare la lavorazione; il tempo necessario
per la realizzazione del passo è pari a m1, mentre il tempo di produzione di
ciascun ordine è uguale a
1
m1
.
b1
Per maggiori chiarimenti su questo file vedere il paragrafo 4.6
67
4. JES: JAVA ENTERPRISE SIMULATOR
n1 ts m1 \ b1
Tabella 4.2: Sequential batch
Stand alone batch
Un processo stand alone batch produce contemporaneamente un insieme di
ordini ed è utilizzato, ad esempio, nel caso di un approvvigionamento esterno
di semilavorati.
La ricetta (Tabella 4.3) contenente il processo deve essere composta di
due parti: lo stand alone batch e l’indicazione della endUnit 2 ; con endUnit si intende un magazzino nel quale vengono riposti i semilavorati quando non vengono utilizzati. Nell’esempio che segue, il passo n1 produce b1
semilavorati nel tempo m1 e li colloca nell’endUnit c1.
n1 ts m1 / b1
e c1
Tabella 4.3: Stand alone batch e indicazione dell’endUnit
4.4.4
I procurement
Il procurement è un passo che procura semilavorati, prodotti internamente
o esternamente all’azienda. Nel caso di semilavorati provenienti da fornitori
esterni, i procurement sono considerati come ‘‘black boxes’’, senza indagare
sul modo in cui vengono prodotti. Se, al contrario, sono prodotti all’interno
dell’azienda, la loro realizzazione può essere descritta in un modo più o meno
dettagliato con una ricetta composta di un solo passo o con uno stand alone
batch.
La sintassi dei procurement è la seguente:
il passo m1 prima della sua realizzazione richiede una fase di approvvigionamento nella quale vengono cercati semilavorati in k endUnit che han2
Per maggiori dettagli: paragrafo 4.5.2
68
4. JES: JAVA ENTERPRISE SIMULATOR
p k c1 ... ck n1 ts m1
Tabella 4.4: Procurement
no codice c1 ... ck; nella sintassi del procurement l’indicazione della p è
obbligatoria.
4.4.5
Il processo OR
Grazie al processo or è possibile creare delle situazioni in cui l’azienda simulata si trovi a dover effettuare delle scelte su come operare. Ad esempio,
potrebbe essere possibile che per l’approvvigionamento di uno stesso semilavorato l’impresa decida una volta di produrlo internamente e la volta successiva decida invece di rivolgersi ad un fornitore esterno, oppure può avvenire
che per la produzione di uno stesso prodotto si possano usare due diversi
metodi di lavorazione, pertanto l’azienda sceglierà di volta in volta quale
utilizzare.
Per inserire una scelta tra due o più opportunità all’interno delle ricette
si usa, come nel formalismo del linguaggio C, il simbolo || seguito dalle alternative, come nella Tabella 4.5, tenendo presente che l’ultima ramificazione
deve iniziare con la notazione ||0. Nel caso mostrato l’impresa, dopo aver
eseguito il passo n1, può scegliere se eseguire il passo n2 o il passo n12 o n81.
n1 ts m1 ||1 n2 ts m2 ||2 n12 ts m12 ||0 n81 ts m81
Tabella 4.5: Processo or
Le possibilità di scelta tra le diverse ramificazioni dipende dal valore
assunto dal parametro orCriterion, che può variare tra 0 e 5:
• 0 significa che si eseguono tutte le alternative (utile solo nelle fasi di
test del simulatore);
69
4. JES: JAVA ENTERPRISE SIMULATOR
• 1 per scegliere sempre il primo ramo;
• 2 per scegliere sempre il secondo ramo;
• 3 per una scelta effettuata in modo casuale;
• 4 nel caso in cui si scelga l’alternativa il cui primo passo ha la minor
lista d’attesa;
• 5 se la scelta del branch è basata sul risultato di un passo computazionale3
Il secondo formalismo: chi fa cosa
4.5
4.5.1
Le unità produttive
L’unità produttiva è una struttura aziendale in grado di eseguire uno o più
passi di una ricetta. Le unità sono semplici se sono in grado di eseguire solo
un passo, complesse se ne possono eseguire più di uno.
Unità semplici
Le unità produttive semplici sono elencate nel file unitData/unitBasicData.txt, che si presenta come mostrato in Figura 4.3, nel quale sono indicate,
per ciascuna unità, le seguenti informazioni:
• il numero dell’unità produttiva presa in considerazione;
• il parametro useWarehouse. Se è impostato su 1, l’unità produce magazzino in modalità stand alone, cioè nel momento in cui non è chiamata
ad operare da una ricetta; se ha valore 0 non produce magazzini;
• il numero del passo produttivo che è in grado di eseguire;
3
Per maggiori dettagli: paragrafo 4.7.2
70
4. JES: JAVA ENTERPRISE SIMULATOR
• il valore dei costi fissi per ogni unità di tempo;
• il valore dei costi variabili per ogni unità di tempo.
Figura 4.3: File unitData/unitBasicData.txt
Unità complesse
Le unità complesse sono in grado di eseguire più di un passo produttivo;
nel file unitData/unitBasicData.txt sono indicate con uno 0 nella colonna
corrispondente al passo che svolgono; esempi di unità complesse sono l’unità
2 e 4 nella Figura 4.3).
Queste unità sono descritte in un foglio Excel, nel quale sono indicati il
numero di fasi che possono svolgere, il codice della fase, i loro corrispondenti
costi fissi e variabili, e l’indicazione se producono magazzini in caso di assenza
di attività.
4.5.2
Le endUnit
Le endUnit rappresentano dei magazzini in cui sono riposti i semilavorati o
i prodotti finiti e hanno lo stesso codice della componente che contengono;
sono elencate nel file unitData/endUnitList.txt. Nelle ricette le endUnit sono
indicate con una e che precede il loro codice identificativo.
Le endUnit possono essere layer sensitive, se indicate con un numero
positivo, o layer insensitive, se indicate con numero negativo; nel primo caso
71
4. JES: JAVA ENTERPRISE SIMULATOR
si creano tante endUnit quanti sono i layer e i prodotti saranno immagazzinati
nella endUnit avente il suo stesso layer.
4.5.3
La scelta delle unità
Nel caso che più unità siano in grado di eseguire lo stesso passo il simulatore
deve scegliere quale di queste dovrà effettuare la lavorazione. Il metodo di
scelta è indicato dal parametro unitCriterion e può essere:
0, se si sceglie la prima unità disponibile seguendo l’ordine del file unitData/unitBasicData.txt;
1, se la scelta è effettuata in modo casuale;
2, se è scelta l’unità con la minore lista d’attesa.
4.5.4
La trasmissione delle informazioni
Un’unità può inviare informazioni riguardanti un ordine all’unità successiva
secondo l’ordine della ricetta; lo scambio di informazioni è possibile se il parametro useNewses è impostato su true. Questo aspetto è molto interessante
nel corso di una simulazione, in quanto è possibile osservare quali interazioni
si creano tra le unità in diverse situazioni aziendali e che tipo di fenomeni
complessi possono emergere.
Un’unità può inviare informazioni ad un’altra nel solo caso in cui siano
legate nella matrice presente nel file unitData/informationFlowMatrix.txt; le
righe indicano le unità che inviano le informazioni e le colonne da quelle che
le ricevono. Se due unità sono legate dal valore 1 si scambiano informazioni,
in caso contrario sono contrassegnate con 0; i valori sulla diagonale principale
della matrice non sono da tenere in considerazione, in quanto le unità non
scambiano informazioni con loro stesse.
72
4. JES: JAVA ENTERPRISE SIMULATOR
4.6
Il terzo formalismo: quando fare cosa
Il terzo formalismo è alla base della sequenza degli eventi: descrive degli
ordini da eseguire, contenenti le ricette, e la sequenza in cui questi ordini
devono essere eseguiti.
L’elenco delle ricette è contenuto nel file recipeData/recipes.xls, in cui,
per ogni ricetta è indicato nel seguente ordine:
• il nome della ricetta;
• il numero identificativo;
• il ‘‘corpo’’ della ricetta;
• un punto e virgola che indica la fine della ricetta.
Tutti gli elementi della ricetta devono essere scritti uno per ogni cella del
foglio di lavoro.
La sequenza con cui devono essere eseguiti gli ordini è contenuta nel file
recipeData/orderSequence.xls. Ciascun blocco del file descrive gli eventi che
si verificano in un tick della simulazione e si conclude con un punto e virgola
che indica che sono finite le attività da compiere in quel tick. Ogni blocco è
composto dai seguenti elementi:
• numero del tick;
• la lettera l, che sta per layer, seguita dal numero di layer corrispondente;
• numero della ricetta che deve essere lanciata;
• il segno ‘‘*’’;
• il numero di volte che deve essere eseguita la ricetta.
73
4. JES: JAVA ENTERPRISE SIMULATOR
74
Se ad un tick non accade nulla, nel calendario della simulazione si indica
il numero del tick seguito da un punto e virgola. La sintassi del file recipeData/orderSequence.xls è mostrata in Tabella 4.6; al tick 1 non accade nulla,
mentre al secondo deve essere lanciata la ricetta 101 con layer 5 per 25 volte.
1
;
2
l
5
101
* 25
;
Tabella 4.6: recipeData/orderSequence.xls
4.7
Le capacità computazionali
jES ha delle capacità computazionali che possono essere associate ai passi
delle ricette; il loro scopo è l’esecuzione di operazioni immateriali, ad esempio
previsioni, aste per selezionare gli approvvigionamenti e valutazioni di diverso
tipo.
I passi computazionali utilizzano i dati contenuti all’interno delle matrici
di memoria, che sono elencate nel file unitData/memoryMatrixes.txt mostrato
in Figura 4.4, e possono essere sensibili o no ai layer; se sono layer insensitive
sono indicate con un numero negativo, in modo analogo a quanto accade per
le endUnit. Nel file unitData/memoryMatrixes.txt sono indicati il numero
delle memoryMatrix ed i numeri di righe e di colonne di ciascuna. Occorre
ricordare che per usare le memoryMatrix si deve aggiornare il parametro della
simulazione totalMemoryMatrixNumber, che indica il numero delle matrici di
memoria usate durante la simulazione.
Per indicare che il passo di una ricetta richiede l’utilizzo di una computazione occorre usare il formalismo mostrato in Tabella 4.7, nel quale c è
obbligatorio e indica che si deve utilizzare un passo computazionale, code
rappresenta il codice del passo usato (che per convenzione può andare da
1001 a 1999), n esprime il numero di matrici di memoria che si intendono
4. JES: JAVA ENTERPRISE SIMULATOR
Figura 4.4: File unitData/memoryMatrixes.txt
usare e a1 ... an i loro numeri, che si possono trovare nel file unitData/memoryMatrixes.txt. Pertanto il passo in Tabella 4.7 si può leggere nel seguente
modo: il passo n1 necessita di una computazione del metodo code che usa n
matrici numerate a1 ... an.
c code n a1 ... an n1 ts m1
Tabella 4.7: Uso di passi computazionali
Per inserire nuove capacità computazionali al simulatore è necessario modificare il file ComputationalAssembler.java, che eredita i suoi metodi di base
dalla classe ComputationalAssemblerBasic; entrambi i files si trovano nella
cartella src/ ed il ComputationalAssembler.java non contiene alcun metodo.
Nel momento in cui si aggiungono nuovi metodi alla classe ComputationalAssembler occorre spostare il file nella cartella principale, in modo che sia
visibile al comando make durante la compilazione.
I metodi seguenti sono quelli che i passi computazionali ereditano dalla
classe ComputationalAssemblerBasic e che consentono loro di interagire con
le matrici di memoria:
• getEmpty(layer, (int) row, (int) col), restituisce vero o falso a seconda che
la casella della memoryMatrix considerata sia, rispettivamente, vuota
o piena;
• setEmpty(layer, (int) row, (int) col), cancella il contenuto della casella
della matrice;
75
4. JES: JAVA ENTERPRISE SIMULATOR
• getValue(layer, (int) row, (int) col), legge il valore contenuto nella riga e
colonna indicate della memoryMatrix;
• setValue(layer, (int) row, (int) col, (double) value) o setValue(layer, (int)
row, (int) col, (float) value), scrive un valore all’interno della casella
della matrice presa in considerazione.
4.7.1
Un semplice esempio
Si ipotizzi che durante la simulazione si presenti la seguente ricetta, composta
di un solo passo:
c 1998 1 25 7 s 4 ;
ciò significa che il passo 7 impiega 4 secondi per la sua esecuzione e ha
bisogno del passo computazionale 1998 che usa una matrice, la numero 25.
Il passo computazionale c1998, nel momento in cui viene chiamato ad
operare, legge il numero della matrice di memoria nella posizione 0, cioè la
prima posizione, con il metodo getMemoryMatrixAddress, e assegna l’indirizzo
della matrice alla variabile mm di tipo MemoryMatrix; in seguito controlla il
layer della matrice con il metodo getOrderLayer.
Il compito di questo passo computazionale è scrivere 1 nella riga 0 e
colonna 0 della matrice mm ed a tal fine utilizza il metodo setValue.
Infine, il passo computazionale è impostato su done. Questa operazione
è molto importante, perché in caso contrario l’ordine rimane in sospeso e il
passo successivo della ricetta non può essere eseguito; il passo computazionale sarà ripetuto in ogni ciclo di simulazione, fino a quando la variabile done
sarà impostata true.
76
4. JES: JAVA ENTERPRISE SIMULATOR
77
Listing 4.1: Esempio di passo computazionale
¨
p u b l i c v o i d c1998 ( )
{
mm = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 0 ) ;
layer = pendingComputationalSpecificationSet .
getOrderLayer ( ) ;
mm. s e t V a l u e ( l a y e r , 0 , 0 , 1 . 0 ) ;
done
= true ;
} // end c1998
§
­
4.7.2
La matrice orMemoryMatrix
Come accennato nel paragrafo 4.4.5, se il parametro orCriterion è uguale a 5
la scelta del ramo del processo or è effettuata grazie alle capacità computazionali del simulatore. Infatti in questo caso il ramo da scegliere è cercato
nella prima colonna di una matrice di memoria, che è individuata mediante
il parametro orMemoryMatrix.
Il contenuto della orMatrix può essere modificato dai passi computazionali
ed è uno strumento utile per aumentare la casualità all’interno dell’impresa
simulata.
4.7.3
Le ricette che lanciano ricette
Un ulteriore utilizzo delle capacità computazionali del simulatore è legato alla
presenza di ‘‘ricette che lanciano altre ricette’’. Questa potenzialità discende
dal fatto che durante la simulazione può accadere che, durante l’esecuzione di
una ricetta, contemporaneamente debba essere effettuata una lavorazione che
¦
4. JES: JAVA ENTERPRISE SIMULATOR
richiede l’intervento di un’altra ricetta, oppure che una ricetta debba valutare
se eseguire o no una lavorazione e, in caso affermativo, avvii l’operazione
lanciando un’altra ricetta produttiva.
Questa funzione speciale è assolta da due passi computazionali presenti
nella classe ComputationalAssemblerBasic, il C1001 e il C1002. Per conoscere quali sono le ricette che devono essere lanciate si utilizza un file
di testo, recipeData/recipesFromRecipes.txt, nel quale l’utente scrive il loro
numero, ciascuno separato da uno spazio vuoto; in seguito il passo computazionale C1001 legge il contenuto di questo file ed inserisce ogni numero in una
memoryMatrix nella posizione (0, 0). Il lancio delle ricette è effettuato dal
passo computazionale C1002, che legge nella memoryMatrix il numero della
ricetta e lo invia al metodo distill della classe OrderDistiller, che si occupa di
avviare l’esecuzione della ricetta.
Ci sono due restrizioni nell’uso di questa funzionalità:
• non possono essere lanciate più di 10 ricette, anche se è possibile
modificare questo limite nel ComputationalAssemblerBasic.java;
• è consentito il lancio di un massimo di 1.000 ricette nello stesso tick
della simulazione; anche questo vincolo è modificabile nel file OrderDistiller.java.
La sintassi dei passi computazionali sopra descritti è mostrata nella Tabella 4.8. In questo esempio il passo C1001 richiede tre matrici, le numero
10, 20, 30; il passo produttivo 100 è fittizio, ha il solo scopo di permettere
l’esecuzione della computazione. Il passo C1002 richiede la sola matrice 20,
nella quale è contenuto il numero della ricetta che deve essere lanciata.
78
4. JES: JAVA ENTERPRISE SIMULATOR
c 1001 3 10 20 30 100 s 1
c 1002 1 20 10 s 2
Tabella 4.8: Ricette che lanciano ricette
4.8
Le capacità contabili
jES è in grado di tenere automaticamente una semplice contabilità secondo
due differenti punti di vista:
• nel primo caso ogni prodotto è caricato dei costi fissi e variabili relativi
alle unità che sono state coinvolte nella produzione;
• nella seconda visione si contabilizzano i costi per unità produttiva; per
le unità inattive sono considerati solo i costi fissi.
I costi sono contabilizzati ad ogni tick dell’orologio della simulazione.
Per quanto riguarda i ricavi, sono calcolati dal simulatore applicando,
alternativamente, un margine di ricarico ad ogni costo sostenuto dall’azienda
oppure ad ogni passo produttivo eseguito. Il mark-up è pertanto definito da
un valore, detto v, che risulta dalla seguente somma:
v = [numeroDiT ick] × revenueP erEachStep
+ [costi] × revenueP erCostU nit
il parametro revenuePerEachStep indica il margine di ricarico da applicare
per ogni passo produttivo eseguito, il parametro revenuePerCostUnit quello
da applicare ad ogni costo sostenuto dall’azienda, che deve essere scritto nel
seguente modo: (1+mark-up). Nel corso della stessa simulazione soltanto
uno dei due parametri può essere diverso da zero.
79
4. JES: JAVA ENTERPRISE SIMULATOR
4.8.1
I costi
Nella cartella Costs/ si trovano i seguenti files creati da jES che riportano i
costi relativi all’azienda simulata:
1. nel file totalDailyCosts.txt c’è la somma dei costi fissi e variabili giornalieri. Il giorno è considerato l’unità di tempo della simulazione ed è
definito come un blocco di tick il cui numero è fissato dal parametro
ticksInATimeUnit; pertanto se il parametro è uguale a 10, un giorno
della simulazione sarà composto da 10 tick;
2. in totalCosts.txt è presente la somma cumulata dei costi contabilizzati
nel file precedente;
3. finishedOrderCosts.txt riporta il costo degli ordini conclusi dall’inizio
della simulazione;
4. il file dailySemimanufacturedOrderCosts.txt indica i costi derivanti dalla produzione degli ordini alla fine di uno specifico giorno.
5. in totalInventoryFinancialCosts.txt si trova il costo dei magazzini contabilizzati secondo il criterio stabilito dal parametro inventoryEvaluationCriterion, che può essere 1 se si considerano solo i costi variabili,
2 per tenere conto anche dei costi fissi, 3 per valorizzarli secondo il
parametro v illustrato nel paragrafo precedente.
4.8.2
I ricavi
I ricavi sono contabilizzati nel momento in cui i beni o servizi creati sono
venduti. Nella cartella Revenues/ sono riportati i seguenti files di testo:
1. dailyRevenues.txt, nel quale si trovano i ricavi derivanti dagli ordini
conclusi, valorizzati secondo il parametro v ;
80
4. JES: JAVA ENTERPRISE SIMULATOR
2. totalRevenues.txt, in cui si riporta il totale del file precedente dall’inizio
della simulazione;
3. nel file dailyStoredComponentValue.txt si trova il valore dei magazzini,
valorizzati secondo il criterio espresso dal parametro inventoryEvaluation;
4. in dailySemimanufacturedProductRevenues.txt si ha il valore dei semilavorati valorizzati con v.
4.8.3
L’utile
L’utile dell’impresa è riportato, per ogni tick, nel file Benefit/benefit.txt ed è
calcolato nel seguente modo:
totalRevenues
+dailyStoredComponentV alue
+totalSemimanuf acturedRevenues
−totalCosts
−totalInventoryF inancialCosts
4.9
Lanciare una simulazione
Per attivare una simulazione è possibile scegliere se lanciare gli ordini in modo
casuale o utilizzare un calendario preciso.
Nel primo caso gli ordini sono generati usando l’orderGenerator.
Nella seconda ipotesi si utilizza l’orderDistiller; in questo caso è necessario
introdurre il terzo formalismo, When Doing What, che contiene il calendario.
Questa modalità è la più adatta per lo studio di situazioni reali, come ad
esempio gli studi sulle imprese VIR S.p.A. e BasicNet S.p.A., in cui le attività
sono legate ad un preciso calendario.
81
4. JES: JAVA ENTERPRISE SIMULATOR
4.9.1
I grafici di una simulazione
Durante una simulazione sono visibili i grafici che forniscono alcune informazioni sulla simulazione stessa e sulle attività che si stanno svolgendo
nell’azienda virtuale.
Il grafico mostrato in Figura 4.5 indica l’andamento generale delle liste
d’attesa delle unità nel corso della simulazione; è composto da tre linee che
rappresentano il livello minimo (linea arancione), massimo (linea gialla) e
medio (linea blu) delle waiting list.
Il grafico in Figura 4.6 indica l’andamento durante la simulazione del
guadagno o della perdita dell’impresa virtuale.
Il grafico della Figura 4.7 indica il rapporto tra l’attuale tempo richiesto
per l’esecuzione degli ordini già completati e il tempo previsto in ciascuna ricetta; un eventuale ritardo rispetto ai tempi previsti potrebbe significare un’errata specificazione dei tempi delle ricette oppure un problema
organizzativo all’interno dell’impresa.
Nel grafico mostrato in Figura 4.8 è indicato, con un istogramma per
ogni unità, il numero di ordini presenti nella waiting list di ciascuna unità.
Sull’ascissa sono rappresentate le unità produttive e sull’ordinata il numero
di ordini nella lista d’attesa.
In Figura 4.9 è mostrato il grafico relativo alle endUnit; sull’asse orizzontale sono indicate le endUnit e sull’asse verticale la quantità di semilavorati
o prodotti finiti presenti in ciascuna di esse.
82
4. JES: JAVA ENTERPRISE SIMULATOR
Figura 4.5: Grafico dell’andamento delle liste d’attesa
Figura 4.6: Andamento dell’utile durante la simulazione
83
4. JES: JAVA ENTERPRISE SIMULATOR
Figura 4.7: Rapporto
84
totaltime
totallenght
Figura 4.8: Liste d’attesa delle unità dell’impresa virtuale
4. JES: JAVA ENTERPRISE SIMULATOR
Figura 4.9: Livello delle endUnit
85
Capitolo 5
L’azienda reale: BasicNet
Il Gruppo BasicNet opera nel settore dell’abbigliamento informale e sportivo,
delle calzature e degli accessori per lo sport e per il tempo libero. I marchi
con cui è presente sul mercato sono Kappa, Robe di Kappa e, da febbraio
2004, K-Way e Superga; il Gruppo possiede inoltre il marchio Jesus Jeans,
per il quale è previsto uno sviluppo nel futuro.
L’attività del gruppo consiste nello sviluppo dei marchi posseduti e nella
diffusione dei prodotti ad essi collegati attraverso una rete di aziende licenziatarie e indipendenti; secondo i dati di maggio 2004, il network dei licenziatari
copre 83 mercati a livello mondiale.
Il gruppo fa capo a BasicNet S.p.A., con sede a Torino, quotata alla Borsa
Italiana nel segmento STAR.
5.1
La storia
Il Gruppo BasicNet nasce nel 1994, quando Football Sport Merchandise S.r.l.
di Marco Boglione rileva dal fallimento il Maglificio Calzificio Torinese, proprietario dei marchi di abbigliamento Kappa, Robe di Kappa e Jesus
Jeans.
86
5. L’AZIENDA REALE: BASICNET
Football Sport Merchandise S.r.l. è fondata nel 1983 e il suo presidente
è Marco Boglione, attuale presidente di BasicNet. La società è la prima in
Italia, e tra le prime in Europa, ad ottenere dalle principali squadre di calcio
la licenza per produrre e distribuire capi d’abbigliamento per il tempo libero
contrassegnato dai loro marchi e segni distintivi.
Nel 1988 Football Sport Merchandise, a fronte di una rilevante crescita
a livello mondiale del mercato dei prodotti contrassegnati dai marchi delle
squadre sportive, costituisce la Basic Merchandise S.r.l.. L’obiettivo di questa nuova società, oggi BasicItalia, è l’ottimizzazione dei processi produttivi
e la distribuzione dei prodotti in alcuni mercati esteri, nonché diventare licenziatario e distributore esclusivo per l’Italia dell’americana Starter Inc., al
tempo leader mondiale di abbigliamento realizzato su licenza delle squadre
delle ‘‘Major Leagues” statunitensi.
Nel 1994, come affermato precedentemente, Football Sport Merchandise
rileva dal curatore fallimentare i marchi, il magazzino e l’immobile di proprietà del Maglificio Calzificio Torinese S.p.A., fondato nel 1916, in cui Marco
Boglione aveva iniziato la sua carriera professionale nel 1976. L’obiettivo
dell’acquisizione è quello di disporre di marchi conosciuti ed affermati per
poter valorizzare nel modo migliore le potenzialità organizzative e commerciali di Football Sport Merchandise nel mercato dell’abbigliamento informale,
sportivo e per il tempo libero.
Nel 1996 il gruppo Ventuno Investimenti, guidato da Alessandro Benetton, diventa nuovo partner strategico del Gruppo BasicNet. Si firmano nuovi
contratti di licenza per i principali mercati europei e si definiscono le strategie per la penetrazione dei marchi nei mercati degli Stati Uniti, dell’Asia e
dell’Africa. In questa occasione Football Sport Merchandise assume la nuova
denominazione sociale di Basic Properties Services S.p.A..
Nel 1997, coerentemente con la strategia di penetrazione del mercato
87
5. L’AZIENDA REALE: BASICNET
USA, sono acquisite le attività di una piccola azienda americana, fortemente
specializzata nel segmento dell’abbigliamento e delle calzature per il calcio
e con una struttura organizzativa e distributiva adatta a costituire la base
operativa del licenziatario statunitense del Gruppo. Nasce così la Kappa
USA, attualmente controllata da BasicNet. Nel corso dello stesso anno la
controllata Kappa Italia, oggi BasicItalia, avvia la costruzione di un nuovo
complesso immobiliare a Torino destinato ad attività di confezionamento,
magazzino e spedizione.
Nel 1998 ha inizio la ristrutturazione della sede del Gruppo BasicNet a
Torino, che prevede la realizzazione del primo progetto BasicVillage per ospitare, oltre alle attività gestionali del gruppo, anche il nuovo modello di punto
vendita, il Gigastore Kappa. Quest’ultimo rappresenta lo strumento con il
quale il Gruppo si propone di smaltire le rimanenze generate dall’attività
dei licenziatari e, allo stesso tempo, entrare in mercati ad alto potenziale di
consumo, ma a basso potere d’acquisto.
All’inizio del 1999 Basic World N.V., l’azionista di maggioranza relativa,
decide di quotare nella Borsa Italiana le azioni del Gruppo, il cui cespite
principale è rappresentato dai marchi Kappa e Robe di Kappa. Nel giugno del 1999 viene deliberato di far confluire in BasicNet S.p.A. tutte le
partecipazioni delle società attive del Gruppo detenuto da Basic World N.V..
A febbraio 2004 BasicNet, a seguito di una trattativa con Formula Sport
Group, acquisisce il marchio K-Way e diventa licenziatario unico mondiale
del marchio Superga, per un periodo di 14 anni e con un diritto di opzione
per l’acquisto dello stesso. L’acquisto di questi marchi rientra nel piano imprenditoriale di BasicNet, fondato sulla gestione di marchi aventi una buona
tradizione e forti prospettive di sviluppo. Per il marchio K-Way il Gruppo
prevede di sviluppare una strategia distributiva simile a quella di Kappa indirizzata soprattutto ai negozi multimarca di articoli sportivi; per Superga è
88
5. L’AZIENDA REALE: BASICNET
previsto il raggiungimento dei mercati asiatici e americani mediante accordi
di licenza, mentre quello europeo verrà in larga misura fornito con vendite
dirette organizzate da Kappa Italia, il licenziatario italiano del Gruppo, che
a luglio 2004 ha cambiato la sua ragione sociale ridenominandosi BasicItalia.
5.2
Il business system
Il gruppo BasicNet ha impostato il proprio sviluppo su un modello di impresa
‘‘a rete’’, identificando nel licenziatario il mezzo ideale per la diffusione e la
distribuzione dei propri prodotti nel mondo.
Questo modello di business ha consentito al gruppo di crescere rapidamente e, allo stesso tempo, mantenere una struttura flessibile ed efficiente.
Si presenta infatti come una grande azienda composta di tante piccole imprese collegate tra loro da una piattaforma informatica tramite internet. Alla
capogruppo BasicNet fanno capo tutte le attività strategiche:
• Ricerca e Sviluppo di prodotto;
• Global Marketing;
• sviluppo e coordinamento del network dei licenziatari;
• finanza strategica;
• Information Technology, cioé creazione di sistemi di software per consentire la gestione on line di tutti i processi della catena dell’offerta.
La piattaforma informatica rappresenta uno dei principali investimenti
strategici del Gruppo, al quale è dedicata la massima attenzione; è stata concepita e sviluppata completamente integrata al web, considerato dal Gruppo
lo strumento ideale di comunicazione fra gli elementi che costituiscono il
network.
89
5. L’AZIENDA REALE: BASICNET
Direttamente collegati con BasicNet vi sono i Sourcing Center, che hanno
il compito di individuare e coordinare le fabbriche a cui affidare la realizzazione dei prodotti. Ai licenziatari è affidata la distribuzione dei prodotti ai
dettaglianti e l’attività di marketing su base locale, secondo le linee guida del
Gruppo; per l’approvvigionamento dei prodotti finiti i licenziatari possono
appoggiarsi ai Sourcing Centers che BasicNet mette loro a disposizione.
Inoltre, il Gruppo BasicNet è anche presente nella vendita diretta al
pubblico con tre modelli di concept store:
• il negozio monomarca RDK, che trova l’ideale collocazione nei centri pedonali e storici cittadini e nelle gallerie dei centri commerciali. Gestito
in franchising, propone una gamma di abbigliamento classico-sportivo
per adulti;
• il Gigastore, grande boutique dei marchi BasicNet. Propone tutto
l’assortimento di sport, jeans e abbigliamento casual;
• lo Spaccio, realizzato in aree non tipicamente commerciali con la caratteristica di proporre un vasto assortimento di stock e convenienza di
prezzo.
La Figura 5.1 mostra il modello di business BasicNet, così strutturato:
1. attività di collaborazione e contatto tra il gruppo BasicNet ed i licenziatari; fase di acquisto del campionario da parte dei licenziatari;
2. realizzazione dei MetaSamples, scelta dei MetaSamples da realizzare come campionario, richiesta delle specifiche tecniche, produzione e
consegna delle merci;
3. richiesta di previsioni di vendita ai licenziatari;
90
5. L’AZIENDA REALE: BASICNET
Figura 5.1: Rappresentazione del business system di BasicNet
91
5. L’AZIENDA REALE: BASICNET
4. richiesta ai Sourcing Centers del preventivo per la produzione degli
articoli;
5. raccolta degli ordini delle merci; gli ordini sono passati ai Soucing
Centers;
6. vendita dei prodotti sul mercato.
5.3
La struttura del Gruppo
In testa al Gruppo, come si può notare dalla Figura 5.2, si trova BasicNet.
Accanto alla funzione di capogruppo, gestisce e coordina il network, presidiando direttamente le attività strategiche; inoltre supporta i licenziatari
nella gestione dei contratti di sponsorizzazione più importanti sia attraverso
le proprie strutture sia tramite la controllata Basic Properties.
Figura 5.2: La struttura del Gruppo
BasicNet controlla al 90% Kappa Italia S.p.A., ridenominata a luglio 2004
BasicItalia, che opera come licenziatario per l’Italia per i marchi Kappa, Robe
92
5. L’AZIENDA REALE: BASICNET
di Kappa, Jesus Jeans e K-Way e come licenziatario europeo per il marchio
Superga; inoltre si presenta come azienda licenziataria per tutti i paesi del
mondo in cui non sono già presenti altri licenziatari. BasicItalia gestisce
anche tutte le iniziative di vendita al dettaglio che fanno capo al Gruppo,
vale a dire i negozi RDK, i Gigastore e gli spaci aziendali.
Basic Village S.p.A., interamente controllata da BasicNet, è la società
immobiliare proprietaria dell’ex stabilimento del Maglificio Calzificio Torinese, ribattezzato Basic Village; la società concede in locazione gli immobili
del Village alle società del Gruppo.
BasicNet controlla interamente anche Basic Properties B.V., che opera
come licenziataria mondiale di Basic Trademark S.A., società proprietaria
dei marchi. La sua attività consiste nel concedere in sub-licenza i diritti
di proprietà intellettuale del Gruppo BasicNet ai diversi licenziatari locali,
amministrare e gestire i contratti di sub-licenza e le royalties da essi derivanti.
La società è titolare di contratti di sponsorizzazione e coordina l’attività di
comunicazione, promozione e marketing globale del Gruppo BasicNet.
LF Basic Ltd è controllata per il 50% da Basic Properties B.V. e per
il 50% da Li & Fung Trading Ltd di Hong Kong, società del gruppo multinazionale Li & Fung. LF Basic controlla a sua volta al 100% LF Basic
Europe S.r.l. di Torino; le due società operano come Sourcing Centers, la
prima prevalentemente per l’area asiatica, la seconda nell’area del bacino del
Mediterraneo.
Basic Properties America Inc., già Kappa USA Inc., ha operato fino al 30
ottobre 2001 come licenziatario del Gruppo negli Stati Uniti; successivamente
le operazioni sono state cedute a terzi, con la sub-licenza dei marchi. Dal
1◦ novembre 2001, dopo aver provveduto a cedere il proprio ramo di attività
operativa alla Kappa USA, opera esclusivamente come sub-licenziante dei
marchi per il mercato statunitense.
93
5. L’AZIENDA REALE: BASICNET
Kappa Spain Sports S.L., partecipata dal Gruppo BasicNet con una quota
del 30%, opera quale licenziatario per la Spagna.
5.4
Le divisioni dot.com
Il processo produttivo che dalla creazione conduce alla commercializzazione
delle collezioni è suddiviso in numerose fasi, ciascuna delle quali viene portata a termine da una divisione aziendale; queste ultime, nella terminologia
adottata da BasicNet, vengono definite divisioni dot.com, per sottolineare
ancora una volta l’importanza del web all’interno dell’azienda. Le divisioni
dot.com sono descritte qui di seguito.
BasicBiddings.com
Gestisce l’asta per la scelta delle aziende che dovranno produrre gli articoli
per i licenziatari e sceglie le vincitrici per ogni articolo. L’asta è rivolta alle
Trading Company (società esterne al Gruppo) ed ai Sourcing Center (società
gestite in joint-venture dal Gruppo). Nel 2004 le società che partecipano
all’asta sono 5.
BasicCountry.com
Rappresenta l’insieme dei licenziatari legati al gruppo BasicNet. È da sottolineare che i licenziatari non acquistano i loro articoli da BasicNet ma
direttamente dalle fabbriche asiatiche e pagano una commissione per l’intermediazione (7% del fatturato) alle Trading Company.
I licenziatari, ogni tre mesi, devono pagare al Gruppo una somma pari al
10% del loro fatturato per l’insieme dei servizi offerti; di tale somma, un 4%
spetta a World Wide Strategic Advertisement, che ha funzioni di
marketing, un 4% è destinato alla remunerazione dei marchi e il restante 2%
94
5. L’AZIENDA REALE: BASICNET
va a BasicNet che lo suddivide ulteriormente tra le divisioni dot.com.
Secondo i dati del 2004 esistono circa 35 licenziatari che coprono 83 paesi nel
mondo.
BasicFactory.com
Ha in carico la gestione della produzione; esistono due deadline per gli
ordini di produzione di ogni collezione, a distanza circa di un mese una
dall’altra. I licenziatari possono effettuare gli ordini non appena sul sito
www.basicfactory.com vengono pubblicate le immagini degli articoli che compongono la collezione. Una volta raccolti gli ordini la produzione viene lanciata. Le società che si occupano della produzione, generalmente asiatiche,
sono in continuo contatto con le fabbriche locali e forniscono loro adeguate
garanzie finanziarie.
BasicForecast.com
Si occupa delle previsioni di produzione e vendita interagendo con i licenziatari. Le previsioni sono sostanzialmente l’aggregato delle quantità di probabile
acquisto indicate dai licenziatari in sede di ordine dei MetaSamples.
BasicMarketing.com
Effettua lo studio del marketing globale dei marchi e la supervisione dei
licenziatari.
BasicSamples.com
Svolge l’attività di ideazione e design del campionari, considerata, all’interno dell’azienda, la fase più importante di tutto il processo produttivo. La
vendita del campionario è una delle principali fonti reddituali della divisione.
95
5. L’AZIENDA REALE: BASICNET
BasicSpecs.com
Determina le specifiche tecniche dei prodotti da consegnare alle Trading Company e ai Sourcing Centers. La divisione agisce in due momenti, la prima
volta prima della produzione del campionario e fornisce alla sartoria incaricata da BasicSamples.com la ‘‘distinta base” degli articoli. In seguito viene
chiamata ad operare prima che le Trading Company e i Sourcing Centers
inizino la produzione e fornisce loro tutte le caratteristiche che gli articoli devono possedere in modo più dettagliato rispetto al precedente. L’obiettivo di
BasicSpecs.com è che diverse fabbriche siano in grado di realizzare prodotti
uguali.
5.5
Il ciclo di produzione
La creazione di una collezione inizia circa un anno prima della sua data di
commercializzazione. L’ideazione e lo sviluppo degli articoli avviene all’interno di BasicSamples, divisione dot.com incaricata dell’attività di ricerca e
sviluppo, design e prototyping; questa fase è considerata la più importante
di di tutta la catena produttiva e culmina con la produzione e commercializzazione del campionario. Le collezioni possono essere di due tipi: General Make-Up (gmu), collezioni proposte interamente da BasicNet, e Special
Make-Up (smu), proposte dai licenziatari; queste ultime sono generalmente più piccole rispetto alle gmu e i licenziatari possono scegliere se avere
l’esclusiva degli articoli o permetterne l’acquisto ad altri licenziatari.
I licenziatari possono visualizzare e acquistare gli articoli sul sito internet di BasicSamples e hanno la possibilità di interagire con i designers e di
inviare commenti relativi agli articoli; i licenziatari possono acquistare anche solo una parte della mega-collezione proposta da BasicSamples, creando
una collezione più piccola personalizzata alle esigenze del mercato in cui si
96
5. L’AZIENDA REALE: BASICNET
trovano. Secondo i dati di BasicNet del 2002, il 95% degli articoli proposti
da BasicSamples è stato approvato dai licenziatari. Dopo aver ricevuto il
campionario, i licenziatari iniziano l’attività di promozione locale che dura
indicativamente 10 settimane.
Una volta ordinati i campionari, i licenziatari comunicano a BasicForecast
le loro previsioni di vendita; queste informazioni delineano con una buona
approssimazione quella che sarà la produzione per ogni singolo articolo.
L’industrializzazione del prodotto compete a BasicSpecs, che specifica la
distinta base dei singoli capi, in modo da fornire regole comuni a tutti i
produttori sparsi nel mondo.
Dopo la definizione delle specifiche tecniche di produzione degli articoli,
BasicBiddings si rivolge ai Sourcing Centers, gestiti in joint-venture, e alle
Trading Company, esterne al Gruppo, per l’asta di aggiudicazione dei prodotti e quindi alla stesura del listino definitivo, che conterrà il minor prezzo di
produzione offerto durante l’asta per ogni articolo della collezione. I Sourcing
Centers e le Trading Company hanno il compito di individuare e coordinare
le società alle quali affidare la realizzazione dei prodotti.
La fase successiva viene gestita da BasicFactory, che passa alle fabbriche
incaricate della produzione gli ordini dei licenziatari. La produzione richiede
circa quattro mesi di tempo.
Infine, le fabbriche consegnano i prodotti finiti direttamente ai licenziatari, che li distribuiscono ai dettaglianti. Generalmente il prezzo di vendita
all sale degli articoli è pari al prezzo di produzione offerto in fase di asta
moltiplicato per un coefficiente, che viene stabilito da BasicNet, pari a 2.2.
5.6
Le attività di promozione
BasicNet promuove la propria attività e la notorietà dei marchi attraverso
un’importante attività di sponsorizzazione in numerose discipline sportive.
97
5. L’AZIENDA REALE: BASICNET
Il calcio è lo sport dove il marchio Kappa storicamente è più presente e
oggi vestono questo marchio gli atleti di più di 100 team in tutto il mondo tra
cui il Totteham, Feyenoord, Werder Bremen, Real Betis, Genk, Sampdoria e
Brescia.
Tra gli altri sport, BasicNet è attiva nel rugby, con la Nazionale Italiana
ed il più esclusivo club di Francia, lo Stade Français, e nel ciclismo, con i
campioni del mondo della SAECO e nello sci con la fornitura tecnica a 30 tra
i più importanti sci club europei e con le federazioni nazionali di Argentina
e Messico.
Ulteriori attività dell’azienda torinese riguardano anche il basket, con ben
15 squadre di livello internazionale, il volley, con oltre 20 team in 5 paesi, il
motociclismo, con Honda, e l’hockey su ghiaccio.
A sostegno del marchio Robe di Kappa BasicNet è impegnata nel golf con
la federazione italiana campione d’Europa e con l’abbinamento ai prestigiosi
tornei dell’Italian Open e RDK Ladies Europen tour.
98
Capitolo 6
L’azienda virtuale: Basic_jES
6.1
Prima analisi e possibili sviluppi
L’azienda BasicNet è già stata oggetto di studio in due tesi di laurea, Lamieri
(2002) e Merlo (2003a), nelle quali è stata creata una prima formalizzazione
dell’azienda virtuale, Basic_jES. Con questo lavoro si intende rendere più
vicino alla realtà questo modello di impresa e creare uno strumento che sia
in grado di fornire una buona rappresentazione di una realtà complessa come
quella aziendale.
Con la simulazione è possibile mettere a confronto diversi modelli organizzativi che un’impresa potrebbe adottare e analizzare le caratteristiche di
ognuno per definire quali sarebbero i vantaggi e i problemi derivanti da un
cambiamento all’interno dell’azienda. Tuttavia occorre ricordare che questo metodo non è in grado di includere tutte le peculiarità del mondo reale,
pertanto i risultati della simulazione sono in grado di fornire indicazioni di
massima utili a scopo scientifico ma che devono essere considerate con le
dovute cautele nel caso di applicazioni concrete.
Nell’autunno 2004 è uscita una nuova versione di jES, che incorpora
l’analisi presente in Merlo (2003b), nella quale sono presenti tre diverse
99
6. L’AZIENDA VIRTUALE: BASIC_JES
ricostruzioni del business system dell’azienda:
• nella prima viene descritta l’azienda nel modo in cui realmente opera:
BasicNet non partecipa direttamente al processo produttivo, in quanto
quest’ultimo è attribuito totalmente ai Sourcing Centers. Le principali
fonti di ricavo dell’azienda sono rappresentate dall’incasso delle royalties, pari al 10% del totale degli acquisti effettuati dai licenziatari, e
dalla prestazione dei servizi di assistenza a favore delle altre società del
gruppo;
• nella seconda viene descritta un’ipotetica BasicNet che operi come un’azienda tradizionale producendo i prodotti e vendendoli direttamente ai
licenziatari;
• nel terzo esempio si descrive la BasicNet come un’azienda che faccia
produrre i propri prodotti in outsourcing e li venda direttamente ai
licenziatari.
Nel confronto tra modelli di business presente in Merlo (2003b) è stata
eseguita un’analisi dei costi e ricavi originati da ciascuna tipologia di azienda.
Alle divisioni dot.com sono stati assegnati degli ordini di grandezza di costi
fissi e variabili in base a quanto suggerito dalla dottoressa Bruschi1 ; il termine
‘‘dot.com’’ è utilizzato in BasicNet per riferirsi alle divisioni interne illustrate
nel paragrafo 5.4.
Alle Trading Company sono stati imputati costi fissi e variabili pari a 1, a
titolo di puro esempio, a causa della mancanza di dati che indichino il loro
vero valore dei costi di produzione. Infatti le Trading Company sono esterne
all’azienda e le uniche informazioni che BasicNet ha su esse è il prezzo offerto
nella fase di bidding per la produzione delle collezioni.
1
Direttore Generale dei Sistemi Informativi di BasicNet
100
6. L’AZIENDA VIRTUALE: BASIC_JES
Dalle simulazioni svolte si è notato che l’andamento dei costi totali è simile nei tre casi, in quanto il peso delle Trading Company, con costi fissi e
variabili pari a 1, è ininfluente sul totale; per ottenere risultati più realistici
occorrerebbe conoscere i costi reali imputabili alle Trading Company. Nel
secondo e terzo caso si nota inoltre, come previsto, che si registrano ricavi
consistenti durante l’intero periodo, a differenza di quanto accade nella situazione reale; questo perché in queste due ricostruzioni l’azienda partecipa
attivamente a tutte le fasi del processo produttivo e vende direttamente le
collezioni ai licenziatari.
Un possibile sviluppo proposto nei precedenti lavori (Lamieri 2002 e Merlo 2003a) riguarda l’approfondimento del confronto tra i diversi modelli di
business, inserendo valori di costo più vicini alla realtà, e in particolare l’analisi di una divisione dot.com, in particolare BasicSamples, considerata la
parte di maggiore interesse dell’intera azienda. Infatti studiando più a fondo
questa divisione dot.com sarebbe possibile definire un calendario più dettagliato della produzione, che nell’analisi di Lamieri (2002) e Merlo (2003a) è
stato solo ipotizzato.
Una seconda indicazione consiste nello studio più approfondito di due importanti momenti del processo produttivo: le aste bandite da BasicNet nei
confronti delle Trading Company, necessarie per stabilire a chi sarà affidata la produzione dei prodotti, e le previsioni eseguite dai licenziatari sulla
base dei MetaSamples proposti da BasicSamples. I MetaSamples sono, secondo la terminologia dell’azienda, le prime bozze dei modelli che verranno
commercializzati in seguito.
6.2
Novità nell’azienda
Nell’incontro del 26/03/2004 la dottoressa Bruschi mi ha informato di alcune
novità che forse verranno realizzate nell’azienda nel prossimo futuro.
101
6. L’AZIENDA VIRTUALE: BASIC_JES
Entro luglio 2004 il licenziatario italiano Kappa Italia cambierà la ragione sociale in BasicItalia. Il nome attuale era stato utile nel momento della
quotazione dell’azienda nella Borsa Italiana, per dare un punto di riferimento
facilmente riconoscibile agli investitori; l’esigenza di un nuovo nome viene dal
fatto che l’azienda attualmente possiede e commercia diversi marchi: Kappa, Robe di Kappa, Jesus Jeans, K-Way e Superga (gli ultimi due acquisiti
recentemente).
È in fase di studio la possibilità per i Sourcing Centers di assumere un
nuovo ruolo all’interno del gruppo. Attualmente essi propongono, durante la
fase di bidding, un prezzo per la produzione degli articoli di una collezione e in
seguito assegnano la produzione ad altre aziende; queste ultime si occupano
direttamente di consegnare e fatturare ai licenziatari.
La novità consisterebbe nell’affidare ai Sourcing Centers una funzione di
maggiore responsabilità: oltre ad organizzare la produzione delle collezioni
incaricando le aziende dovrebbe consegnare e fatturare la merce ai licenziatari; in questo modo diventerebbero direttamente responsabili del buon fine
della produzione e consegna delle collezioni.
Inoltre attualmente il processo produttivo dell’azienda segue una timetable che specifica le fasi e i relativi tempi necessari per il percorso dei prodotti dalla preparazione dei MetaSamples alla consegna del prodotto finito.
Questa è un’informazione molto utile per il modello, in quanto con queste
nuove indicazioni sarà possibile fare un passo avanti per ottenere una maggior
veridicità della simulazione.
6.3
Le modifiche al modello precedente
Ho effettuato alcune modifiche al modello presente in Lamieri (2002) e Merlo
(2003a) grazie alle nuove informazioni sull’azienda fornite dalla dottoressa
Bruschi e a causa di alcune variazioni nella prassi operativa di BasicNet.
102
6. L’AZIENDA VIRTUALE: BASIC_JES
Per quanto riguarda le collezioni, attualmente BasicNet non produce più
MegaCollection, collezioni di 300 articoli, ma le suddivide in più collezioni
piccole composte da circa 100-150 articoli; ho pertanto deciso di inserire questa novità nel modello. Inoltre attualmente le collezioni possono essere di
due tipi, General Make-Up (gmu) e Special Make-Up (smu); le prime sono
normali collezioni create da BasicNet, mentre per le seconde è presente la
possibilità per i licenziatari di proporre la creazione di nuovi articoli a BasicSamples, in base alle proprie esigenze o a particolari richieste del mercato.
I nuovi articoli possono essere messi a disposizione di tutti i licenziatari o
possono essere considerati come esclusiva del licenziatario, a seconda della
volontà del proponente. Nel modello descritto qui di seguito non è prevista
la presenza di Special Make-Up.
Ho inserito la possibilità per i licenziatari di effettuare un secondo ordine
ai Sourcing Centers a distanza di circa un mese dal primo ordine. La ragione
di questa opportunità è permettere ai licenziatari di ricevere un certo tipo
di articoli prima di altri; ad esempio, per una collezione primavera-estate i
licenziatari potrebbero decidere di ordinare prima le T-shirts e le canottiere
per averle a disposizione già all’inizio di maggio, e in seguito, con il secondo
ordine, i costumi da bagno per poterli commerciare all’inizio di giugno.
Ho inoltre deciso di simulare 2 anni (600 giorni) di vita di BasicNet, in
cui ogni mese è composto da 25 giorni. Per il calendario delle fasi di ciascuna
collezione mi sono basato sulla scansione reale degli ordini, che viene illustrata
nel prossimo paragrafo.
103
6. L’AZIENDA VIRTUALE: BASIC_JES
6.4
Analisi del calendario
6.4.1
La time-table di BasicNet
Secondo la time-table che mi ha consegnato la dottoressa Bruschi il processo
produttivo per ciascuna collezione si articola nelle fasi illustrate in seguito.
Dopo l’esecuzione ciascuna di esse deve essere notificata con una e-mail a
BasicNet. Nella prassi di BasicNet le date delle fasi sono stabilite a ritroso,
partendo dalla data in cui si desidera che sia commercializzata la collezione
fino ad arrivare a determinare il momento in cui deve essere creata; in alcuni
casi è possibile che alcune fasi siano saltate o che altre durino di meno, in
modo da accelerare il processo produttivo, a seconda delle esigenze aziendali.
1. Creation: BasicSamples crea i MetaSamples di una collezione.
2. smu Request: uno o più licenziatari propongono nuovi articoli da inserire in una collezione a parte; anche se il numero di articoli proposto è
esiguo, questi vengono inseriti in una collezione a se stante, una Special
Make-Up.
3. Collection Approved/Rejected: se il licenziatario proponente fornisce le garanzie necessarie viene iniziato lo sviluppo della nuova collezione. La principale garanzia che il licenziatario deve dare è il raggiungimento di una quota di acquisti sufficiente per la copertura dei costi
di produzione dell’articolo.
4. Development: rappresenta il periodo di tempo in cui BasicSamples
sviluppa e definisce i MetaSamples.
5. View What is Ready: è il momento in cui i licenziatari vedono i
primi disegni della nuova collezione ed esprimono un parere in merito;
in base alle loro opinioni BasicNet decide se continuare lo sviluppo degli
104
6. L’AZIENDA VIRTUALE: BASIC_JES
articoli o interromperlo. La maggior parte degli articoli viene in genere
approvato dai licenziatari, infatti le statistiche di BasicNet mostrano
che nel 2002 il 95% degli articoli proposti è stato approvato.
6. Proto Receiving: BasicSamples riceve i prototipi degli articoli della collezione, per essere in grado di effettuare una prima verifica dei
prodotti.
7. BasicSample Buy: BasicSamples vende il campionario ai licenziatari; per la sua realizzazione non viene bandita un’asta tra le Trading
Company, ma viene prodotto direttamente da una sartoria scelta da
BasicSamples.
8. Intermediate Forecast: i licenziatari effettuano una prima previsione degli acquisti per ciascun articolo della collezione. La necessità di
questa previsione è fornire immediatamente a BasicNet un’informazione di massima sui probabili acquisti dei licenziatari; in seguito viene
richiesta una seconda previsione, più attendibile della precedente, dopo
che i licenziatari hanno visionato il campionario.
9. Samples receiving at Licensee Warehouse: i licenziatari ricevono
il campionario.
10. Final Forecast: i licenziatari effettuano la previsione definitiva sugli
acquisti della collezione.
11. Sales Campaign: periodo di tempo di circa un mese nel quale i
licenziatari effettuano la campagna promozionale presso i negozi per
pubblicizzare la nuova collezione e raccogliere gli ordini.
12. Bid: in questa fase BasicBiddings indice l’asta tra i Sourcing Centers
interessati alla produzione della collezione; ciascuno propone un prezzo
105
6. L’AZIENDA VIRTUALE: BASIC_JES
per la produzione di ogni articolo e viene scelto il Sourcing Center che
offre il prezzo più conveniente per BasicNet, vale a dire il più basso.
13. BasicFactory: la collezione di cui è stato venduto il campionario viene pubblicata sul sito www.basicfactory.com; da questo momento i licenziatari possono ordinare la produzione di ogni articolo al Sourcing
Center che ha vinto l’asta;
14. First Deadline: i licenziatari hanno un mese di tempo per effettuare
il primo ordine di acquisto.
15. Second Deadline: secondo ordine dei licenziatari per gli articoli della
collezione.
16. Deliveries To Shop: periodo in cui può essere venduta la collezione;
la produzione e la consegna dei prodotti richiedono circa quattro mesi
di tempo.
Con le date precise in cui è stata eseguita ciascuna fase è possibile aggiornare il calendario della simulazione inserito nel file orderSequence.xls;
per calcolare il tempo da una fase all’altra (mostrato nella Tabella 6.1)
ho considerato soltanto i giorni lavorativi di una settimana (dal lunedi al
venerdi).
106
6. L’AZIENDA VIRTUALE: BASIC_JES
Fase
Data
107
Giorni
Giorni
effettivi
lavorativi
dalla fase seguente
dalla fase seguente
Creation
3-set-03
25
18
Development
28-set-03
10
7
View What is Ready
8-ott-03
25
18
Proto Receiving
2-nov-03
22
15
BasicSample Buy
24-nov-03
113
72
Intermediate Forecast
16-mar-04
0
0
Licensee Warehouse
16-mar-04
0
0
Final Forecast
16-mar-04
0
1
Sales Campaign
17-mar-04
15
10
1-apr-04
39
26
BasicFactory
10-mag-04
15
11
First Deadline
25-mag-04
27
18
Second Deadline
21-giu-04
133
94
Deliveries To Shop
1-nov-04
Samples receiving at
Bid
Tabella 6.1: Successione delle fasi per una collezione
6. L’AZIENDA VIRTUALE: BASIC_JES
6.4.2
Il calendario di Basic_jES
Per stabilire il calendario della simulazione ho ripreso il modello creato in Lamieri (2002) e Merlo (2003a) e ho adattato il calendario dell’azienda simulata
al calendario dell’azienda reale. Le fasi della simulazione sono le seguenti:
1. Disegno dei Metasamples: BasicSamples crea una nuova collezione.
2. Previsione dei licenziatari : ciascun licenziatario esprime una previsione
degli acquisti per ciascun articolo della collezione.
3. Somma delle previsioni : BasicForecast somma le previsioni dei licenziatari per ciascun articolo della collezione; se le previsioni superano
una certa soglia l’articolo viene sviluppato, in caso contrario viene
abbandonato.
4. Produzione campionario: BasicSample, tramite un Sourcing Center da
essa scelto, produce il campionario.
5. Consegna Campionario: il campionario viene consegnato ai licenziatari.
6. Asta Trading Company: le cinque Trading Company presenti nella simulazione offrono un prezzo per la produzione di ciascun articolo della
collezione.
7. Scelta Trading Company: BasicBiddings sceglie, per ciascun articolo,
la Trading Company che ha offerto il prezzo di produzione minore e
affida a questa la produzione.
8. Primo ordine: i licenziatari effettuano un ordine per la collezione.
9. Secondo ordine: i licenziatari effettuano il secondo ordine.
10. Produzione: la Trading Company che ha vinto l’asta inizia la produzione.
108
6. L’AZIENDA VIRTUALE: BASIC_JES
11. Consegna: le Trading Company consegnano i prodotti ai licenziatari.
6.5
Le ricette produttive
Le ricette produttive descrivono i passi che le unità del modello devono compiere. Ho mantenuto le stesse presenti in Lamieri (2002) e Merlo (2003a) e
ne ho aggiunta una nuova che permette ai licenziatari di effettuare il secondo
ordine alle Trading Company.
Le ricette 101, 102, 103, 104 descrivono la fase di creazione del campionario di quattro collezioni diverse. Nel modello precedente si riferivano rispettivamente alla creazione di una collezione Kappa, Robe di Kappa, ‘‘scarpe”
e ‘‘sport’’. Per aggiornare il modello ho chiamato queste quattro ricette con
i marchi posseduti attualmente da BasicNet, perciò:
• La ricetta 101 si riferisce ad una collezione Kappa.
• La ricetta 102 si riferisce ad una collezione Robe di Kappa.
• La ricetta 103 si riferisce ad una collezione K-Way.
• La ricetta 104 si riferisce ad una collezione Superga.
Le ricette da 201 a 235 consentono ai licenziatari di esprimere una previsione di acquisto su ciascun articolo della collezione.
Con la ricetta 300 BasicForecast somma le previsioni dei licenziatari per
ogni articolo.
La ricetta 301 simula la produzione del campionario della collezione e
accumula i prodotti nella endUnit 101.
La ricetta 302 esegue un procurement sulla endUnit in cui è contenuto
il campionario e simula la consegna ai licenziatari; in seguito sono anche
contabilizzati i ricavi derivanti dalla sua vendita.
Le ricette da 401 a 405 simulano l’asta tra le Trading Company.
109
6. L’AZIENDA VIRTUALE: BASIC_JES
Con ricetta 500 BasicBiddings sceglie la vincente dell’asta: vince la Trading Company che ha offerto il prezzo di produzione più conveniente.
Le ricette da 601 a 635 simulano il primo ordine dei licenziatari.
Le ricette da 701 a 735 descrivono il secondo ordine dei licenziatari.
Con la ricetta 800 le Trading Company producono le collezioni e accumulano gli articoli nella endUnit 102.
Con la ricetta 900 le unità rappresentative di BasicNet effettuano un
procurement sulla endUnit 102 e simulano la consegna delle collezioni ai
licenziatari; inoltre viene contabilizzato il valore delle royalties derivanti dalla
vendita.
La ricetta 1 conclude la simulazione.
6.6
Le memoryMatrixes
Le memoryMatrixes sono utili per gestire le operazioni immateriali e per
contenere i dati della simulazione per tutte le collezioni e possono essere
utilizzate con l’ausilio degli oggetti computazionali. Ho ridotto le dimensioni
delle colonne da 301 a 152, in quanto nel modello sono state eliminate le
MegaCollections sostituendole con collezioni minori. Le matrici di memoria
del modello sono le seguenti:
designMatrix : vettore di una riga e una colonna nel quale viene inserito il
numero di MetaSamples disegnati da BasicSample;
agentMatrix : matrice nella quale sono salvate, nella prima riga, le previsioni dei licenziatari per ciascun articolo della collezione e le quantità
richieste nel primo e nel secondo ordine, rispettivamente nella seconda e nella terza riga; nel modello è presente una agentMatrix per ogni
licenziatario;
110
6. L’AZIENDA VIRTUALE: BASIC_JES
tcMatrix : matrice in cui sono salvati i prezzi offerti dalla Trading Company;
anche in questo caso si ha una matrice per ogni Trading Company;
basicNetMatrix : contiene le informazioni possedute da BasicNet:
• la prima riga contiene la somma dei valori previsti dai licenziatari
per ogni articolo;
• la seconda indica lo status di ciascun articolo: 0 se è da non realizzare, 1 se è da realizzare, 2 se il campionario è stato realizzato,
3 se l’articolo è stato prodotto;
• la terza contiene il prezzo, per ogni articolo, che ha vinto l’asta
per la produzione;
• la quarta contiene la quantità di ogni articolo richiesta dai licenziatari per il primo ordine;
• la quinta contiene la quantità di ogni articolo richiesta dai licenziatari per il secondo ordine;
• la sesta indica la quantità totale richiesta dai licenziatari per ogni
articolo; il valore inserito in questa riga per ciascun articolo sarà
moltiplicato per il prezzo di vendita nel momento in cui si BasicNet
calcola e contabilizza le royalties.
orMatrix : in ogni colonna è indicata la Trading Company che deve produrre
l’articolo a cui è intestata la colonna.
6.7
Le modifiche al codice
Nella classe ComputationalAssembler.java ho inserito un nuovo oggetto computazionale, C1909, che permette ai licenziatari di effettuare il secondo
ordine.
111
6. L’AZIENDA VIRTUALE: BASIC_JES
Inizialmente il codice crea un contatore con il metodo privato getCounter
verifica che la riga e colonna 0 della designMatrix non sia vuota, cioè che la
collezione esista. In seguito controlla che il licenziatario abbia effettuato il
primo ordine alla Trading Company; per far ciò utilizza il metodo getEmpty,
il quale controlla che la casella della memoryMatrix del licenziatario preso in
considerazione non sia vuota, in caso contrario non si esegue il nuovo ordine
e nella riga 3 alla colonna corrispondente all’articolo dell’agentMatrix viene
scritto il valore 0; la stessa cosa avviene nella sesta riga della basicNetMatrix
nel caso che la casella in considerazione sia vuota. L’obiettivo di questo
accertamento è evitare che sia fatto un ordine per un articolo il cui sviluppo
è stato abbandonato.
In seguito il passo computazionale sceglie se effettuare un nuovo ordine
in modo casuale, utilizzando come parametro un numero estratto da una distribuzione normale con media 100 e varianza 50000; se il numero è maggiore
della media della distribuzione l’ordine è eseguito.
Anche la quantità da ordinare è scelta in modo casuale estraendo un
campione da una distribuzione normale con media 500 e varianza 900000 (si
attivano dei correttivi nel caso che il valore ottenuto sia troppo piccolo o
troppo grande). Il valore così ottenuto è salvato nelle caselle corrispondenti
all’articolo dell’agentMatrix e della basicNetMatrix con il metodo setValue,
e sul monitor è stampata l’indicazione dell’avvenuto ordine del licenziatario
e la quantità ordinata.
In seguito il passo computazionale somma, per ogni articolo, il valore dei
due ordini e lo inserisce nella riga 6 della basicNetMatrix; questo valore sarà
utile nel corso della simulazione per la Trading Company che dovrà produrre
l’articolo e per il calcolo del valore delle royalties.
¨
Listing 6.1: ComputationalAssembler.java: C1909
p u b l i c v o i d c1909 ( )
112
6. L’AZIENDA VIRTUALE: BASIC_JES
113
{
int threshold = 100;
checkMatrixes (1909 ,3);
d e s i g n M a t r i x =(MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 0 ) ;
a g e n t M a t r i x =(MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 1 ) ;
b a s i c N e t M a t r i x =(MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 2 ) ;
l a y e r=p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t . g e t O r d e r L a y e r ( ) ;
i n t j = g e t C o u n t e r ( agentMatrix , 3 ) ;
i f ( ! d e s i g n M a t r i x . getEmpty ( l a y e r , 0 , 0 ) )
{
i f ( j <= d e s i g n M a t r i x . g e t V a l u e ( l a y e r , 0 , 0 ) )
{
// Checks i f t h e l i c e n s e e has a l r e a d y done t h e f i r s t o r d e r
i f ( ! a g e n t M a t r i x . getEmpty ( l a y e r , 2 , j ) )
{
int select = ( int )
normal . getSampleWithMean$withVariance ( 1 0 0 , 5 0 0 0 0 ) ;
// d e c i d e t o do or not a n o t h e r o r d e r
i f ( select > threshold )
{
int order2 = ( int )
normal . getSampleWithMean$withVariance ( 5 0 0 , 9 0 0 0 0 0 ) ;
//Min v a l u e
i f ( o r d e r 2 <10)
order2 = 10;
6. L’AZIENDA VIRTUALE: BASIC_JES
114
//Max v a l u e
i f ( o r d e r 2 >25000)
order2 = 25000;
agentMatrix . setValue ( layer , 3 , j , order2 ) ;
i f ( b a s i c N e t M a t r i x . getEmpty ( l a y e r , 5 , j ) )
basicNetMatrix . setValue ( layer , 5 , j , 0 . 0 ) ;
i n t totOrder2 = ( i n t )
basicNetMatrix . getValue ( layer , 5 , j ) + order2 ;
basicNetMatrix . setValue ( layer , 5 , j , totOrder2 ) ;
System . out . p r i n t l n ( "The␣2nd␣ o r d e r ␣ o f ␣ L i c e n s e e␣#"
+ myUnit . getUnitNumber ( ) + " ␣ i s ␣ " + o r d e r 2 + " ␣ f o r ␣ item␣#"
+ j + " ␣ with ␣ l a y e r ␣#" + l a y e r + " ␣ t o t O r d e r␣#"+ t o t O r d e r 2 ) ;
} // end i f ( s e l e c t )
else
{
agentMatrix . setValue ( layer , 3 , j , 0 . 0 ) ;
i f ( b a s i c N e t M a t r i x . getEmpty ( l a y e r , 5 , j ) )
basicNetMatrix . setValue ( layer , 5 , j , 0 . 0 ) ;
} // end e l s e
i n t totOrder1 = ( i n t ) basicNetMatrix . getValue ( layer , 4 , j ) ;
i n t totOrder2 = ( i n t ) basicNetMatrix . getValue ( layer , 5 , j ) ;
i n t totOrder = totOrder1 + totOrder2 ;
basicNetMatrix . setValue ( layer , 6 , j , totOrder ) ;
6. L’AZIENDA VIRTUALE: BASIC_JES
115
}/ end i f ( c h e c k i n g f i r s t o r d e r )
}
}
}
done = t r u e ;
// The a r t i c l e can not be o r d e r e d −> done=f a l s e
} // end c1909
§
­
6.8
Analisi di diversi business system
L’obiettivo finale di questo lavoro è l’analisi di tre diverse modalità di business system che BasicNet potrebbe adottare. Nel primo caso si descrive la
BasicNet reale, che affida le fasi della produzione e delle vendite totalmente
ai Sourcing Centers o alle Trading Company. Nella seconda ricostruzione si
immagina una BasicNet che agisca come un’azienda tradizionale, producendo
i prodotti al suo interno e vendendoli direttamente ai licenziatari. Nel terzo
esempio si rappresenta la BasicNet come un’azienda che produce le collezioni
in outsourcing, tramite le Trading Company, ma che si occupa direttamente
della vendita.
Con l’analisi di costi e ricavi originati in queste tre situazioni è possibile
effettuare un confronto tra il modello di business adottato da BasicNet e due
ipotetici business system alternativi. Tuttavia occorre ricordare che lo studio
qui proposto prende in considerazione solo alcuni aspetti della realtà, perciò i
risultati ottenuti possono costituire un’indicazione per le scelte aziendali che
deve essere affiancata anche da altre valutazioni; questo modello infatti offre
un confronto tra tre diversi tipi di gestione partendo da una base comune,
la BasicNet come è descritta nel caso 1, che è diversa da quella reale per-
¦
6. L’AZIENDA VIRTUALE: BASIC_JES
ché nella vera azienda possono verificarsi eventi diversi da quelli immaginati
in Basic_jES. Il modello illustrato fornirebbe risultati assoluti nel solo caso in cui la realtà descritta nel computer riproducesse quella del mondo reale.
Nei prossimi paragrafi è illustrata la formalizzazione dei tre diversi modelli
di Basic_jES e le modifiche portate al modello generale descritto precedentemente.
6.9
Caso 1
In questa ricostruzione si presenta la BasicNet reale, che opera come descritto nel paragrafo 6.4.1. Gli unici costi che l’azienda sostiene sono legati al
mantenimento del network e all’ideazione e produzione del campionario; i
centri di costo sono rappresentati dalle divisioni dot.com. I ricavi sono originati dalla vendita del campionario ai licenziatari e dalla riscossione delle
royalties, che rappresentano il 10% degli acquisti effettuati dai licenziatari
alle Trading Company; le royalties sono suddivise all’interno della BasicNet
nel seguente modo:
• 4% a World Wide Strategic Advertisement, che ha funzioni di marketing;
• 4% per la remunerazione del marchio;
• il restante 2% ripartito tra le divisioni dot.com nel modo illustrato in
Tabella 6.2;
6.9.1
Le unità produttive
In questo modello, come nella BasicNet reale, le Trading Company consegnano direttamente la merce ai licenziatari, perciò per ciascuna di esse ho ag-
116
6. L’AZIENDA VIRTUALE: BASIC_JES
117
DIVISIONE
% royalties
BasicSamples
0,5%
BasicForecast
0,25%
BasicSpecs
0,25%
BasicBiddings
0,25%
BasicFactory
0,25%
BasicNet
0,5%
TOTALE
2%
Tabella 6.2: Suddivisione delle royalties
giunto un’unità produttiva nel file unitData/unitBasicData.txt, ipotizzando
che all’interno siano organizzate almeno in due divisioni: la prima si occupa
dell’asta per l’aggiudicazione e della produzione e la seconda della consegna
ai licenziatari.
In questo caso le unità produttive sono le seguenti:
• 35 licenziatari, ognuno suddiviso in due sezioni, una che si occupa di
effettuare le previsioni sugli acquisti futuri e una che esegue gli ordini;
• 5 Trading Company, strutturate nel modo illustrato precedentemente;
• BasicSamples, divisa in quattro sezioni ognuna incaricata della gestione
di uno specifico tipo di collezione;
• BasicForecast;
• BasicSpecs;
• un’ipotetica Trading Company che rappresenta una sartoria che produce il campionario per conto di BasicSamples. È un’unità esterna
a BasicNet, alla quale non sono imputati costi, in quanto sono già
compresi nei costi di BasicSamples;
6. L’AZIENDA VIRTUALE: BASIC_JES
118
• BasicBiddings;
• BasicFactory;
• unità rappresentative di BasicNet che si occupano della consegna del
campionario, della contabilizzazione dei ricavi e interrompono la simulazione al giorno 600.
In questa ricostruzione le uniche unità che originano dei costi sono le
divisioni dot.com, perché i licenziatari e le Trading Company sono unità
esterne a BasicNet. Per ottenerne un’indicazione plausibile ho estratto i
valori dalla sezione del bilancio consolidato di BasicNet in cui si elencano i
costi di gestione in base alla loro variabilità (Figura 6.1); i costi al di sopra
del Margine di Contribuzione sono tutti variabili, mentre quelli al di sotto
sono fissi. Nell’incontro del 26/03/2004 la dottoressa Bruschi mi ha suggerito
di ripartire i costi fissi in base alla suddivisione delle royalties mostrata in
Tabella 6.2 e di imputare solo a BasicSamples costi variabili, perché è l’unica
divisione la cui operatività è legata al numero di MetaSamples prodotti, a
differenza delle altre che hanno soltanto compiti di gestione del network di
BasicNet.
I costi fissi delle divisioni sono mostrati nella Tabella 6.3. Per ottenere
il costo unitario variabile da assegnare a BasicSamples occorre dividere il
valore a bilancio dei costi variabili totali per il numero di articoli creati da
BasicNet nell’anno 2002, pari a 66762 :
CU VBasicSamples =
CV T
n◦ M etaSamples
=
59.806.000 ∼
= 8.958
6.676
Il valore dei costi di ciascuna divisione deve essere diviso per il numero
di unità che nel modello la rappresentano; questo numero si può ricavare dal
2
Fonte: BasicNet (2002)
6. L’AZIENDA VIRTUALE: BASIC_JES
Figura 6.1: Costi variabili e fissi di BasicNet
unitData/unitBasicData.txt. In questo file sono indicati anche il valore dei
costi fissi e variabili di ciascuna unità.
Dal momento che i costi presi in considerazione sono annuali, i costi fissi
dovranno anche essere divisi per il numero di giorni che rappresentano un
anno nel modello (300) e per il numero di tick che compongono un giorno
della simulazione (32). La motivazione è che jES contabilizza i costi ad ogni
tick e non facendo ciò si causerebbe un’amplificazione dei costi dell’azienda.
I costi variabili di BasicSamples non devono essere divisi per il numero di
tick totali della simulazione, in quanto essi indicano quanto costa all’azienda
la produzione di ciascun articolo. Perciò questo valore deve essere diviso per
il numero di tick necessari alla produzione di ogni MetaSamples; il motivo è
che ad ogni tick jES contabilizza il costo variabile delle unità attive, quindi
se un’unità impiega 6 tick per la creazione di un articolo il costo totale sarà
pari a sei volte il costo indicato nel file unitData/unitBasicData.txt.
119
6. L’AZIENDA VIRTUALE: BASIC_JES
Divisione
% costo
120
CFT
imputabile
BasicSamples
25%
9.874.000
BasicForecast
12,5%
4.937.000
BasicSpecs
12,5%
4.937.000
BasicBiddings
12,5%
4.937.000
BasicFactory
12,5%
4.937.000
BasicNet
25%
9.874.000
TOTALE
100%
39.947.000
Tabella 6.3: Costi fissi delle divisioni dot.com (in euro)
6.9.2
Le nuove ricette
Ho diviso la ricetta 900, che simula la consegna dei prodotti ai licenziatari e
contabilizza il valore delle royalties, in due distinte, perché nella realtà questi
incarichi spettano a due soggetti diversi.
Ho creato la ricetta 900 (Figura 6.2) che simula la consegna degli articoli della collezione ai licenziatari effettuando un procurement sull’endUnit
102 da parte della Trading Company incaricata della produzione; in seguito
l’oggetto computazionale C1913 aggiorna lo status dell’articolo inserendo
nella riga 2 della basicNetMatrix il numero 4, che significa ‘‘prodotto consegnato”, e stampa sul monitor l’indicazione che l’articolo è stato consegnato
ai licenziatari dalla Trading Company che lo ha prodotto. Nella ricetta è
presente il processo or che è utilizzato per scegliere la Trading Company che
dovrà consegnare l’articolo ai licenziatari; per la decisione si fa ricorso alla
orMatrix, matrice di memoria in cui in ciascuna colonna è indicato il numero
della Trading Company che ha prodotto l’articolo a cui è intestata la colonna
stessa.
6. L’AZIENDA VIRTUALE: BASIC_JES
Figura 6.2: Ricette 900 e 950
La ricetta 950 (Figura 6.2) simula il pagamento e la contabilizzazione
delle royalties da parte di BasicNet; il passo computazionale C1912 ne calcola il valore moltiplicando per 0,1 il totale dei ricavi derivanti dalla vendita
degli articoli e lo inserisce nel file log/grossSales.txt creato dalla simulazione.
Nell’incontro del 13/07/2004 la dottoressa Bruschi mi ha informato che
in BasicNet il prezzo di vendita di ciascun articolo si ottiene moltiplicando
per un coefficiente il prezzo di produzione offerto dalla Trading Company che
ha vinto l’asta; questo coefficiente è calcolato da un software e attualmente
è pari a 2,2 per tutti gli articoli. Nel modello Basic_jES la determinazione
del prezzo all sale avviene nello modo descritto qui sopra.
6.9.3
Il calendario
Anche il calendario ha subito una modifica rispetto a quanto descritto nei
paragrafi precedenti, in quanto ho ipotizzato che i licenziatari paghino le
royalties a BasicNet dopo un certo periodo di tempo. Pertanto l’esecuzione
della sopra descritta ricetta 950 avviene 10 giorni dopo la consegna delle
collezioni.
121
6. L’AZIENDA VIRTUALE: BASIC_JES
6.9.4
122
Le modifiche al codice
C1913
Ho inserito nella classe ComputationalAssembler.java il metodo C1913, che
simula la distribuzione degli articoli da parte delle Trading Company.
Questo passo computazionale, dopo aver creato un contatore, verifica che
la designMatrix non sia vuota e controlla il numero di MetaSamples con
il metodo getValue. In seguito va a determinare lo status dell’articolo nella
seconda riga della basicNetMatrix e, se l’articolo considerato è stato prodotto
(il suo status è 3), inserisce nella casella il valore 4 con il metodo setValue,
per indicare che il prodotto è stato consegnato.
Successivamente l’oggetto computazionale cerca nella orMatrix il numero
della Trading Company incaricata di produrre l’articolo e lo copia nella colonna 0 della della matrice; si utilizza questo espediente perché jES durante
la simulazione legge il branch da scegliere per il processo or nella casella (1,0)
della orMatrix.
Infine, sul monitor è stampata l’indicazione che l’articolo è stato consegnato dalla Trading Company incaricata di produrlo.
¨
Listing 6.2: ComputationalAssembler.java: C1913
p u b l i c v o i d c1913 ( )
{
checkMatrixes (1913 ,3);
d e s i g n M a t r i x =(MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 0 ) ;
b a s i c N e t M a t r i x =(MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 1 ) ;
o r M a t r i x =(MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 2 ) ;
l a y e r = pendingComputationalSpecificationSet . getOrderLayer ( ) ;
6. L’AZIENDA VIRTUALE: BASIC_JES
123
i n t counter = getCounter ( basicNetMatrix , 2 ) ;
i f ( ! d e s i g n M a t r i x . getEmpty ( l a y e r , 0 , 0 ) )
{
i f ( c o u n t e r <= d e s i g n M a t r i x . g e t V a l u e ( l a y e r , 0 , 0 ) )
{
// Check i f item has been produced
i f ( basicNetMatrix . getValue ( layer , 2 , counter ) > 2)
{
f l o a t tc = orMatrix . getValue ( layer , 1 , counter ) ;
orMatrix . setValue ( layer , 1 , 0 , tc ) ;
System . out . p r i n t l n ( " Item␣␣#" + c o u n t e r + " ␣ with ␣ l a y e r ␣#"
+ l a y e r + " ␣ has ␣ been ␣ d e l i v e r e d ␣by␣ Trading ␣Company␣ " +
orMatrix . getValue ( layer , 1 , 0 ) ) ;
basicNetMatrix . setValue ( layer , 2 , counter , 4 . 0 ) ;
}
}
}
done = t r u e ;
} // end c1913
§
­
C1912
Ho portato alcune modifiche al passo computazionale C1912 che si occupa
della contabilizzazione delle royalties. Questo metodo inizialmente crea un
contatore, cerca il numero di MetaSamples creati nella designMatrix e in
seguito controlla nella basicNetMatrix, per ciascun articolo, il suo status (riga
¦
6. L’AZIENDA VIRTUALE: BASIC_JES
124
2), il prezzo di produzione che ha vinto l’asta (riga 3) e la quantità totale
ordinata dai licenziatari (riga 6). Successivamente, se lo status dell’articolo è
4, cioè ‘‘prodotto consegnato’’, si calcolano il prezzo di vendita dell’articolo
moltiplicando il prezzo offerto dalla Trading Company per 2.23 , il totale dei
ricavi e il valore delle royalties. Il valore delle royalties è memorizzato nel
file nel file log/grossSales.txt insieme all’indicazione del tick in cui è stato
contabilizzato. Infine sul monitor è stampata l’indicazione che le royalties
sono state pagate.
Listing 6.3: ComputationalAssembler.java: C1912
¨
p u b l i c v o i d c1912 ( )
{
checkMatrixes (1912 ,2);
d e s i g n M a t r i x =(MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 0 ) ;
b a s i c N e t M a t r i x =(MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 1 ) ;
l a y e r=p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t . g e t O r d e r L a y e r ( ) ;
i n t counter = getCounter ( basicNetMatrix , 6 ) ;
i f ( ! d e s i g n M a t r i x . getEmpty ( l a y e r , 0 , 0 ) )
{
i f ( c o u n t e r <= d e s i g n M a t r i x . g e t V a l u e ( l a y e r , 0 , 0 ) )
{
i f ( ! b a s i c N e t M a t r i x . getEmpty ( l a y e r , 2 , c o u n t e r )
&& ! b a s i c N e t M a t r i x . getEmpty ( l a y e r , 3 , c o u n t e r )
&& ! b a s i c N e t M a t r i x . getEmpty ( l a y e r , 6 , c o u n t e r ) )
{
i f ( basicNetMatrix . getValue ( layer , 2 , counter ) > 3.0)
{
3
vedi paragrafo 6.9.2
6. L’AZIENDA VIRTUALE: BASIC_JES
125
double itemPrice =
basicNetMatrix . getValue ( layer , 3 , counter ) ∗ 2 . 2 ;
double totRevenues =
itemPrice ∗ basicNetMatrix . getValue ( layer , 6 , counter ) ;
double itemSales = ( totRevenues ∗ 0 . 1 ) ;
System . out . p r i n t l n ( " R o y a l t i e s ␣ f o r ␣ item␣␣#" +
c o u n t e r + " ␣ with ␣ l a y e r ␣#" + l a y e r +
" ␣ have ␣ been ␣ payed ␣by␣ l i c e n s e e s " ) ;
String text =
G l o b a l s . env . getCurrentTime ( ) + " ␣ | ␣ " +
i t e m S a l e s + " ␣\n" ;
logOpen ( f a l s e , " l o g / g r o s s S a l e s . t x t " ) ;
try
{
grossSalesLog . write ( text ) ;
grossSalesLog . flush ( ) ;
}
c a t c h ( IOException e )
{
System . out . p r i n t l n ( e ) ;
MyExit . e x i t ( 1 ) ;
}
}
}
}
}
done = t r u e ;
} // end c1912
§
­
¦
6. L’AZIENDA VIRTUALE: BASIC_JES
126
C1910
Ho effettuato una modifica anche al codice del metodo C1910, il cui compito
è concludere la simulazione e creare il file log/report.txt; questo file indica,
per ogni collezione, il numero di MetaSamples creati e il numero di articoli
prodotti e abbandonati, in base al loro status indicato nella riga 2 della
basicNetMatrix. Ho impostato la creazione di questo file in modo che sia
indicato anche il numero di articoli che sono stati consegnati per ciascuna
collezione.
Il file log/report.txt è utile perché permette di verificare quanti sono gli
articoli che sono prodotti e consegnati e quanti quelli che sono abbandonati
a causa delle insufficienti previsioni di acquisto dei licenziatari.
6.9.5
I parametri della simulazione
Qui di seguito viene mostrato il file jesframe.scm, nel quale sono indicati i
parametri su cui si basa la simulazione e che sono mostrati nel probe del
ESFrameModelSwarm e del ESFrameObserverSwarm. Il linguaggio di programmazione utilizzato in questo file si chiama scheme, ed è un dialetto del
linguaggio Lisp.
Listing 6.4: jesframe.scm per il Caso 1
¨
( list
(
c o n s ’ eSFrameObserverSwarm
(
make−i n s t a n c e ’ ESFrameObserverSwarm
#: d i s p l a y F r e q u e n c y
32
#: v e r b o s e C h o i c e
#f
#: p r i n t M a t r i x e s
#f
#: checkMemorySize
#f
#: unitHistogramXPos
1
6. L’AZIENDA VIRTUALE: BASIC_JES
127
#: unitHistogramYPos
600
#: endUnitHistogramXPos
578
#: endUnitHistogramYPos
1
)
)
(
c o n s ’ eSFrameModelSwarm
(
make−i n s t a n c e ’ ESFrameModelSwarm
#: u s e O r d e r D i s t i l l e r
#t
#: ticksInATimeUnit
32
#: totalUnitNumber
134
#: totalEndUnitNumber
2
#: totalLayerNumber
17
#:totalMemoryMatrixNumber
43
#: sameStepLifoAssignment
#t
#: assignEqualStepsToSameUnit
#t
#:maxTickInAUnit
2080
#: useWarehouses
#f
#: useNewses
#f
#: revenuePerEachRecipeStep
0
#: r e v e n u e P e r C o s t U n i t
0
#: o r C r i t e r i o n
5
#:orMemoryMatrix
#: u n i t C r i t e r i o n
42
2
)
)
)
;
§
­
¦
Essi significano:
useOrderDistiller: la successione delle ricette viene tratta dal file recipeData/orderSequence.xls; se il parametro fosse impostato false gli ordini
verrebbero generati in modo casuale;
6. L’AZIENDA VIRTUALE: BASIC_JES
ticksInATimeUnit: indica il numero di tick che costituiscono un giorno
della simulazione; in questo caso sono 32, ciascuno pari a 15 minuti;
totalUnitNumber: indica il numero di unità della simulazione;
totalEndUnitNumber: numero delle endUnit;
totalLayerNumber: numero di layer;
totalMemoryMatrixNumber: numero delle matrici di memoria;
sameStepLifoAssignment: se impostato su true, se un’unità è in grado
effettuare due passi per uno stesso ordine, la produzione avviene con
procedura LIFO; in questo modo la produzione risulta sequenziale;
assignEqualStepsToSameUnit: se impostato su true, se un ordine necessita dello stesso passo per due volte consecutive tra loro, la lavorazione
viene svolta dalla stessa unità;
maxTickInAUnit: indica il numero massimo di tick in cui un ordine può
rimanere nella lista d’attesa di un’unità; una volta trascorsi l’ordine
viene eliminato;
useWarehouse: se impostato su true significa che le unità creano magazzini;
useNewses: se è impostato su true le unità si scambiano informazioni;
revenuePerEachRecipeStep e revenuePerCostUnit: metodo di calcolo dei ricavi; siccome in questo caso Basic_jES non presenta ricavi, i
parametri sono entrambi nulli;
orCriterion: indica il criterio di scelta del ramo da parte del processo or
avviene con l’ausilio della orMatrix ;
128
6. L’AZIENDA VIRTUALE: BASIC_JES
orMemoryMatrix: numero della orMatrix ;
unitCriterion: indica il criterio di assegnazione degli ordini tra unità che
sono in grado di eseguire lo stesso passo; in questo caso, l’ordine viene
assegnato all’unità che ha la lista d’attesa meno lunga.
6.10
Caso 2
In questa seconda ricostruzione si presenta una BasicNet che si comporta
come un’azienda tradizionale che produce le collezioni al suo interno e le
vende direttamente ai licenziatari.
Costi e ricavi hanno una diversa origine causata dalla differente operatività dell’impresa rispetto al caso precedente. I costi derivano dalla produzione
diretta degli articoli da parte delle Trading Company, che in questo modello
sono considerate unità interne alle quali sono pertanto attribuiti dei costi. I
ricavi sono originati dalla vendita diretta delle collezioni ai licenziatari e sono
calcolati in base ad un margine di ricarico applicato sui costi di produzione.
Dal momento che le Trading Company sono unità interne all’azienda,
non ha più senso che l’assegnazione delle produzioni degli articoli sia decisa
tramite un’asta, perché è più corretto immaginare che di volta in volta le
lavorazioni siano affidate alla Trading Company con la lista d’attesa meno
lunga; per ottenere questo risultato ho portato alcune modifiche al modello
illustrato nei paragrafi precedenti.
6.10.1
Le modifiche al modello
Le ricette
Per ottenere un’azienda in cui i prodotti sono fabbricati internamente e le
attività sono assegnate alle unità secondo il criterio del numero di lavorazioni
presenti nelle liste d’attesa è necessario modificare la ricetta che descrive la
129
6. L’AZIENDA VIRTUALE: BASIC_JES
fase di produzione ed eliminare quelle che gestiscono l’asta tra le Trading
Company.
Ho perciò eliminato le ricette 401, 402, 403, 404, 405, che simulano
l’offerta di un prezzo di produzione da parte di ogni Trading Company, e la
ricetta 500, il cui compito è scegliere la Trading Company vincente.
Inoltre ho modificato la ricetta 800, riferita alla produzione; in questo caso gli articoli possono essere prodotti da una qualsiasi delle Trading Company
e la scelta è fatta in base alla waiting list di ciascuna. Perciò ho eliminato
il processo or secondo cui la decisione è effettuata in base alla orMatrix e
ho ottenuto la nuova ricetta mostrata in Figura 6.3 composta di un solo
passo incaricato della produzione degli articoli. Questa ricetta non contiene
nessuna computazione, perciò è lanciata per ogni prodotto, anche per quelli
abbandonati; questo non è però un errore, perché nella versione definitiva del
modello la ricetta sarà lanciata da un’altra ricetta nel solo caso in cui l’articolo debba essere prodotto. Per una trattazione più approfondita si rimanda
a Balla (2004).
Figura 6.3: Ricetta 800
In questo modello le collezioni sono consegnate direttamente da BasicNet,
perciò ho eliminato dal file recipeData/recipes.xls le ricette 900 e 950 descritte nel paragrafo 6.9.2 e le ho sostituite con una ricetta unica, mostrata nella
Figura 6.4 che simula la consegna degli articoli ai licenziatari effettuando un
procurement sull’endUnit 102; l’oggetto computazionale C1913 stampa sul
monitor l’indicazione che l’articolo è stato consegnato.
Ho anche modificato la ricetta 302, che si occupa di consegnare il campionario, eliminando l’oggetto computazionale C1911 il cui compito era cal-
130
6. L’AZIENDA VIRTUALE: BASIC_JES
Figura 6.4: Ricetta 900
colare il prezzo degli articoli del campionario. Infatti in questa ricostruzione
i ricavi del campionario sono compresi nel calcolo del margine di ricarico. La
nuova ricetta, mostrata in Figura 6.5, esegue un procurement sull’endUnit
101 (nella quali è ‘‘immagazzinato” il campionario) e simula la consegna ai
licenziatari. Nella versione definitiva del modello anche questa ricetta è lanciata da un’altra ricetta, il cui compito è valutare se il campionario debba
essere consegnato.
Figura 6.5: Ricetta 302
Il calendario
Nel calendario, descritto nel file recipeData/orderSequence.xls, ho eliminato
per tutte le collezioni prodotte durante la simulazione la fase dell’asta, che si
articola in due momenti: inizialmente le Trading Company offrono un prezzo
di produzione per ogni articolo e successivamente BasicBiddings sceglie la
vincente.
Le unità
Ho portato anche alcune modifiche al file unitData/unitBasicData.txt; in
questo modello tutte le Trading Company sono in grado di effettuare lo stesso
passo produttivo, il numero 2010, il cui compito è produrre gli articoli (come
si vede in Figura 6.3).
131
6. L’AZIENDA VIRTUALE: BASIC_JES
Ho anche eliminato dal modello le unità che rappresentano BasicBiddings
e BasicFactory, perché la prima rimarrebbe inattiva per tutta la simulazione,
e la seconda non ha più motivo di esistere, siccome l’assegnazione della produzione avviene secondo quanto stabilito dall’orCriterion. A causa di queste
modifiche ho modificato il parametro totalUnitNumber nel file jesframe.scm,
che indica il numero di unità del modello.
Le matrici di memoria
Le matrici di memoria relative alle Trading Company non sono più necessarie,
dal momento che non esiste più l’asta. Inoltre occorre cancellare la orMatrix,
che non è più utilizzata durante la simulazione.
Perciò in questo modello le memoryMatrix sono una per ogni licenziatario
e una per BasicNet. Per non causare errori nella simulazione ho modificato
il numero della basicNetMatrix nel file recipeData/recipes.xls per tutte le
ricette che la utilizzano.
Inoltre ho modificato nel file jesframe.scm il parametro totalMemoryMatrixNumber, perché in questo caso ci sono 36 matrici di memoria, e ho eliminato
i parametri orMemoryMatrix e orCriterion.
6.10.2
I costi delle unità produttive
I costi delle unità sono gli stessi mostrati per il caso 1, con due differenze
rispetto al caso precedente: nell’azienda non esistono più BasicBiddings e
BasicFactory e perciò nemmeno i loro costi; inoltre le Trading Company in
questo esempio sono considerate interne all’azienda, e pertanto il loro utilizzo
comporta dei costi.
Per ricavare un ordine di grandezza dei costi di produzione delle collezioni ho ricavato dal bilancio consolidato di BasicNet del 2002 il valore delle
Commissioni del Sourcing, che rappresentano la remunerazione conferita ai
132
6. L’AZIENDA VIRTUALE: BASIC_JES
Sourcing Centers dai licenziatari per coprire i costi di struttura originati dal
servizio di intermediazione loro offerto. Il dato a bilancio si riferisce alle società LF Basic Ltd, che opera come Sourcing Center per l’area asiatica, e LF
Basic Europe S.r.l., Sourcing Center dell’area europea.
Per avere un’indicazione dei costi ho ipotizzato che i Sourcing Centers
chiudano il bilancio in pareggio, pertanto il valore delle commissioni pagate
dai licenziatari corrisponde ai costi da loro sostenuti. Inoltre, su indicazione
della dottoressa Bruschi, ho ipotizzato che il valore delle commissioni sia pari
al 7% dei costi totali di produzione degli articoli. Grazie a queste congetture
mi è stato possibile ricavare il valore dei costi (CT ) per la produzione degli
articoli.
Costi Di Produzione =
=
1.588.000 × 100
CommissionidelSourcing × 100
=
=
7
7
= 22.685.714
Questo valore rappresenta il costo sostenuto da due Sourcing Centers;
per ottenere il costo complessivo per la produzione delle collezioni occorre
considerare i costi delle 5 Trading Company alle quali BasicNet si affida. Per
conoscere questo valore, adottando l’ipotesi che i Sourcing Centers abbiano
gli stessi costi, è sufficiente impostare la seguente proporzione:
22.685.714 ÷ 2 = Costi totali ÷5
CostiT otali =
22.685.714 × 5
= 56.714.286
2
Un ultimo problema da risolvere è il modo in cui ripartire i costi tra fissi
e variabili. Con il professor Terna abbiamo deciso di indicare tutti variabili
i costi delle Trading Company, immaginando che la scelta tra esse sia simile
133
6. L’AZIENDA VIRTUALE: BASIC_JES
ad una decisione di make-or-buy: le Trading Company avranno influenza sui
costi aziendali solo nel momento in cui verranno chiamate a operare e non
daranno origine a costi sommersi (o sunk costs).
Date queste assunzioni, il costo unitario variabile per la produzione di
un articolo è pari ai costi di produzione totali divisi per il numero di articoli ordinati, e perciò prodotti, che nel primo semestre del 2002 ammonta
a 40.0004 ; ipotizzando che nei sei mesi successivi si sia prodotta la stessa
quantità, il numero di articoli prodotti per il 2002 è 80.000. Perciò il costo
variabile unitario è pari a:
CU VT radingCompany =
CostiDiP roduzione
56.714.286 ∼
=
= 709
n◦ articoli
80.000
Per inserire i costi nel file unitData/unitBasicData.txt è necessario dividere questo valore per il numero di tick necessari ad una Trading Company
per produrre un articolo, in modo analogo a quanto fatto per BasicSamples
nel paragrafo 6.9.1.
6.10.3
I ricavi aziendali
Per ottenere i ricavi di questa ipotetica BasicNet ho impostato un margine
di ricarico che viene applicato a tutti i costi sostenuti dall’azienda durante
la simulazione; per ottenere tale margine mi sono basato sui costi e ricavi
reali di BasicNet indicati a bilancio, in modo da ottenere un mark-up il più
possibile vicino alla realtà.
Il valore dei costi totali si ottiene sommando i costi totali delle divisioni
dot.com a quelli di produzione delle Trading Company. I costi delle divisioni
dot.com si ricavano sommando i costi variabili totali di BasicSamples ai costi
fissi totali (Tabella 6.3), mentre quelli delle Trading Company si trovano nel
4
Fonte: BasicNet (2002)
134
6. L’AZIENDA VIRTUALE: BASIC_JES
modo descritto nel paragrafo precedente. Si ottiene pertanto che i costi totali
(CT ) di questa ipotetica BasicNet sono pari a:
CT = CV TBasicSamples + CF T + CV TT radingCompany =
= 59.806.000 + 39.497.000 + 56.714.286 =
= 156.017.286
Per quanto riguarda i ricavi, in questa ricostruzione BasicNet vende il
campionario, come anche nel caso 1, e le collezioni; pertanto i proventi totali
si ottengono dalla somma dei loro importi. Per il valore del campionario mi
sono basato sulla voce Vendita campionari presente nel bilancio di esercizio
di BasicNet del 2002. Per determinare i ricavi derivanti dalla vendita delle
collezioni ho estratto dal bilancio consolidato di BasicNet del 2002 la voce
Royalties; siccome queste ultime sono pari al 10% degli acquisti dei licenziatari dalle Trading Company, per ottenere il valore delle vendite (RT V endite ) è
sufficiente impostare la seguente proporzione:
royalties ÷ 0.1 = RTV endite ÷ 1
Inoltre occorre anche considerare tra i ricavi aziendali quelli che derivano dalle vendite di Kappa Italia, ora BasicItalia, che a bilancio non sono
compresi nel computo delle royalties, ma sono indicati alla voce Vendite di
abbigliamento sportivo. Si ottiene pertanto che i ricavi totali aziendali (RT )
sono pari a:
RT = RTCampionario + RTV endite + RTKappaItalia =
= 2.602.375 + 163.110.000 + 91.739.000 =
= 257.451.375
135
6. L’AZIENDA VIRTUALE: BASIC_JES
In conclusione, il margine di ricarico che viene applicato a ciascun costo
effettuato dall’azienda è pari al 65%, che si ottiene nel modo seguente:
mark-up =
RT
CT
∼
= 1, 65
Questo valore sarà inserito nel file jesframe.scm, che contiene i parametri
della simulazione.
6.10.4
Le modifiche al codice
Rispetto al caso 1 la classe ComputationalAssembler presenta alcune novità.
Come descritto nel paragrafo 6.10.1, ho eliminato il passo computazionale
C1911, che si occupava del calcolo del prezzo del campionario, ed il passo
C1912, che calcolava il valore delle royalties.
Inoltre in questo modello non sono più necessari i passi computazionali
C1905, C1906, e C1908, che si occupano, rispettivamente, dell’offerta dei
prezzi da parte delle Trading Company, della scelta di BasicBiddings e della
scelta di BasicFactory della Trading Company che deve produrre. Ho perciò
eliminato questi metodi dal file ComputationalAssembler.java.
Infine, ho effettuato alcune modifiche all’oggetto computazionale C1913,
che sono illustrate qui di seguito.
C1913
In questa ricostruzione le collezioni sono consegnate ai licenziatari direttamente da BasicNet. Questo passo computazionale crea un contatore con il
metodo getCounter, controlla che i MetaSamples siano stati disegnati nella
designMatrix e ne memorizza il numero con il metodo getValue; in seguito
controlla con getValue nella seconda riga della basicNetMatrix che l’articolo
sia stato prodotto e ne aggiorna lo status impostando con setValue il valore
4; infine stampa sul monitor l’indicazione che l’articolo in questione è stato
consegnato.
136
6. L’AZIENDA VIRTUALE: BASIC_JES
137
Listing 6.5: ComputationalAssembler.java: C1913
¨
p u b l i c v o i d c1913 ( )
{
checkMatrixes (1913 ,2);
d e s i g n M a t r i x =(MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 0 ) ;
b a s i c N e t M a t r i x =(MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 1 ) ;
l a y e r = pendingComputationalSpecificationSet . getOrderLayer ( ) ;
i n t counter = getCounter ( basicNetMatrix , 2 ) ;
i f ( ! d e s i g n M a t r i x . getEmpty ( l a y e r , 0 , 0 ) )
{
i f ( c o u n t e r <= d e s i g n M a t r i x . g e t V a l u e ( l a y e r , 0 , 0 ) )
{
// Check i f item has been produced
i f ( basicNetMatrix . getValue ( layer , 2 , counter ) > 2)
{
System . out . p r i n t l n ( " Item␣␣#" + c o u n t e r + " ␣ with ␣ l a y e r ␣#"
+ l a y e r + " ␣ has ␣ been ␣ d e l i v e r e d " ) ;
basicNetMatrix . setValue ( layer , 2 , counter , 4 . 0 ) ;
}
}
}
done = t r u e ;
} // end1913
§
­
¦
6. L’AZIENDA VIRTUALE: BASIC_JES
6.10.5
138
I parametri della simulazione
I parametri su cui si basa il modello sono contenuti nel file jesframe.scm e
durante la simulazione sono indicati nel probe del ESFrameModelSwarm e
del ESFrameObserverSwarm.
Le differenze con i parametri del caso 1 sono le seguenti:
• il diverso numero di unità, perché le Trading Company non hanno più
una divisione incaricata della consegna dei prodotti e non esistono più
BasicBiddings e BasicFactory;
• l’indicazione del mark-up, rappresentato dal parametro revenuePerCostUnit, pari a 1.65, che esprime il margine di ricarico che viene applicato
a ciascun costo sostenuto da Basic_jES durante la simulazione;
• il numero inferiore di matrici di memoria;
• la mancanza dei parametri orCriterion e orMatrix;
Listing 6.6: jesframe.scm per il Caso 2
¨
( list
(
c o n s ’ eSFrameObserverSwarm
(
make−i n s t a n c e ’ ESFrameObserverSwarm
)
#: d i s p l a y F r e q u e n c y
32
#: v e r b o s e C h o i c e
#f
#: p r i n t M a t r i x e s
#f
#: checkMemorySize
#f
#: unitHistogramXPos
1
#: unitHistogramYPos
600
#: endUnitHistogramXPos
578
#: endUnitHistogramYPos
1
6. L’AZIENDA VIRTUALE: BASIC_JES
139
)
(
c o n s ’ eSFrameModelSwarm
(
make−i n s t a n c e ’ ESFrameModelSwarm
#: u s e O r d e r D i s t i l l e r
#t
#: ticksInATimeUnit
32
#: totalUnitNumber
124
#: totalEndUnitNumber
2
#: totalLayerNumber
17
#:totalMemoryMatrixNumber
37
#: sameStepLifoAssignment
#t
#: assignEqualStepsToSameUnit
#t
#:maxTickInAUnit
2080
#: useWarehouses
#f
#: useNewses
#f
#: revenuePerEachRecipeStep
0
#: r e v e n u e P e r C o s t U n i t
1.65
#: u n i t C r i t e r i o n
2
)
)
)
;
§
­
¦
6.11
Caso 3
Il terzo esempio di modello organizzativo mostra una BasicNet con struttura
simile a quella descritta nel caso 1 ma con una diversa origine dei ricavi, simile
al caso 2. Infatti si immagina che la produzione delle collezioni avvenga
in outsourcing e che BasicNet si occupi direttamente della loro vendita ai
licenziatari.
La struttura aziendale è simile a quella del caso 1, con le Trading Com-
6. L’AZIENDA VIRTUALE: BASIC_JES
pany che sono considerate unità esterne all’azienda con costi nulli. Inoltre, a
differenza del caso 2, l’aggiudicazione della produzione degli articoli avviene
tramite l’asta tra le Trading Company ed è scelta quella che propone il costo
minore di produzione; l’utilizzo dell’asta fornisce anche una buona rappresentazione di quanto accade nella realtà, perché normalmente le aziende che
producono in outsourcing incaricano le imprese che garantiscono loro il minor
costo di produzione.
I ricavi vengono determinati come nel caso 2, applicando ad ogni costo sostenuto durante la simulazione il margine di ricarico calcolato nel
paragrafo 6.10.3.
6.11.1
Le modifiche al modello
Le unità
Il file unitData/unitBasicData.txt è simile a quello descritto nel paragrafo 6.9.1, con la sola differenza che in questo caso le Trading Company sono
rappresentate da una sola unità, perché non devono consegnare le collezioni
ai licenziatari.
Le ricette
La consenga del campionario avviene nello stesso modo illustrato nel paragrafo 6.10.1, con la ricetta mostrata in Figura 6.5, perché i ricavi derivanti
dalla vendita del campionario sono già compresi nel calcolo del margine di
ricarico.
La ricetta 800, che descrive la produzione è uguale alla corrispondente del
caso 1, perché le Trading Company sono scelte in base ai risultati dell’asta.
Per la consegna degli articoli si utilizza la ricetta 900 utilizzata anche nel
caso 2 (paragrafo 6.10.1).
140
6. L’AZIENDA VIRTUALE: BASIC_JES
6.11.2
141
Le modifiche al codice
Rispetto alla classe ComputationalAssembler utilizzata nel caso 1, ho eliminato i passi computazionali C1911 e C1912, che si occupano della contabilizzazione dei ricavi derivanti, rispettivamente, dalla vendita del campionario
e dalle royalties.
Inoltre ho modificato il metodo C1913 nello stesso modo illustrato nel
paragrafo 6.10.4.
6.11.3
I parametri della simulazione
I parametri su cui si basa la simulazione sono mostrati qui di seguito:
Listing 6.7: jesframe.scm per il Caso 2
¨
( list
(
c o n s ’ eSFrameObserverSwarm
(
make−i n s t a n c e ’ ESFrameObserverSwarm
#: d i s p l a y F r e q u e n c y
32
#: v e r b o s e C h o i c e
#f
#: p r i n t M a t r i x e s
#f
#: checkMemorySize
#f
#: unitHistogramXPos
1
#: unitHistogramYPos
600
#: endUnitHistogramXPos
578
#: endUnitHistogramYPos
1
)
)
(
c o n s ’ eSFrameModelSwarm
(
make−i n s t a n c e ’ ESFrameModelSwarm
#: u s e O r d e r D i s t i l l e r
#t
6. L’AZIENDA VIRTUALE: BASIC_JES
142
#: ticksInATimeUnit
32
#: totalUnitNumber
125
#: totalEndUnitNumber
2
#: totalLayerNumber
17
#:totalMemoryMatrixNumber
43
#: sameStepLifoAssignment
#t
#: assignEqualStepsToSameUnit
#t
#:maxTickInAUnit
2080
#: useWarehouses
#f
#: useNewses
#f
#: revenuePerEachRecipeStep
0
#: r e v e n u e P e r C o s t U n i t
1.65
#: u n i t C r i t e r i o n
2
#: o r C r i t e r i o n
5
#:orMemoryMatrix
42
)
)
)
;
§
­
6.12
¦
Risultati della simulazione
Ho eseguito alcune simulazioni per verificare gli effetti provocati dalle mie modifiche al modello. Partendo dal modello di Basic_jES presente in Lamieri
(2002) e Merlo (2003a) ho fatto nuovi esperimenti per migliorare il funzionamento del modello, con l’obiettivo di ridurre il tempo di esecuzione delle
lavorazioni e renderlo pari al tempo previsto dalle ricette che le descrivono.
Primo esperimento
Ho avviato una simulazione per valutare gli effetti che il nuovo calendario
avrebbe avuto sul modello. Osservando il grafico della simulazione che in-
6. L’AZIENDA VIRTUALE: BASIC_JES
dica il numero di ordini presenti nella waiting list di ciascuna unità si può
notare che i licenziatari non sono in grado di eseguire nei tempi previsti
tutti gli ordini ad essi assegnati, perciò si creano lunghe code (in alcuni momenti anche dell’ordine di 103 ) che causano problemi anche nel resto della
simulazione. Infatti, se i licenziatari non riescono ad effettuare le previsioni
per gli articoli di una collezione prima che BasicForecast le sommi, molti
di questi non sono prodotti perché il totale delle previsioni non supera la
soglia prestabilita da BasicNet. Questa tendenza è confermata se si osserva il file log/report.txt, mostrato in Tabella 6.4, nel quale sono indicati, per
ogni collezione, il numero dei MetaSamples creati, dei prodotti abbandonati
e di quelli effettivamente prodotti: pochi articoli delle collezioni superano la
prima verifica dei licenziatari e perciò il loro sviluppo viene abbandonato.
La Tabella 6.4 evidenzia inoltre dei problemi nel momento in cui Basic_jES deve operare nello stesso momento su più collezioni. Un esempio si
ha nel caso delle collezioni 1, 2, 3 e 4 che, secondo il calendario, devono essere
prodotte contemporaneamente; si può infatti notare che gli articoli realmente prodotti sono pochi, perché per queste collezioni i licenziatari sono messi
sotto pressione da un grande numero di ordini e non riescono ad eseguirli
prima che BasicForecast sommi le previsioni.
Inoltre dal grafico di jES che indica l’andamento del rapporto tra il tempo
effettivo il tempo previsto dalle ricette produttive per l’esecuzione degli ordini
(Figura 6.6) si può notare che i tempi della simulazione sono circa 100 volte
maggiori rispetto a quelli previsti; anche il periodo medio di attesa per gli
ordini è molto alto, come si può notare in Figura 6.7 (la linea blu rappresenta
il tempo medio, quella gialla e rossa il tempo massimo e minimo).
Sulla base di questi risultati si può concludere che il modello così come
è costruito non è in grado di sostenere la reale time-table di BasicNet, e
perciò occorrono alcune modifiche che eliminino i problemi qui indicati per
143
6. L’AZIENDA VIRTUALE: BASIC_JES
migliorare l’andamento della simulazione.
Secondo esperimento
Dal momento che molti prodotti non sono realizzati a causa delle mancate
previsioni iniziali dei licenziatari, ho inserito due nuove unità per ogni licenziatario a supporto delle due già esistenti; in questo modo le operazioni di
previsione e gli ordini possono essere svolte da due unità ed intuitivamente
si può concludere che le code nelle liste di attesa dei licenziatari dovrebbero
ridursi. Nel file jesframe.scm ho impostato il parametro unitCriterion pari a
2, per far sì che gli ordini siano assegnati all’unità con la lista d’attesa meno
lunga.
Inoltre ho deciso di far slittare di 10 giorni il controllo delle previsioni dei
licenziatari da parte di BasicForecast; questa modifica può essere ragionevole,
in quanto è presumibile che anche nella realtà sia concesso un certo lasso di
tempo ai licenziatari e permette così alle unità che li rappresentano di eseguire
le previsioni su un maggior numero di articoli prima che siano sommate tra
loro.
Ho anche scelto di spostare il momento in cui BasicBiddings effettua la
scelta della vincente 5 giorni dopo l’asta in cui le Trading Company offrono
i prezzi di produzione per gli articoli.
Con queste modifiche l’andamento della simulazione è notevolmente migliorato, infatti osservando il file log/report.txt si può notare che circa il 90%
degli articoli disegnati è stato prodotto.
144
6. L’AZIENDA VIRTUALE: BASIC_JES
Figura 6.6: Primo esperimento.
145
T empodiesecuzione
T empoprevistodallericette
Figura 6.7: Primo esperimento. Tempi d’attesa degli ordini
6. L’AZIENDA VIRTUALE: BASIC_JES
Layer MetaSamples
146
Articoli
Articoli
disegnati
abbandonati
prodotti
1
150
109
29
2
100
99
1
3
30
29
1
4
50
49
1
5
100
73
27
6
150
149
1
7
50
49
1
8
100
99
1
9
50
22
28
10
100
71
0
11
30
2
28
12
50
20
30
13
75
46
29
14
100
68
32
15
150
104
0
16
75
46
29
Tabella 6.4: Articoli creati ed effettivamente prodotti per ogni collezione
6. L’AZIENDA VIRTUALE: BASIC_JES
Tuttavia permangono ancora alcuni problemi, in quanto, pur essendosi
ridotte, le code nelle waiting list delle unità che rappresentano i licenziatari
in alcune situazioni raggiungono ancora dei livelli molto elevati (dell’ordine
di 102 ), soprattutto nel momento in cui si effettuano gli ordini alle Trading
Company; inoltre il tempo medio di attesa per ogni ricetta (Figura 6.9) e il
rapporto tra il tempo effettivo di esecuzione e quello ipotizzato (Figura 6.8)
sono ancora alti, anche se risultano quasi dimezzati rispetto alla simulazione
precedente.
In particolare, osservando l’andamento del grafico mostrato in Figura 6.8
durante la simulazione, si può notare che le situazioni in cui il modello non è
in grado di rispettare i tempi previsti dalle ricette corrispondono ai momenti
in cui sono chiamati ad operare BasicSamples e i licenziatari. Infatti si può
notare che i ritardi maggiori si registrano nei momenti in cui BasicSamples
crea i MetaSamples della prima collezione e, in seguito, quelli delle collezioni
1, 2, 3, 4 al tick 5.000; infine l’ultimo notevole ritardo, al tick 10.000, è causato
dai licenziatari chiamati a prevedere contemporaneamente per le collezioni
5, 6, 7, 8.
Per migliorare questa situazione occorre inserire nel file unitData/unitBasicData.txt nuove unità per i licenziatari e per BasicSamples, affinché gli
ordini siano eseguiti nei tempi previsti dalle ricette e non si creino code
eccessive nelle waiting list delle unità produttive.
Terzo Esperimento
Ho effettuato nuove modifiche al file unitData/unitBasicData.txt inserendo
altre unità per BasicSamples e per i licenziatari.
BasicSamples è suddivisa in quattro sezioni, ciascuna delle quali si occupa
della creazione di una delle quattro possibili collezioni5 ; per ogni divisione ho
5
vedi paragrafo 6.5
147
6. L’AZIENDA VIRTUALE: BASIC_JES
Figura 6.8: Secondo esperimento.
148
T empodiesecuzione
T empoprevistodallericette
aggiunto un’unità in grado di effettuare lo stesso passo di quella già presente,
perciò ora BasicSamples è rappresentata da 8 unità produttive.
Per quanto riguarda i licenziatari ho aggiunto 2 nuove unità in grado di
effettuare le previsioni e altre 2 in grado di effettuare gli ordini, perciò ora i
licenziatari sono rappresentati complessivamente da 8 unità.
Dai risultati della simulazione mostrati in Figura 6.10 si può notare che
i ritardi nei tempi di produzione si sono dimezzati rispetto al caso precedente e sono pari a 30 volte i tempi previsti dalle ricette; tuttavia persistono
i rallentamenti durante le fasi di creazione dei MetaSamples e durante la
formulazione delle previsioni e degli ordini dei licenziatari.
6.13
Considerazioni sui risultati
Dalle simulazioni precedenti si intuisce che ogni volta che raddoppia il numero delle unità produttive i tempi di esecuzione si dimezzano, pertanto,
per ottenere un buon risultato in termini di tempi di produzione, occorre
6. L’AZIENDA VIRTUALE: BASIC_JES
Figura 6.9: Secondo esperimento. Tempi d’attesa degli ordini
aumentare il numero delle unità che rappresentano i licenziatari e BasicSamples, perché è proprio nei momenti in cui sono chiamate ad operare che si
riscontrano i maggiori ritardi nell’esecuzione delle ricette.
Occorre però fare una distinzione tra i licenziatari e BasicSamples. I
primi sono agenti esterni all’azienda e perciò un aumento delle unità che
li rappresentano non va a minare il risultato della simulazione totale, in
quanto in questa simulazione non si è interessati al funzionamento interno
dei licenziatari, bensì a quello di BasicNet.
Discorso diverso vale per BasicSamples, in quanto è una divisione interna
all’azienda e rappresenta una delle più importanti funzioni aziendali, l’ideazione delle collezioni e la produzione del campionario. Quindi aumentare
le unità nel modello senza particolari motivazioni potrebbe essere sbagliato
e potrebbe portare a delle conclusioni errate sui risultati della simulazione,
nascondendo un problema organizzativo dell’azienda.
Ho pertanto deciso di porre una maggiore attenzione sul funzionamento
di BasicSamples (paragrafo 6.15) e la dottoressa Bruschi mi ha informato che
149
6. L’AZIENDA VIRTUALE: BASIC_JES
Figura 6.10: Terzo esperimento.
150
T empodiesecuzione
T empoprevistodallericette
i dipendenti di questa divisione sono 36. Conoscendo questo numero posso
infatti ottenere una migliore specificazione del modello e valutare con più attenzione se il funzionamento di BasicSamples crea dei bottle necks all’interno
dell’azienda.
Per quanto riguarda i licenziatari, ho seguito due metodi di lavoro: in un
primo caso ho continuato ad aggiungere unità come illustrato nei precedenti
paragrafi, nel tentativo di eliminare i ritardi legati alla loro attività (paragrafo 6.14.1); in un secondo momento ho cambiato il mio modus operandi e ho
introdotto il tempo 0 per l’esecuzione delle ricette da parte dei licenziatari
(paragrafo 6.14.2).
6.14
6.14.1
Focus sui licenziatari
Licenziatari con tempo 1
Negli esperimenti che seguono ho raddoppiato di volta in volta il numero di
unità che nel modello rappresentano i licenziatari, con l’obiettivo di eliminare
6. L’AZIENDA VIRTUALE: BASIC_JES
Figura 6.11: Quarto esperimento.
151
T empodiesecuzione
T empoprevistodallericette
i ritardi dovuti alla formulazione delle previsioni e degli ordini sulle collezioni.
Con una nuova simulazione ho raddoppiato il numero di unità rappresentative dei licenziatari da 8 a 16, in cui 8 unità prevedono e 8 effettuano
gli ordini. I risultati evidenziano che, come ipotizzato, il ritardo nei tempi di produzione mostrato in Figura 6.11 è nuovamente dimezzato rispetto
all’esperimento eseguito nel paragrafo 6.12.
In seguito ho ulteriormente aumentato il numero delle unità dei licenziatari nel file unitData/unitBasicData.txt portandolo a 32, di cui 16 hanno il
compito di prevedere e le restanti effettuano gli ordini di articoli alle Trading
Company. Come si può notare nella Figura 6.12 il rapporto tra il tempo
di esecuzione e il tempo previsto per le lavorazioni si è ridotto della metà
rispetto al caso precedente (Figura 6.11).
Osservando l’andamento della simulazione, si può notare che i ‘‘picchi’’
di ritardo che si formano nel grafico della Figura 6.12 sono nei momenti in
cui BasicSamples è chiamata ad operare, in particolare:
6. L’AZIENDA VIRTUALE: BASIC_JES
152
1. all’inizio della simulazione, durante la creazione della collezione 9;
2. poco più tardi, nel momento in cui BasicSamples disegna la collezione
10;
3. prima del tick 5.000, nel momento in cui devono essere ideate contemporaneamente le collezioni 1, 2, 3, 4;
4. intorno al tick 7.500, quando si deve disegnare la collezione 6;
Figura 6.12: Sesto esperimento.
T empodiesecuzione
T empoprevistodallericette
Per il resto la simulazione non accumula grandi ritardi, se non in due casi
in cui sono chiamati ad operare i licenziatari, poco prima del tick 5.000 con
la previsione delle collezioni 1, 2, 3, 4, e dopo il tick 7.500 quando devono
prevedere per la collezione numero 6.
In una nuova simulazione ho ulteriormente raddoppiato le unità dei licenziatari, ma non ci sono particolari miglioramenti rispetto a quanto mostrato
in Figura 6.12, in quanto ora la maggiore fonte di ritardo è l’attività di
BasicSamples.
6. L’AZIENDA VIRTUALE: BASIC_JES
6.14.2
Licenziatari con tempo 0
Ho effettuato nuovi esperimenti con il modello creato in Lamieri (2002) e
Merlo (2003a) impostando i tempi di esecuzione delle ricette dei licenziatari
pari a 0. Tutti i passi a tempo 0 sono eseguiti da jES in un solo tick senza
generare code nelle liste d’attesa delle unità.
La ragione è nel fatto che ai fini della simulazione non ci interessa sapere
come operano i licenziatari al loro interno, in quanto l’importante è che essi
eseguano le previsioni e gli ordini nei tempi previsti; pertanto consideriamo
i licenziatari come ‘‘scatole nere’’.
Eseguendo una simulazione si ottiene il risultato mostrato in Figura 6.13;
i ritardi nell’esecuzione delle ricette sono dovuti soltanto a BasicSamples. È
pertanto necessaria una maggiore attenzione alla sua struttura e alla scrittura
delle ricette che la riguardano.
T empodiesecuzione
Figura 6.13: Licenziatari con tempo 0. T empoprevistodallericette
153
6. L’AZIENDA VIRTUALE: BASIC_JES
6.15
Approfondimento di BasicSamples
Dal momento che i ritardi nella produzione sono causati da BasicSamples,
ho deciso di ‘‘mettere la lente d’ingrandimento’’ su questa divisione.
Ho inserito nel file unitData/unitBasicData.txt 36 unità in grado di eseguire i passi di BasicSamples, ciascuna delle quali rappresenta un dipendente
di questa divisione nella realtà. Ho immaginato che i designers si dividano
in quattro gruppi di nove unità ciascuno e che si occupino separatamente dei
quattro tipi di collezione presenti nel modello di simulazione6 .
Inoltre ho modificato i tempi delle ricette che descrivono la creazione delle
collezioni, ricalcolando i tempi di produzione secondo i dati sulla BasicNet
reale. Secondo le statistiche di BasicNet riferite al 20027 , nel primo semestre
sono stati creati 3338, perciò ho supposto che nell’intero anno BasicSamples
produca 6676 articoli. In seguito ho calcolato le ore lavorative nello stesso
anno, partendo dall’ipotesi che le ore di lavoro giornaliere siano 8 e che si
lavori per 5 giorni alla settimana, dal lunedi al venerdi. Pertanto si ottiene
che:
Ore lavorative = (giorni lavorativi nel 2002 ) × (ore lavorative al giorno) =
= 260 × 8 = 2080
Dopo aver calcolato le ore lavorative annuali occorre calcolare il numero
di articoli che si ipotizza siano creati da un designer nel corso di un anno,
dividendo il numero di articoli prodotti nel 2002 per il numero di dipendenti
di BasicSamples:
6676 ∼
= 185
36
Con questi dati è possibile calcolare il numero di ore necessario ad un
ArticoliP erDesigner =
designer per la creazione di un articolo nel seguente modo:
6
7
vedere paragrafo 6.5
Fonte: BasicNet (2002)
154
6. L’AZIENDA VIRTUALE: BASIC_JES
h=
2080 ∼
= 11, 24
185
Perciò si può concludere che, in base a queste ipotesi molto semplicistiche,
un designer ha bisogno di 11,24 ore per creare un MetaSample o, trasformandole, di 11 ore e 15 minuti circa. Traducendo le ore in minuti totali e poi
in tick della simulazione, risulta che un articolo viene creato in 675 minuti e
quindi in un numero di tick pari a:
tick =
675
= 45
15
dato che 1 tick = 15 minuti.
Perciò occorre riscrivere nel file recipeData/recipes.xls le ricette che descrivono le lavorazioni di BasicSamples e modificare i tempi di produzione,
in modo che le unità impieghino 45 tick per lo sviluppo di ogni articolo.
Effettuando una simulazione con questo nuovo modello e mantenendo la
struttura dei licenziatari presentata nel paragrafo 6.14.2, si ottiene l’andamento della simulazione mostrato in Figura 6.14. Le code legate all’attività dei licenziatari sono eliminate, pertanto i ritardi sono dovuti soltanto
all’attività di BasicSamples.
Una conclusione che si può trarre dall’analisi svolta è che BasicSamples
potrebbe rappresentare un ‘‘collo di bottiglia” nel funzionamento della BasicNet reale, dal momento che non è in grado di eseguire le operazioni nei
tempi previsti dalle ricette.
È però necessario ricordare che questi risultati hanno la base nelle assunzioni fatte precedentemente, che potrebbero anche discostarsi da quanto
avviene nella realtà; infatti per eliminare i ritardi nella produzione i designers potrebbero lavorare più di 8 ore al giorno e non solo per 5 giorni alla
settimana o, ancora, potrebbero esserci articoli la cui produzione richiede un
tempo minore e altri che necessitano di tempi maggiori.
155
6. L’AZIENDA VIRTUALE: BASIC_JES
Figura 6.14: Approfondimento di Basicsamples.
156
T empodiesecuzione
T empoprevistodallericette
Pertanto si può concludere che BasicSamples rappresenta un bottle neck
per BasicNet nel solo momento in cui tutte le ipotesi fatte durante la formulazione del modello sono verificate anche nella realtà. In tutte le altre
situazioni sarebbe necessario specificare nuove ipotesi e considerare i nuovi
risultati della simulazione.
Da queste considerazioni si intuisce quale sia la grande importanza della
simulazione ad agenti nella formulazione delle decisioni aziendali: una volta
creato il modello dell’azienda è sufficiente cambiare alcuni particolari nella
struttura generale per poter essere in grado di valutare quali potrebbero
essere gli effetti delle scelte della direzione generale.
6.16
Analisi finale
Dopo aver costruito i tre modelli di ‘‘azienda virtuale’’ è stata fatta un’analisi
finale dei costi e dei ricavi originati dai tre esempi di Basic_jES. I dati tecnici
riferiti ad essa sono contenuti negli allegati a questa tesi.
Lo studio presentato nelle pagine che seguono è una prima analisi del
6. L’AZIENDA VIRTUALE: BASIC_JES
modello formalizzato e descritto nei paragrafi precedenti; l’analisi definitiva
dei tre modelli organizzativi è mostrata nell’allegato a questa tesi e contiene
le modifiche illustrate in Balla (2004). Queste modifiche sono di carattere
metodologico e riguardano il funzionamento interno di jES.
In questo modello le ricette sono eseguite indistintamente per tutti gli
articoli di una collezione perché non c’è il modo di scegliere di simulare soltanto le attività riferite ai MetaSamples non abbandonati. Le modiche in
Balla (2004) consentono di eliminare questo difetto ed eseguire soltanto le
ricette riferite agli articoli che devono essere prodotti, grazie all’uso della
metodologia della ‘‘ricetta che lancia ricetta”; con questo sistema ogni volta
che deve essere svolta una fase produttiva si lancia una ricetta che controlla
lo status degli articoli e, in base ad esso, sceglie per ognuno di essi se lanciare
la ricetta.
Questa modifica comporta un importante miglioramento per il modello
dal punto di vista metodologico, ma a livello di analisi finale non dovrebbe
creare grandi cambiamenti sui costi, perché le unità di BasicNet che devono
effettuare le lavorazioni non hanno costi variabili, perciò la loro attività risulta ininfluente sul computo dei costi totali. Una variazione, anche se non
grandissima, si potrà riscontrare nel caso 2, in cui le Trading Company sono
unità interne e hanno costi variabili.
Per quanto riguarda i ricavi, l’analisi definitiva potrebbe avere alcune
differenze rispetto a questa, perché in quel caso si considereranno soltanto i
ricavi relativi agli articoli realmente venduti.
6.16.1
Caso 1
Questo modello rappresenta la BasicNet reale ricostruita al computer. I costi
imputati sono soltanto quelli relativi alle divisioni dot.com, tutti fissi con
157
6. L’AZIENDA VIRTUALE: BASIC_JES
l’esclusione di BasicSamples8 , e i ricavi derivano dalla vendita dei campionari
e dalle royalties.
Per ottenere i dati relativi ai costi occorre analizzare i file della simulazione
Costs/totalDailyCosts.txt, in cui sono indicati i costi giornalieri dell’azienda,
e Costs/totalCosts.txt, dove si trova la somma cumulata dei costi giorno per
giorno.
I ricavi sono indicati nel file log/grossSales.txt. La struttura di questo
file è mostrata nella Tabella 6.5: per ogni voce sono indicati il tick della
simulazione in cui si è conseguito il ricavo e il ricavo stesso; questa struttura
risulta molto utile nel momento in cui si deve fare l’analisi di costi e ricavi,
perché grazie ad essa è possibile contabilizzare i ricavi nei giorni in cui si sono
realizzati.
tick | ricavo
Tabella 6.5: File log/grossSales
Se si osserva la Figura 6.15, si può notare che i costi crescono con un
andamento abbastanza regolare, dovuto alla forte presenza di costi fissi nelle
attività di BasicNet e al numero esiguo di unità che presentano costi variabili. La curva dei ricavi cresce soltanto nei momenti in cui si consegnano i
campionari e si incassano le royalties; in particolare, gli aumenti più grandi
si verificano intorno ai giorni 420 e 550, periodi in cui la BasicNet simulata
riceve contemporaneamente le royalties per quattro collezioni.
La Figura 6.16 mostra l’andamento dei costi e dei ricavi giorno per giorno.
I costi dal giorno 271 fino alla fine sono costanti e sono pari alla somma dei
costi fissi calcolati per ogni giorno; nei giorni precedenti i costi sono invece
incrementati dall’operatività di BasicSamples, unica divisione alla quale sono
imputati costi variabili, quando è chiamata a creare gli articoli.
8
vedi paragrafo 6.9.1
158
6. L’AZIENDA VIRTUALE: BASIC_JES
Figura 6.15: Andamento di costi, ricavi e profitti totali (Caso 1)
Figura 6.16: Andamento di costi, ricavi e profitti giornalieri (Caso 1)
159
6. L’AZIENDA VIRTUALE: BASIC_JES
Le curve dei ricavi e dei profitti presentano andamenti simili e, ovviamente, sono positivi nei soli giorni in cui BasicNet vende i campionari e riceve le
royalties.
I profitti totali non sono mai positivi e l’azienda chiude i due anni con
un’ingente perdita; osservando il loro andamento giornaliero, si nota che
l’azienda ottiene profitti positivi soltanto per 19 giorni della simulazione.
6.16.2
Caso 2
La BasicNet simulata in questo caso si comporta come un’azienda tradizionale che produce e vende direttamente tutti i prodotti. Perciò i costi di
produzione sono rappresentati dai costi delle divisioni incrementati da quelli
relativi alle Trading Company9 e i ricavi sono calcolati in base ad un margine
di ricarico del 65%10 .
I costi si ricavano nello stesso modo illustrato nel precedente paragrafo,
mentre i ricavi sono indicati nei file Revenue/dailyRevenues.txt, in cui sono
indicati i ricavi giornalieri, e Revenue/totalRevenues.txt, dove è indicata la
loro somma cumulata giorno per giorno.
L’andamento della curva dei costi totali mostrata Figura 6.17 è simile a
quella del caso precedente ma, se confrontate, si può notare che in questo
esempio la curva presenta una minore inclinazione; la causa sta nella minore
componente di costi fissi, dal momento che in questa azienda non esistono
BasicFactory e BasicBiddings.
Se si guardano soltanto i costi totali non si riesce a notare la presenza dei
costi originati dalla produzione diretta degli articoli che è più visibile nella Figura 6.18, dove la curva dei costi giornalieri ha dei ‘‘picchi” in corrispondenza
dei momenti in cui le Trading Company sono chiamate ad operare.
9
10
vedi paragrafo 6.10.2
vedi paragrafo 6.10.3
160
6. L’AZIENDA VIRTUALE: BASIC_JES
Figura 6.17: Andamento di costi, ricavi e profitti totali (Caso 2)
Figura 6.18: Andamento di costi, ricavi e profitti giornalieri (Caso 2)
161
6. L’AZIENDA VIRTUALE: BASIC_JES
Figura 6.19: Andamento di costi, ricavi e profitti totali (Caso 3)
Figura 6.20: Andamento di costi, ricavi e profitti giornalieri (Caso 3)
162
6. L’AZIENDA VIRTUALE: BASIC_JES
Dalla Figura 6.17 e dalla Figura 6.18 si nota inoltre che i ricavi crescono
di più nei primi 300 giorni per poi rimanere abbastanza stabili fino alla fine
della simulazione. La differenza con il caso 1 è motivata nella diversa origine
dei ricavi per questi due tipi di azienda; nel primo caso la BasicNet simulata,
come quella reale, contabilizza i ricavi quando vende il campionario e quando
riceve le royalties, ora invece i ricavi sono calcolati in base ad un mark-up sui
costi, perciò quando i costi sono alti lo sono anche i ricavi e viceversa, come
mostra la Figura 6.18.
In questo caso i profitti totali sono negativi, ma se si osserva l’andamento dei profitti giornalieri si nota che essi risultano positivi per 51 giorni,
ottenendo un risultato migliore rispetto al caso precedente.
6.16.3
Caso 3
In questo ultimo esempio di modello organizzativo l’ipotetica BasicNet fa
produrre in outsourcing i propri prodotti e li vende direttamente al pubblico. La configurazione dei costi è uguale a quella presentata nel caso della
BasicNet reale e i ricavi sono calcolati in base ad un ricarico pari al 65%11 .
Se si osservano le curve dei costi e dei ricavi si può notare che questo terzo
modello organizzativo rappresenta la ‘‘miscela’’ di quelli precedenti. Infatti
nella Figura 6.19 e nella Figura 6.20 si nota che, come ipotizzato, i costi
sono uguali a quelli mostrati per il caso 1. I ricavi al contrario hanno un
andamento simile a quelli del esempio precedente.
Le differenze tra i ricavi di questa azienda e quella del caso 2 si notano
nella Figura 6.20 e sono concentrate nella seconda metà della simulazione,
probabilmente dovute alla mancanza, in questo caso, dei costi legati alla
produzione degli articoli.
L’azienda simulata chiude i due anni con una forte perdita complessiva,
11
vedi paragrafo 6.10.3
163
6. L’AZIENDA VIRTUALE: BASIC_JES
come nei casi precedenti, e i profitti giornalieri risultano positivi soltanto per
30 giorni, cioè in numero minore rispetto al caso precedente.
164
Appendice
Si riporta il codice sorgente dei file ComputationalAssembler.java aggiornati
con le modifiche illustrate nel Capitolo 6 di questa tesi. Per ogni modello
di azienda è stata creata una classe ComputationalAssembler che contiene i
passi computazionali necessari durante la simulazione.
Caso 1
Listing 6.8: ComputationalAssembler.java Caso 1
¨
//
ComputationalAssembler . j a v a
i m p o r t swarm . G l o b a l s ;
i m p o r t swarm . d e f o b j . Zone ;
i m p o r t swarm . o b j e c t b a s e . SwarmObjectImpl ;
i m p o r t swarm . c o l l e c t i o n s . L i s t I m p l ;
i m p o r t swarm . c o l l e c t i o n s . L i s t I n d e x ;
i m p o r t swarm . random . N o r m a l D i s t I m p l ;
import java . lang . Float ;
import java . i o . ∗ ;
import java . u t i l . ∗ ;
/∗ ∗
∗ The ComputationalAssembler c l a s s
i n s t a n c e s make
∗ c o m p u t a t i o n a l p r o c e s s e s ; we have a c o m p u t a t i o n a l a s s e m b l e r
∗ i n s t a n c e f o r each u n i t
∗
∗
∗ @author<b r/>
∗ Marco Lamieri<a h r e f="m a i l t o : lamieri@econ . u n i t o . i t "></a></br>
∗ Francesco Merlo<a h r e f="m a i l t o : merlo@econ . u n i t o . i t "></a></br>
∗ @version 0 . 9 . 7 . 3 1 . b ( BasicJVE 1 . 0 )
∗/
public
class
ComputationalAssembler extends ComputationalAssemblerBasic
{
//Our MemoryMatrixes
MemoryMatrix d e s i g n M a t r i x ,
orMatrix ,
basicNetMatrix , tcMatrix ,
agentMatrix ;
165
APPENDICE
166
//A normal d i s t r i b u t i o n
f o r random numbers
N o r m a l D i s t I m p l normal ;
// g r o s s S a l e s
public
F i l e management
boolean
FileWriter
grossSalesLogFileOpen = f a l s e ;
g r o s s S a l e s L o g=n u l l ;
i n t samplesN =0;
float
sampleSales = 0;
float
itemSales = 0;
p u b l i c MyWriter r e p o r t=n u l l ;
/∗ ∗
∗ the constructor
f o r ComputationalAssembler
∗/
public
C o m p u t a t i o n a l A s s e m b l e r ( Zone aZone ,
O r d e r D i s t i l l e r od , ESFrameModelSwarm mo)
{
// C a l l t h e c o n s t r u c t o r
f o r the parent c l a s s .
s u p e r ( aZone , od , mo ) ;
normal = new N o r m a l D i s t I m p l ( g e t Z o n e ( ) ) ;
}
// ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
// BasicJES Computational codes
// ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
/∗ ∗ c o m p u t a t i o n a l o p e r a t i o n s w i t h code −1901 < br><br>
∗
∗
this
∗
t h e unique r e c e i v e d matrix and s e t
c o m p u t a t i o n a l code increment 1 by 1 p o s i t i o n 0 , 0 o f
the
status
t o done
∗/
public
void c1901 ( )
{
checkMatrixes (1901 ,1);
d e s i g n M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 0 ) ;
l a y e r = pendingComputationalSpecificationSet . getOrderLayer ( ) ;
// Zeroing t h e c o u n t e r
i f empty
i f ( d e s i g n M a t r i x . getEmpty ( l a y e r , 0 , 0 ) )
designMatrix . setValue ( layer , 0 , 0 , 0 . 0 ) ;
int
counter = ( i n t ) designMatrix . getValue ( layer , 0 , 0 ) ;
c o u n t e r ++;
//Here we s t o r e t h e number o f MetaSample produced
designMatrix . setValue ( layer ,0 ,0 , counter ) ;
System . o u t . p r i n t l n ( " MetaSample␣#" + c o u n t e r + " ␣ w i t h ␣ l a y e r ␣#" + l a y e r
+ " ␣ h a s ␣ been ␣ drawn " ) ;
done=t r u e ;
} // end c1901
/∗ ∗ c o m p u t a t i o n a l o p e r a t i o n s w i t h code −1902 < br><br>
∗
∗
this
c o m p u t a t i o n a l code d i a l
∗
∗/
public
void c1902 ( )
with licensee ’ s p r e d i c t i o n s .
APPENDICE
167
{
checkMatrixes (1902 ,2);
d e s i g n M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 0 ) ;
a g e n t M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 1 ) ;
l a y e r=p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t . g e t O r d e r L a y e r ( ) ;
// Making p r e d i c t i o n
for
a v a i l a b l e MetaSample
i f ( ! d e s i g n M a t r i x . getEmpty ( l a y e r , 0 , 0 ) )
{
// S w i t c h i n g t o an o t h e r
int
article
j = getCounter ( agentMatrix , 1 ) ;
//The l i c e n s e e
int
prediction
f o r e c a s t = ( i n t ) normal . g e t S a m p l e W i t h M e a n $ w i t h V a r i a n c e ( 5 0 0 , 9 0 0 0 0 0 ) ;
//Min v a l u e
if
( f o r e c a s t < 10)
forecast = 10;
//Max v a l u e
if
( f o r e c a s t > 25000)
f o r e c a s t = 25000;
// S t o r i n g t h e p r e d i c t i o n
agentMatrix . setValue ( layer , 1 , j , f o r e c a s t ) ;
System . o u t . p r i n t l n ( " L i c e n s e e ␣#" + myUnit . getUnitNumber ( ) + " ␣ f o r e c a s t e d ␣ "
+ f o r e c a s t + " ␣ f o r ␣ MetaSample␣#" + j + " ␣ w i t h ␣ l a y e r ␣#" + l a y e r ) ;
// End o f
predictions
done=t r u e ;
} // Waiting f o r some MetaSample −> done=f a l s e
} // end c1902
/∗ ∗ c o m p u t a t i o n a l o p e r a t i o n s w i t h code −1903 < br><br>
∗
this
∗
c o m p u t a t i o n a l code sums up p r e d i c t i o n s .
∗
∗/
public
void c1903 ( )
{
f l o a t sum = 0 ;
int
threshold = 18000;
boolean endForecast = true ;
checkMatrixes (1901 ,37);
d e s i g n M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 0 ) ;
b a s i c N e t M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 3 6 ) ;
l a y e r = pendingComputationalSpecificationSet . getOrderLayer ( ) ;
// G e t t i n g t h e number o f
int
articles
counter = ( i n t ) designMatrix . getValue ( layer , 0 , 0 ) ;
for ( int
j = 1 ; j <= c o u n t e r
;
j ++)
APPENDICE
168
{
for ( int
t = 1 ; t < = 3 5 ; t++)
{
MemoryMatrix a g e n t M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( t ) ;
// Checking
if
the
l i c e n s e e made a p r e d i c t i o n
for
t h i s MetaSample
i f ( ! ( a g e n t M a t r i x . getEmpty ( l a y e r , 1 , j ) ) )
{
sum = sum + a g e n t M a t r i x . g e t V a l u e ( l a y e r , 1 , j ) ;
}
}
// S t o r i n g
total
p r e d i c t i o n s i n b a s i c N e t Matrix
b a s i c N e t M a t r i x . s e t V a l u e ( l a y e r , 1 , j , sum ) ;
// Checking
if
i f MetaSample can be produced
( sum > t h r e s h o l d )
{
basicNetMatrix . setValue ( layer , 2 , j , 1 ) ;
System . o u t . p r i n t l n ( " MetaSample␣#" + j + " ␣ w i t h ␣ l a y e r ␣#" + l a y e r +
" ␣ can ␣ be ␣ produced , ␣ f o r e c a s t=" + sum + " ␣ s t a t u s =1" ) ;
}
else
{
basicNetMatrix . setValue ( layer , 2 , j , 0 ) ;
System . o u t . p r i n t l n ( " MetaSample␣#" + j + " ␣ w i t h ␣ l a y e r ␣#" + l a y e r +
" ␣ can ␣NOT␣ be ␣ produced , ␣ f o r e c a s t=" + sum + " ␣ s t a t u s =0" ) ;
}
// Waiting
for ( int
all
predictions
t = 1 ; t < = 3 5 ; t++)
{
MemoryMatrix a g e n t M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( t ) ;
i f ( a g e n t M a t r i x . getEmpty ( l a y e r , 1 , j ) )
endForecast = f a l s e ;
}
if
( endForecast )
{
System . o u t . p r i n t l n ( " MetaSample␣#" + j + " ␣ w i t h ␣ l a y e r ␣#" + l a y e r
+ " ␣ f o r e c a s t e d ␣ by ␣ a l l ␣ l i c e n s e e " ) ;
done=t r u e ;
}
sum = 0 ;
}
}
// end c1903
/∗ ∗ c o m p u t a t i o n a l o p e r a t i o n s w i t h code −1904 < br><br>
∗
∗
this
∗
s e t 1 t o row 2 matrix i n pos 1 ∗
c o m p u t a t i o n a l code check t r e s h o l d and i f
∗
1 cell
∗
whit a counter in p o s i t i o n ( 0 , 1 )
f o r each number o f row read i n matrix i n pos 0 ( 0 , 0 ) ,
∗/
public
void c1904 ( )
{
float
above
and s e t done=t r u e .
val ;
APPENDICE
169
checkMatrixes (1904 ,2);
d e s i g n M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 0 ) ;
b a s i c N e t M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 1 ) ;
l a y e r = pendingComputationalSpecificationSet . getOrderLayer ( ) ;
// S w i t c h i n g t o an o t h e r
int
article
i = getCounter ( basicNetMatrix , 1 ) ;
// check t h e number o f i t e m s and t h e
status
i f ( ! d e s i g n M a t r i x . getEmpty ( l a y e r , 0 , 0 ) & & ! b a s i c N e t M a t r i x . getEmpty ( l a y e r , 2 , i ) )
{
i f ( i <= d e s i g n M a t r i x . g e t V a l u e ( l a y e r , 0 , 0 ) & & b a s i c N e t M a t r i x . g e t V a l u e ( l a y e r , 2 , i ) = = 1 )
{
System . o u t . p r i n t l n ( " U n i t␣#" + myUnit . getUnitNumber ( ) + " ␣ p r o d u c e d ␣ MetaSample␣#" + i
+ " ␣ w i t h ␣ l a y e r ␣#" + l a y e r + " , ␣ s t a t u s =2" ) ;
basicNetMatrix . setValue ( layer , 2 , i , 2 ) ;
done=t r u e ;
}
else
{
System . o u t . p r i n t l n ( " U n i t␣#" + myUnit . getUnitNumber ( ) + " ␣NOT␣ p r o d u c e d ␣ MetaSample␣#"
+ i + " ␣ w i t h ␣ l a y e r ␣#" + l a y e r + " , ␣ s t a t u s =1" ) ;
}
}
}
// end c1904
/∗ ∗ c o m p u t a t i o n a l o p e r a t i o n s w i t h code −1905 < br><br>
∗
∗ This c o m p u t a t i o n a l code d i a l s
w i t h TC o f f e r −p r i c e
∗/
public
void c1905 ( )
{
float
o f f e r P r i c e , random ;
checkMatrixes (1905 ,3);
d e s i g n M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 0 ) ;
b a s i c N e t M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 1 ) ;
t c M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 2 ) ;
l a y e r = pendingComputationalSpecificationSet . getOrderLayer ( ) ;
//Making an o f f e r −p r i c e
for
available
articles
i f ( ! d e s i g n M a t r i x . getEmpty ( l a y e r , 0 , 0 ) )
{
int
counter = ( i n t ) designMatrix . getValue ( layer , 0 , 0 ) ;
for ( int
i = 1 ; i <=c o u n t e r ;
i ++)
{
i f ( ! b a s i c N e t M a t r i x . getEmpty ( l a y e r , 2 , i ) )
APPENDICE
170
{
i f ( basicNetMatrix . getValue ( layer , 2 , i ) > 0)
{
//The o f f e r −p r i c e
o f f e r P r i c e = ( i n t ) normal . g e t S a m p l e W i t h M e a n $ w i t h V a r i a n c e ( 7 , 1 0 ) ;
//Min v a l u e
if
( o f f e r P r i c e <1)
offerPrice = 1;
//Max v a l u e
if
( o f f e r P r i c e >20)
o f f e r P r i c e =20;
// S t o r i n g t h e o f f e r −p r i c e o f t h e TC
tcMatrix . setValue ( layer , 1 , i ,
offerPrice );
System . o u t . p r i n t l n ( " U n i t␣#" + myUnit . getUnitNumber ( )
+ " ␣ o f f e r ␣ p r i c e ␣ f o r ␣ MetaSample␣#" + i +
" ␣ w i t h ␣ l a y e r ␣#" + l a y e r + " ␣ i s ␣ $ "
+ offerPrice );
}
else
System . o u t . p r i n t l n ( " U n i t␣#" + myUnit . getUnitNumber ( )
+ " ␣ can ␣ n o t ␣make␣ an ␣ o f f e r ␣ f o r ␣ Metasample␣#" + i +
" ␣ w i t h ␣ l a y e r ␣#" + l a y e r
}
}
done=t r u e ;
}
// Waiting f o r some MetaSample −> done=f a l s e
}
// end c1905
/∗ ∗ c o m p u t a t i o n a l o p e r a t i o n s w i t h code −1906 < br><br>
∗ This c o m p u t a t i o n a l code d i a l
w i t h t h e b i d d i n g phase
∗/
public
void c1906 ( )
{
MemoryMatrix c h o i c e M a t r i x ;
checkMatrixes (1906 ,8);
d e s i g n M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 0 ) ;
b a s i c N e t M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 6 ) ;
o r M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 7 ) ;
l a y e r = pendingComputationalSpecificationSet . getOrderLayer ( ) ;
// Checking MetaSamples
i f ( ! d e s i g n M a t r i x . getEmpty ( l a y e r , 0 , 0 ) )
{
int
counter = ( i n t ) designMatrix . getValue ( layer , 0 , 0 ) ;
for ( int
i = 1 ; i <=c o u n t e r ;
i ++)
{
int
choice = 0;
float
o f f e r =0;
// Checking t h e
status
i f ( ! b a s i c N e t M a t r i x . getEmpty ( l a y e r , 2 , i ) )
{
);
APPENDICE
171
i f ( basicNetMatrix . getValue ( layer , 2 , i ) > 0)
{
//Here we make t h e b i d d i n g
for ( int
t = 1 ; t < = 5 ; t++)
{
MemoryMatrix t c M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( t ) ;
i f ( ! t c M a t r i x . getEmpty ( l a y e r , 1 , i ) )
{
i f ( tcMatrix . getValue ( layer , 1 , i ) < o f f e r
||
o f f e r ==0)
{
o f f e r = tcMatrix . getValue ( layer , 1 , i ) ;
choice = t ;
}
}
}
// Checking t h e TC chosen
i f ( ! b a s i c N e t M a t r i x . getEmpty ( l a y e r , 2 , i ) )
{
i f ( b a s i c N e t M a t r i x . g e t V a l u e ( l a y e r , 2 , i ) > 0 & & ( ! ( c h o i c e ==0)))
{
// G e t t i n g
its
offer
price
...
c h o i c e M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( c h o i c e ) ;
float
o f f e r P r i c e = choiceMatrix . getValue ( layer , 1 , i ) ;
// . . .
storing
it
i n b a s i c N e t Matrix
...
basicNetMatrix . setValue ( layer , 3 , i , o f f e r P r i c e ) ;
// . . . and i n t h e orMatrix
orMatrix . setValue ( layer , 1 , i , choice ) ;
System . o u t . p r i n t l n ( " T r a d i n g ␣Company␣#" + o r M a t r i x . g e t V a l u e ( l a y e r , 1 , i ) +
" ␣ h a s ␣ been ␣ c h o s e n ␣ f o r ␣ MetaSample␣#" + i + " ␣ w i t h ␣ l a y e r ␣#" + l a y e r + " ␣ p r i c e ␣ "
+ basicNetMatrix . getValue ( layer , 3 , i ) ) ;
}
}
}
}
}
done=t r u e ;
}
// Waiting f o r some MetaSample −> done=f a l s e
}
// end c1906
/∗ ∗ c o m p u t a t i o n a l o p e r a t i o n s w i t h code −1907 < br><br>
∗
this
∗
c o m p u t a t i o n a l code d i a l
with licensee ’ s
first
order .
∗
∗/
public
void c1907 ( )
{
checkMatrixes (1907 ,3);
d e s i g n M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 0 ) ;
a g e n t M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
APPENDICE
172
getMemoryMatrixAddress ( 1 ) ;
b a s i c N e t M a t r i x =(MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 2 ) ;
l a y e r = pendingComputationalSpecificationSet . getOrderLayer ( ) ;
i f ( ! d e s i g n M a t r i x . getEmpty ( l a y e r , 0 , 0 ) )
{
int
if
j = getCounter ( agentMatrix , 2 ) ;
( ! b a s i c N e t M a t r i x . getEmpty ( l a y e r , 2 , j ) )
{
//Check i f
if
the
licensee
received the
r e l a t e d MetaSample
( b a s i c N e t M a t r i x . g e t V a l u e ( l a y e r , 2 , j ) >1)
{
int
o r d e r 1 = ( i n t ) normal . g e t S a m p l e W i t h M e a n $ w i t h V a r i a n c e ( 5 0 0 , 9 0 0 0 0 0 ) ;
//Min v a l u e
if
( o r d e r 1 <10)
order1 = 10;
//Max v a l u e
if
( o r d e r 1 >25000)
order1 = 25000;
agentMatrix . setValue ( layer , 2 , j , order1 ) ;
if
( b a s i c N e t M a t r i x . getEmpty ( l a y e r , 4 , j ) )
basicNetMatrix . setValue ( layer , 4 , j , 0 . 0 ) ;
int
totOrder1 = ( i n t ) basicNetMatrix . getValue ( layer , 4 , j ) + order1 ;
basicNetMatrix . setValue ( layer , 4 , j , totOrder1 ) ;
System . o u t . p r i n t l n ( "The ␣1 s t ␣ o r d e r ␣ o f ␣ L i c e n s e e ␣#" + myUnit . getUnitNumber ( )
+ " ␣ i s ␣ " + o r d e r 1 + " ␣ f o r ␣ i t e m␣#" + j + " ␣ w i t h ␣ l a y e r ␣#" + l a y e r + " ␣ t o t O r d e r␣#"
+t o t O r d e r 1 ) ;
done=t r u e ;
}
// The a r t i c l e can not be ordered −> done=f a l s e
}
}
}
// end c1907
/∗ ∗ c o m p u t a t i o n a l o p e r a t i o n s w i t h code −1908 < br><br>
∗
this
∗
c o m p u t a t i o n a l code d i a l
w i t h or branch c h o i c e .
∗
∗/
public
void c1908 ( )
{
checkMatrixes (1908 ,3);
d e s i g n M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 0 ) ;
b a s i c N e t M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 1 ) ;
o r M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 2 ) ;
l a y e r = pendingComputationalSpecificationSet . getOrderLayer ( ) ;
APPENDICE
173
i f ( ! d e s i g n M a t r i x . getEmpty ( l a y e r , 0 , 0 ) )
{
// S w i t c h i n g t o another
int
article
i = getCounter ( orMatrix , 0 ) ;
i f ( i <= d e s i g n M a t r i x . g e t V a l u e ( l a y e r , 0 , 0 ) )
{
i f ( ! b a s i c N e t M a t r i x . getEmpty ( l a y e r , 2 , i ) )
{
//Check i f
t h e item can be produced ( s t a t u s >1)
i f ( b a s i c N e t M a t r i x . g e t V a l u e ( l a y e r , 2 , i ) > 1 & & ! o r M a t r i x . getEmpty ( l a y e r , 1 , i ) )
{
float
branch = orMatrix . getValue ( l a y e r , 1 , i ) ;
orMatrix . s e t V a l u e ( l a y e r , 1 , 0 , branch ) ;
System . o u t . p r i n t l n ( " Branch␣␣#" + o r M a t r i x . g e t V a l u e ( l a y e r , 1 , 0 ) +
" ␣ p r o d u c e d ␣ i t e m␣#" + i + " ␣ w i t h ␣ l a y e r ␣#" + l a y e r ) ;
basicNetMatrix . setValue ( layer , 2 , i , 3 . 0 ) ;
done = t r u e ;
}
}
// The a r t i c l e can not be produced −> done=f a l s e
}
}
}
//end c1908
/∗ ∗ c o m p u t a t i o n a l o p e r a t i o n s w i t h code −1909 < br><br>
∗
this
∗
c o m p u t a t i o n a l code d i a l
w i t h l i c e n s e e ’ s second o r d e r .
∗
∗/
public
void c1909 ( )
{
int
threshold = 100;
checkMatrixes (1909 ,3);
d e s i g n M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 0 ) ;
a g e n t M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 1 ) ;
b a s i c N e t M a t r i x =(MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 2 ) ;
l a y e r = pendingComputationalSpecificationSet . getOrderLayer ( ) ;
int
if
j = getCounter ( agentMatrix , 3 ) ;
( ! d e s i g n M a t r i x . getEmpty ( l a y e r , 0 , 0 ) )
{
if
( j <= d e s i g n M a t r i x . g e t V a l u e ( l a y e r , 0 , 0 ) )
{
// Checks
if
if
the
l i c e n s e e has a l r e a d y done t h e
first
order
( ! a g e n t M a t r i x . getEmpty ( l a y e r , 2 , j ) )
{
int
s e l e c t = ( i n t ) normal . g e t S a m p l e W i t h M e a n $ w i t h V a r i a n c e ( 1 0 0 , 5 0 0 0 0 ) ;
APPENDICE
174
// d e c i d e t o do or not another o r d e r
if
( select > threshold )
{
int
o r d e r 2 = ( i n t ) normal . g e t S a m p l e W i t h M e a n $ w i t h V a r i a n c e ( 5 0 0 , 9 0 0 0 0 0 ) ;
//Min v a l u e
if
( o r d e r 2 <10)
order2 = 10;
//Max v a l u e
if
( o r d e r 2 >25000)
order2 = 25000;
agentMatrix . setValue ( layer , 3 , j , order2 ) ;
if
( b a s i c N e t M a t r i x . getEmpty ( l a y e r , 5 , j ) )
basicNetMatrix . setValue ( layer , 5 , j , 0 . 0 ) ;
int
totOrder2 = ( i n t )
basicNetMatrix . getValue ( layer , 5 , j ) + order2 ;
basicNetMatrix . setValue ( layer , 5 , j , totOrder2 ) ;
System . o u t . p r i n t l n ( "The ␣2 nd␣ o r d e r ␣ o f ␣ L i c e n s e e ␣#" + myUnit . getUnitNumber ( )
+ " ␣ i s ␣ " + o r d e r 2 + " ␣ f o r ␣ i t e m␣#" + j + " ␣ w i t h ␣ l a y e r ␣#" + l a y e r + " ␣ t o t O r d e r␣#"
+ totOrder2 ) ;
} //end i f ( s e l e c t )
else
{
agentMatrix . setValue ( layer , 3 , j , 0 . 0 ) ;
if
( b a s i c N e t M a t r i x . getEmpty ( l a y e r , 5 , j ) )
basicNetMatrix . setValue ( layer , 5 , j , 0 . 0 ) ;
} //end e l s e
int
totOrder1 = ( i n t ) basicNetMatrix . getValue ( layer , 4 , j ) ;
int
totOrder2 = ( i n t ) basicNetMatrix . getValue ( layer , 5 , j ) ;
int
totOrder = totOrder1 + totOrder2 ;
basicNetMatrix . setValue ( layer , 6 , j , totOrder ) ;
} //end i f ( c h e c k i n g
first
order )
}
}
done = t r u e ;
// The a r t i c l e can not be ordered −> done=f a l s e
} // end c1909
/∗ ∗ c o m p u t a t i o n a l o p e r a t i o n s w i t h code −1910 < br><br>
∗
∗
∗
∗/
This c o m p u t a t i o n a l code p r i n t s t h e Report and s t o p s t h e s i m u l a t i o n .
APPENDICE
public
175
void c1910 ( )
{
checkMatrixes (1910 ,2);
d e s i g n M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 0 ) ;
b a s i c N e t M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 1 ) ;
l a y e r = pendingComputationalSpecificationSet . getOrderLayer ( ) ;
try
{
r e p o r t = new MyWriter ( " l o g / r e p o r t . t x t " ) ;
report .
w r i t e ( " L a y e r ␣ | ␣ MetaSampleN ␣ | ␣ S t a t u s 0 ␣ | ␣ S t a t u s 1 ␣ | ␣ S t a t u s 2 ␣ | ␣ S t a t u s 3 ␣ | ␣ S t a t u s ␣ 4 ␣ ␣ \ n" ) ;
}
catch ( IOException e )
{
System . o u t . p r i n t l n ( e ) ;
MyExit . e x i t ( 1 ) ;
}
for ( int
l n = 1 ; l n <=16; l n ++)
{
i n t metaSamplesN =0;
int [ ]
status ;
s t a t u s = new i n t [ 5 ] ;
for ( int
s = 0 ; s <=4; s++)
status [ s ]=0;
i f ( ! d e s i g n M a t r i x . getEmpty ( l n , 0 , 0 ) )
metaSamplesN = ( i n t ) d e s i g n M a t r i x . g e t V a l u e ( l n , 0 , 0 ) ;
for ( int
i t e m = 1 ; item <=150; i t e m++)
{
i f ( ! b a s i c N e t M a t r i x . getEmpty ( l n , 2 , i t e m ) )
s t a t u s [ ( i n t ) basicNetMatrix . getValue ( ln , 2 ,
item )]++;
}
String
t e x t = l n + " ␣ | ␣ " + metaSamplesN + " ␣ | ␣ " + s t a t u s [ 0 ] + " ␣ | ␣ " + s t a t u s [ 1 ]
+ " ␣ | ␣ " + s t a t u s [ 2 ] + " ␣ | ␣ " + s t a t u s [ 3 ] + " ␣ | ␣ " + s t a t u s [ 4 ] + " ␣\ n" ;
try
{
report . write ( text ) ;
}
catch ( IOException e )
{
System . o u t . p r i n t l n ( e ) ;
MyExit . e x i t ( 1 ) ;
}
}
try
{
report . close ( ) ;
}
catch ( IOException e )
{
APPENDICE
176
System . o u t . p r i n t l n ( e ) ;
MyExit . e x i t ( 1 ) ;
}
System . o u t . p r i n t l n ( " ∗∗∗∗∗␣THIS␣ I S ␣THE␣END! ␣ ∗ ∗ ∗ ∗ ∗ " ) ;
StartESFrame . eSFrameObserverSwarm . g e t C o n t r o l P a n e l ( ) . s e t S t a t e S t o p p e d ( ) ;
done = t r u e ;
} //end c1910
/∗ ∗ c o m p u t a t i o n a l o p e r a t i o n s w i t h code −1911 < br><br>
∗
This c o m p u t a t i o n a l code c a l c u l a t e s
∗
gross
s a l e s from samples .
∗
∗/
public
void c1911 ( )
{
checkMatrixes (1911 ,2);
d e s i g n M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 0 ) ;
b a s i c N e t M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 1 ) ;
l a y e r = pendingComputationalSpecificationSet . getOrderLayer ( ) ;
float
int
s a m p l e P r i c e = ( f l o a t ) normal . g e t S a m p l e W i t h M e a n $ w i t h V a r i a n c e ( 3 5 , 6 ) ;
counter = getCounter ( basicNetMatrix , 4 ) ;
logOpen ( t r u e , " l o g / g r o s s S a l e s . t x t " ) ;
String
t e x t = G l o b a l s . env . g e t C u r r e n t T i m e ( ) + " ␣ | ␣ " + s a m p l e P r i c e + " ␣\ n" ;
try
{
grossSalesLog . write ( text ) ;
grossSalesLog . flush ( ) ;
}
catch ( IOException e )
{
System . o u t . p r i n t l n ( e ) ;
MyExit . e x i t ( 1 ) ;
}
done = t r u e ;
} //end c1911
/∗ ∗ c o m p u t a t i o n a l o p e r a t i o n s w i t h code −1912 < br><br>
∗
This c o m p u t a t i o n a l code c a l c u l a t e s
∗
the value of
royalties .
∗
∗/
public
void c1912 ( )
{
checkMatrixes (1912 ,2);
d e s i g n M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 0 ) ;
APPENDICE
177
b a s i c N e t M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 1 ) ;
l a y e r = pendingComputationalSpecificationSet . getOrderLayer ( ) ;
int
if
counter = getCounter ( basicNetMatrix , 6 ) ;
( ! d e s i g n M a t r i x . getEmpty ( l a y e r , 0 , 0 ) )
{
if
( c o u n t e r <= d e s i g n M a t r i x . g e t V a l u e ( l a y e r , 0 , 0 ) )
{
i f ( ! b a s i c N e t M a t r i x . getEmpty ( l a y e r , 2 , c o u n t e r )
&& ! b a s i c N e t M a t r i x . getEmpty ( l a y e r , 3 , c o u n t e r ) & & ! b a s i c N e t M a t r i x .
getEmpty ( l a y e r , 6 , c o u n t e r ) )
{
if
( basicNetMatrix . getValue ( layer , 2 , counter ) > 3.0)
{
double
itemPrice =
basicNetMatrix . getValue ( layer , 3 , counter ) ∗ 2 . 2 ;
double totRevenues = itemPrice ∗ basicNetMatrix . getValue ( layer , 6 , counter ) ;
double
itemSales =
( totRevenues ∗ 0 . 1 ) ;
System . o u t . p r i n t l n ( " R o y a l t i e s ␣ f o r ␣ i t e m ␣␣#" + c o u n t e r + " ␣ w i t h ␣ l a y e r ␣#" + l a y e r
+ " ␣ have ␣ been ␣ payed ␣ by ␣ l i c e n s e e s " ) ;
String
t e x t = G l o b a l s . env . g e t C u r r e n t T i m e ( ) + " ␣ | ␣ " + i t e m S a l e s + " ␣\ n" ;
logOpen ( f a l s e , " l o g / g r o s s S a l e s . t x t " ) ;
try
{
grossSalesLog . write ( text ) ;
grossSalesLog . flush ( ) ;
}
catch ( IOException e )
{
System . o u t . p r i n t l n ( e ) ;
MyExit . e x i t ( 1 ) ;
}
}
}
}
}
done = t r u e ;
} //end c1912
/∗ ∗ c o m p u t a t i o n a l o p e r a t i o n s w i t h code −1913 < br><br>
∗
This c o m p u t a t i o n a l code d i s t r i b u t e s
∗
items to the
licensees .
∗
∗/
public
void c1913 ( )
{
checkMatrixes (1913 ,3);
d e s i g n M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 0 ) ;
b a s i c N e t M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 1 ) ;
APPENDICE
178
o r M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 2 ) ;
l a y e r = pendingComputationalSpecificationSet . getOrderLayer ( ) ;
int
if
counter = getCounter ( basicNetMatrix , 2 ) ;
( ! d e s i g n M a t r i x . getEmpty ( l a y e r , 0 , 0 ) )
{
i f ( c o u n t e r <= d e s i g n M a t r i x . g e t V a l u e ( l a y e r , 0 , 0 ) )
{
//Check i f
item has been produced
i f ( basicNetMatrix . getValue ( layer , 2 , counter ) > 2)
{
float
tc = orMatrix . getValue ( layer , 1 , counter ) ;
orMatrix . setValue ( layer , 1 , 0 , tc ) ;
System . o u t . p r i n t l n ( " Item␣␣#" + c o u n t e r + " ␣ w i t h ␣ l a y e r ␣#" + l a y e r
+ " ␣ h a s ␣ been ␣ d e l i v e r e d ␣ by ␣ T r a d i n g ␣Company␣ " + o r M a t r i x . g e t V a l u e ( l a y e r , 1 , 0 ) ) ;
basicNetMatrix . setValue ( layer , 2 , counter , 4 . 0 ) ;
}
}
}
done = t r u e ;
} //end c1913
// ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
// P r i v a t e f u n c t i o n s
// ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
//The c o u n t e r
i s used i n some c o m p u t a t i o n l code i n o r d e r t o t a k e a c t i o n s
// on d i f f e r e n t
private
int
article
with only a recipe
g e t C o u n t e r ( MemoryMatrix c u r r e n t M a t r i x ,
i n t row )
{
// Zeroing t h e c o u n t e r
i f empty
i f ( c u r r e n t M a t r i x . getEmpty ( l a y e r , row , 0 ) )
c u r r e n t M a t r i x . s e t V a l u e ( l a y e r , row , 0 , 0 . 0 ) ;
//Here we increment t h e c o u n t e r
int
c o u n t e r = ( i n t ) c u r r e n t M a t r i x . g e t V a l u e ( l a y e r , row , 0 ) ;
c o u n t e r ++;
//The c o u n t e r must be l e s s than t h e number o f MetaSample
i f ( c o u n t e r <= d e s i g n M a t r i x . g e t V a l u e ( l a y e r , 0 , 0 ) )
c u r r e n t M a t r i x . s e t V a l u e ( l a y e r , row , 0 , c o u n t e r ) ;
return
counter ;
}
private
v o i d c h e c k M a t r i x e s ( i n t code ,
int
numberOfMatrixes )
{
i f ( pendingComputationalSpecificationSet .
getNumberOfMemoryMatrixesToBeUsed ( ) ! = numberOfMatrixes )
{
System . o u t . p r i n t l n ( " Code␣−"+ c o d e + " ␣ r e q u i r e s ␣ " + numberOfMatrixes + " ␣ m a t r i x ; ␣ "
+ p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t . getNumberOfMemoryMatrixesToBeUsed ( )
+ " ␣ f o u n d ␣ i n ␣ o r d e r ␣#␣" + p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t . getOrderNumber ( ) ) ;
APPENDICE
179
MyExit . e x i t ( 1 ) ;
}
}
private
v o i d logOpen ( b o o l e a n
eraseFile ,
String
fileName )
{
File
f i l e O u t = new F i l e ( f i l e N a m e ) ;
i f ( ! t h i s . g r o s s S a l e s L o g F i l e O p e n && e r a s e F i l e )
{
try
{
FileWriter
erase
= new F i l e W r i t e r ( f i l e O u t ,
false );
erase . close ( ) ;
}
catch ( IOException e )
{
System . o u t . p r i n t l n ( e ) ;
MyExit . e x i t ( 1 ) ;
}
}
try
{
g r o s s S a l e s L o g = new F i l e W r i t e r ( f i l e O u t ,
this . grossSalesLogFileOpen = true
true ) ;
;
}
catch ( IOException e )
{
System . o u t . p r i n t l n ( e ) ;
MyExit . e x i t ( 1 ) ;
}
}
}
§
­
¦
Caso 2
Listing 6.9: ComputationalAssembler.java Caso 2
¨
//
ComputationalAssembler . j a v a
i m p o r t swarm . G l o b a l s ;
i m p o r t swarm . d e f o b j . Zone ;
i m p o r t swarm . o b j e c t b a s e . SwarmObjectImpl ;
i m p o r t swarm . c o l l e c t i o n s . L i s t I m p l ;
i m p o r t swarm . c o l l e c t i o n s . L i s t I n d e x ;
i m p o r t swarm . random . N o r m a l D i s t I m p l ;
import java . lang . Float ;
import java . i o . ∗ ;
import java . u t i l . ∗ ;
/∗ ∗
∗ The ComputationalAssembler c l a s s
i n s t a n c e s make
∗ c o m p u t a t i o n a l p r o c e s s e s ; we have a computationa a s s e m b l e r i n s t a n c e f o r
∗ each u n i t
∗
∗
∗ @author<b r/>
∗ Marco Lamieri<a h r e f="m a i l t o : lamieri@econ . u n i t o . i t "></a></br>
APPENDICE
180
∗ Francesco Merlo<a h r e f="m a i l t o : merlo@econ . u n i t o . i t "></a></br>
∗ @version 0 . 9 . 7 . 3 1 . b ( BasicJVE 1 . 0 )
∗/
public
class
ComputationalAssembler extends ComputationalAssemblerBasic
{
//Our MemoryMatrixes
MemoryMatrix d e s i g n M a t r i x ,
//A normal d i s t r i b u t i o n
basicNetMatrix , tcMatrix , orMatrix ,
agentMatrix ;
f o r random numbers
N o r m a l D i s t I m p l normal ;
// g r o s s S a l e s
public
F i l e management
boolean
FileWriter
grossSalesLogFileOpen = f a l s e ;
g r o s s S a l e s L o g=n u l l ;
i n t samplesN =0;
float
sampleSales = 0;
float
itemSales = 0;
p u b l i c MyWriter r e p o r t=n u l l ;
/∗ ∗
∗ the constructor
f o r ComputationalAssembler
∗/
public
C o m p u t a t i o n a l A s s e m b l e r ( Zone aZone ,
O r d e r D i s t i l l e r od , ESFrameModelSwarm mo)
{
// C a l l t h e c o n s t r u c t o r
f o r the parent c l a s s .
s u p e r ( aZone , od , mo ) ;
normal = new N o r m a l D i s t I m p l ( g e t Z o n e ( ) ) ;
}
// ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
// BasicJES Computational codes
// ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
/∗ ∗ c o m p u t a t i o n a l o p e r a t i o n s w i t h code −1901 < br><br>
∗
∗
this
∗
unique r e c e i v e d matrix and s e t
c o m p u t a t i o n a l code increment 1 by 1 p o s i t i o n 0 , 0 o f t h e
the
status
t o done
∗/
public
void c1901 ( )
{
checkMatrixes (1901 ,1);
d e s i g n M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 0 ) ;
l a y e r = pendingComputationalSpecificationSet . getOrderLayer ( ) ;
// Zeroing t h e c o u n t e r
i f empty
i f ( d e s i g n M a t r i x . getEmpty ( l a y e r , 0 , 0 ) )
designMatrix . setValue ( layer , 0 , 0 , 0 . 0 ) ;
int
counter = ( i n t ) designMatrix . getValue ( layer , 0 , 0 ) ;
c o u n t e r ++;
//Here we s t o r e t h e number o f MetaSample produced
designMatrix . setValue ( layer ,0 ,0 , counter ) ;
System . o u t . p r i n t l n ( " MetaSample␣#" + c o u n t e r + " ␣ w i t h ␣ l a y e r ␣#" + l a y e r
+ " ␣ h a s ␣ been ␣ drawn " ) ;
done=t r u e ;
APPENDICE
181
}
// end c1901
/∗ ∗ c o m p u t a t i o n a l o p e r a t i o n s w i t h code −1902 < br><br>
∗
this
∗
c o m p u t a t i o n a l code d i a l
with licensee ’ s p r e d i c t i o n s .
∗
∗/
public
void c1902 ( )
{
checkMatrixes (1902 ,2);
d e s i g n M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 0 ) ;
a g e n t M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 1 ) ;
l a y e r=p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t . g e t O r d e r L a y e r ( ) ;
// Making p r e d i c t i o n
for
a v a i l a b l e MetaSample
i f ( ! d e s i g n M a t r i x . getEmpty ( l a y e r , 0 , 0 ) )
{
// S w i t c h i n g t o an o t h e r
int
article
j = getCounter ( agentMatrix , 1 ) ;
//The l i c e n s e e
int
prediction
f o r e c a s t = ( i n t ) normal . g e t S a m p l e W i t h M e a n $ w i t h V a r i a n c e ( 5 0 0 , 9 0 0 0 0 0 ) ;
//Min v a l u e
if
( f o r e c a s t < 10)
forecast = 10;
//Max v a l u e
if
( f o r e c a s t > 25000)
f o r e c a s t = 25000;
// S t o r i n g t h e p r e d i c t i o n
agentMatrix . setValue ( layer , 1 , j , f o r e c a s t ) ;
System . o u t . p r i n t l n ( " L i c e n s e e ␣#" + myUnit . getUnitNumber ( ) + " ␣ f o r e c a s t e d ␣ "
+ f o r e c a s t + " ␣ f o r ␣ MetaSample␣#" + j + " ␣ w i t h ␣ l a y e r ␣#" + l a y e r ) ;
// End o f
predictions
done=t r u e ;
}
// Waiting f o r some MetaSample −> done=f a l s e
}
// end c1902
/∗ ∗ c o m p u t a t i o n a l o p e r a t i o n s w i t h code −1903 < br><br>
∗
this
∗
c o m p u t a t i o n a l code sums up p r e d i c t i o n s .
∗
∗/
public
void c1903 ( )
{
f l o a t sum = 0 ;
int
threshold = 18000;
boolean endForecast = true ;
APPENDICE
182
checkMatrixes (1901 ,37);
d e s i g n M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 0 ) ;
b a s i c N e t M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 3 6 ) ;
l a y e r = pendingComputationalSpecificationSet . getOrderLayer ( ) ;
// G e t t i n g t h e number o f
int
articles
counter = ( i n t ) designMatrix . getValue ( layer , 0 , 0 ) ;
for ( int
j = 1 ; j <= c o u n t e r
;
j ++)
{
for ( int
t = 1 ; t < = 3 5 ; t++)
{
MemoryMatrix a g e n t M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( t ) ;
// Checking
if
the
l i c e n s e e made a p r e d i c t i o n
for
t h i s MetaSample
i f ( ! ( a g e n t M a t r i x . getEmpty ( l a y e r , 1 , j ) ) )
{
sum = sum + a g e n t M a t r i x . g e t V a l u e ( l a y e r , 1 , j ) ;
}
}
// S t o r i n g
total
p r e d i c t i o n s i n b a s i c N e t Matrix
b a s i c N e t M a t r i x . s e t V a l u e ( l a y e r , 1 , j , sum ) ;
// Checking
if
i f MetaSample can be produced
( sum > t h r e s h o l d )
{
basicNetMatrix . setValue ( layer , 2 , j , 1 ) ;
System . o u t . p r i n t l n ( " MetaSample␣#" + j + " ␣ w i t h ␣ l a y e r ␣#" + l a y e r +
" ␣ can ␣ be ␣ produced , ␣ f o r e c a s t=" + sum + " ␣ s t a t u s =1" ) ;
}
else
{
basicNetMatrix . setValue ( layer , 2 , j , 0 ) ;
System . o u t . p r i n t l n ( " MetaSample␣#" + j + " ␣ w i t h ␣ l a y e r ␣#" + l a y e r
+
" ␣ can ␣NOT␣ be ␣ produced , ␣ f o r e c a s t=" + sum + " ␣ s t a t u s =0" ) ;
}
// Waiting
for ( int
all
predictions
t = 1 ; t < = 3 5 ; t++)
{
MemoryMatrix a g e n t M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( t ) ;
i f ( a g e n t M a t r i x . getEmpty ( l a y e r , 1 , j ) )
endForecast = f a l s e ;
}
if
( endForecast )
{
System . o u t . p r i n t l n ( " MetaSample␣#" + j + " ␣ w i t h ␣ l a y e r ␣#" + l a y e r
+ " ␣ f o r e c a s t e d ␣ by ␣ a l l ␣ l i c e n s e e " ) ;
done=t r u e ;
}
sum = 0 ;
}
}
// end c1903
APPENDICE
183
/∗ ∗ c o m p u t a t i o n a l o p e r a t i o n s w i t h code −1904 < br><br>
∗
∗
this
∗
s e t 1 t o row 2 matrix i n pos 1 ∗
c o m p u t a t i o n a l code check t r e s h o l d and i f
∗
1 cell
∗
whit a counter in p o s i t i o n ( 0 , 1 )
above
and s e t done=t r u e .
f o r each number o f row read i n matrix i n pos 0 ( 0 , 0 ) ,
∗/
public
void c1904 ( )
{
float
val ;
checkMatrixes (1904 ,2);
d e s i g n M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 0 ) ;
b a s i c N e t M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 1 ) ;
l a y e r = pendingComputationalSpecificationSet . getOrderLayer ( ) ;
// S w i t c h i n g t o an o t h e r
int
article
i = getCounter ( basicNetMatrix , 1 ) ;
// check t h e number o f i t e m s and t h e
status
i f ( ! d e s i g n M a t r i x . getEmpty ( l a y e r , 0 , 0 ) & & ! b a s i c N e t M a t r i x . getEmpty ( l a y e r , 2 , i ) )
{
i f ( i <= d e s i g n M a t r i x . g e t V a l u e ( l a y e r , 0 , 0 ) & & b a s i c N e t M a t r i x . g e t V a l u e ( l a y e r , 2 , i ) = = 1 )
{
System . o u t . p r i n t l n ( " U n i t␣#" + myUnit . getUnitNumber ( ) + " ␣ p r o d u c e d ␣ MetaSample␣#" + i
+ " ␣ w i t h ␣ l a y e r ␣#" + l a y e r + " , ␣ s t a t u s =2" ) ;
basicNetMatrix . setValue ( layer , 2 , i , 2 ) ;
done=t r u e ;
}
else
{
System . o u t . p r i n t l n ( " U n i t␣#" + myUnit . getUnitNumber ( ) + " ␣NOT␣ p r o d u c e d ␣ MetaSample␣#"
+ i + " ␣ w i t h ␣ l a y e r ␣#" + l a y e r + " , ␣ s t a t u s =1" ) ;
}
}
}
// end c1904
/∗ ∗ c o m p u t a t i o n a l o p e r a t i o n s w i t h code −1907 < br><br>
∗
this
∗
c o m p u t a t i o n a l code d i a l
with licensee ’ s
first
order .
∗
∗/
public
void c1907 ( )
{
checkMatrixes (1907 ,3);
d e s i g n M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 0 ) ;
a g e n t M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 1 ) ;
b a s i c N e t M a t r i x =(MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
APPENDICE
184
getMemoryMatrixAddress ( 2 ) ;
l a y e r = pendingComputationalSpecificationSet . getOrderLayer ( ) ;
i f ( ! d e s i g n M a t r i x . getEmpty ( l a y e r , 0 , 0 ) )
{
int
if
j = getCounter ( agentMatrix , 2 ) ;
( ! b a s i c N e t M a t r i x . getEmpty ( l a y e r , 2 , j ) )
{
//Check i f
if
the
licensee
received the
r e l a t e d MetaSample
( b a s i c N e t M a t r i x . g e t V a l u e ( l a y e r , 2 , j ) >1)
{
int
o r d e r 1 = ( i n t ) normal . g e t S a m p l e W i t h M e a n $ w i t h V a r i a n c e ( 5 0 0 , 9 0 0 0 0 0 ) ;
//Min v a l u e
if
( o r d e r 1 <10)
order1 = 10;
//Max v a l u e
if
( o r d e r 1 >25000)
order1 = 25000;
agentMatrix . setValue ( layer , 2 , j , order1 ) ;
if
( b a s i c N e t M a t r i x . getEmpty ( l a y e r , 4 , j ) )
basicNetMatrix . setValue ( layer , 4 , j , 0 . 0 ) ;
int
totOrder1 = ( i n t ) basicNetMatrix . getValue ( layer , 4 , j ) + order1 ;
basicNetMatrix . setValue ( layer , 4 , j , totOrder1 ) ;
System . o u t . p r i n t l n ( "The ␣1 s t ␣ o r d e r ␣ o f ␣ L i c e n s e e ␣#" + myUnit . getUnitNumber ( )
+ " ␣ i s ␣ " + o r d e r 1 + " ␣ f o r ␣ i t e m␣#" + j + " ␣ w i t h ␣ l a y e r ␣#" + l a y e r
+ " ␣ t o t O r d e r␣#"+ t o t O r d e r 1 ) ;
done=t r u e ;
}
// The a r t i c l e can not be ordered −> done=f a l s e
}
}
}
// end c1907
/∗ ∗ c o m p u t a t i o n a l o p e r a t i o n s w i t h code −1909 < br><br>
∗
this
∗
c o m p u t a t i o n a l code d i a l
w i t h l i c e n s e e ’ s second o r d e r .
∗
∗/
public
void c1909 ( )
{
int
threshold = 100;
checkMatrixes (1909 ,3);
d e s i g n M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 0 ) ;
a g e n t M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 1 ) ;
b a s i c N e t M a t r i x =(MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 2 ) ;
l a y e r = pendingComputationalSpecificationSet . getOrderLayer ( ) ;
APPENDICE
int
if
185
j = getCounter ( agentMatrix , 3 ) ;
( ! d e s i g n M a t r i x . getEmpty ( l a y e r , 0 , 0 ) )
{
if
( j <= d e s i g n M a t r i x . g e t V a l u e ( l a y e r , 0 , 0 ) )
{
// Checks
if
if
the
l i c e n s e e has a l r e a d y done t h e
first
order
( ! a g e n t M a t r i x . getEmpty ( l a y e r , 2 , j ) )
{
int
s e l e c t = ( i n t ) normal . g e t S a m p l e W i t h M e a n $ w i t h V a r i a n c e ( 1 0 0 , 5 0 0 0 0 ) ;
// d e c i d e t o do or not another o r d e r
if
( select > threshold )
{
int
o r d e r 2 = ( i n t ) normal . g e t S a m p l e W i t h M e a n $ w i t h V a r i a n c e ( 5 0 0 , 9 0 0 0 0 0 ) ;
//Min v a l u e
if
( o r d e r 2 <10)
order2 = 10;
//Max v a l u e
if
( o r d e r 2 >25000)
order2 = 25000;
agentMatrix . setValue ( layer , 3 , j , order2 ) ;
if
( b a s i c N e t M a t r i x . getEmpty ( l a y e r , 5 , j ) )
basicNetMatrix . setValue ( layer , 5 , j , 0 . 0 ) ;
int
totOrder2 = ( i n t )
basicNetMatrix . getValue ( layer , 5 , j ) + order2 ;
basicNetMatrix . setValue ( layer , 5 , j , totOrder2 ) ;
System . o u t . p r i n t l n ( "The ␣2 nd␣ o r d e r ␣ o f ␣ L i c e n s e e ␣#" + myUnit . getUnitNumber ( )
+ " ␣ i s ␣ " + o r d e r 2 + " ␣ f o r ␣ i t e m␣#" + j + " ␣ w i t h ␣ l a y e r ␣#" + l a y e r + " ␣ t o t O r d e r␣#"
+ totOrder2 ) ;
} //end i f ( s e l e c t )
else
{
agentMatrix . setValue ( layer , 3 , j , 0 . 0 ) ;
if
( b a s i c N e t M a t r i x . getEmpty ( l a y e r , 5 , j ) )
basicNetMatrix . setValue ( layer , 5 , j , 0 . 0 ) ;
} //end
int
totOrder1 = ( i n t ) basicNetMatrix . getValue ( layer , 4 , j ) ;
int
totOrder2 = ( i n t ) basicNetMatrix . getValue ( layer , 5 , j ) ;
int
totOrder = totOrder1 + totOrder2 ;
basicNetMatrix . setValue ( layer , 6 , j , totOrder ) ;
} //end i f ( c h e c k i n g
first
order )
}
}
done = t r u e ;
// The a r t i c l e can not be ordered −> done=f a l s e
APPENDICE
186
} // end c1909
/∗ ∗ c o m p u t a t i o n a l o p e r a t i o n s w i t h code −1910 < br><br>
∗
This c o m p u t a t i o n a l code p r i n t s t h e Report and s t o p s t h e s i m u l a t i o n .
∗
∗
∗/
public
void c1910 ( )
{
checkMatrixes (1910 ,2);
d e s i g n M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 0 ) ;
b a s i c N e t M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 1 ) ;
l a y e r = pendingComputationalSpecificationSet . getOrderLayer ( ) ;
try
{
r e p o r t = new MyWriter ( " l o g / r e p o r t . t x t " ) ;
report .
w r i t e ( " L a y e r ␣ | ␣ MetaSampleN ␣ | ␣ S t a t u s 0 ␣ | ␣ S t a t u s 1 ␣ | ␣ S t a t u s 2 ␣ | ␣ S t a t u s 3 ␣ | ␣ S t a t u s ␣ 4 ␣ ␣ ␣ \ n" ) ;
}
catch ( IOException e )
{
System . o u t . p r i n t l n ( e ) ;
MyExit . e x i t ( 1 ) ;
}
for ( int
l n = 1 ; l n <=16; l n ++)
{
i n t metaSamplesN =0;
int [ ]
status ;
s t a t u s = new i n t [ 5 ] ;
for ( int
s = 0 ; s <=4; s++)
status [ s ]=0;
i f ( ! d e s i g n M a t r i x . getEmpty ( l n , 0 , 0 ) )
metaSamplesN = ( i n t ) d e s i g n M a t r i x . g e t V a l u e ( l n , 0 , 0 ) ;
for ( int
i t e m = 1 ; item <=150; i t e m++)
{
i f ( ! b a s i c N e t M a t r i x . getEmpty ( l n , 2 , i t e m ) )
s t a t u s [ ( i n t ) basicNetMatrix . getValue ( ln , 2 ,
item )]++;
}
String
t e x t = l n + " ␣ | ␣ " + metaSamplesN + " ␣ | ␣ " + s t a t u s [ 0 ] + " ␣ | ␣ " + s t a t u s [ 1 ]
+ " ␣ | ␣ " + s t a t u s [ 2 ] + " ␣ | ␣ " + s t a t u s [ 3 ] + " ␣ | ␣ " + s t a t u s [ 4 ] + " ␣\ n" ;
try
{
report . write ( text ) ;
}
catch ( IOException e )
{
System . o u t . p r i n t l n ( e ) ;
MyExit . e x i t ( 1 ) ;
APPENDICE
187
}
}
try
{
report . close ( ) ;
}
catch ( IOException e )
{
System . o u t . p r i n t l n ( e ) ;
MyExit . e x i t ( 1 ) ;
}
System . o u t . p r i n t l n ( " ∗∗∗∗∗␣THIS␣ I S ␣THE␣END! ␣ ∗ ∗ ∗ ∗ ∗ " ) ;
StartESFrame . eSFrameObserverSwarm . g e t C o n t r o l P a n e l ( ) . s e t S t a t e S t o p p e d ( ) ;
done = t r u e ;
} //end c1910
/∗ ∗ c o m p u t a t i o n a l o p e r a t i o n s w i t h code −1913 < br><br>
∗
This c o m p u t a t i o n a l code d i s t r i b u t e s
∗
items to the
licensees .
∗
∗/
public
void c1913 ( )
{
checkMatrixes (1913 ,2);
d e s i g n M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 0 ) ;
b a s i c N e t M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 1 ) ;
l a y e r = pendingComputationalSpecificationSet . getOrderLayer ( ) ;
int
if
counter = getCounter ( basicNetMatrix , 2 ) ;
( ! d e s i g n M a t r i x . getEmpty ( l a y e r , 0 , 0 ) )
{
i f ( c o u n t e r <= d e s i g n M a t r i x . g e t V a l u e ( l a y e r , 0 , 0 ) )
{
//Check i f
item has been produced
i f ( basicNetMatrix . getValue ( layer , 2 , counter ) > 2)
{
System . o u t . p r i n t l n ( " Item␣␣#" + c o u n t e r + " ␣ w i t h ␣ l a y e r ␣#" + l a y e r
+ " ␣ h a s ␣ been ␣ d e l i v e r e d " ) ;
basicNetMatrix . setValue ( layer , 2 , counter , 4 . 0 ) ;
}
}
}
done = t r u e ;
} //end c1913
// ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
// P r i v a t e f u n c t i o n s
// ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
APPENDICE
//The c o u n t e r
188
i s used i n some c o m p u t a t i o n l code i n o r d e r t o t a k e a c t i o n s
// on d i f f e r e n t
private
int
article
with only a recipe
g e t C o u n t e r ( MemoryMatrix c u r r e n t M a t r i x ,
i n t row )
{
// Zeroing t h e c o u n t e r
i f empty
i f ( c u r r e n t M a t r i x . getEmpty ( l a y e r , row , 0 ) )
c u r r e n t M a t r i x . s e t V a l u e ( l a y e r , row , 0 , 0 . 0 ) ;
//Here we increment t h e c o u n t e r
int
c o u n t e r = ( i n t ) c u r r e n t M a t r i x . g e t V a l u e ( l a y e r , row , 0 ) ;
c o u n t e r ++;
//The c o u n t e r must be l e s s than t h e number o f MetaSample
i f ( c o u n t e r <= d e s i g n M a t r i x . g e t V a l u e ( l a y e r , 0 , 0 ) )
c u r r e n t M a t r i x . s e t V a l u e ( l a y e r , row , 0 , c o u n t e r ) ;
return
counter ;
}
private
v o i d c h e c k M a t r i x e s ( i n t code ,
int
numberOfMatrixes )
{
i f ( pendingComputationalSpecificationSet .
getNumberOfMemoryMatrixesToBeUsed ( ) ! = numberOfMatrixes )
{
System . o u t . p r i n t l n ( " Code␣−"+ c o d e + " ␣ r e q u i r e s ␣ " + numberOfMatrixes + " ␣ m a t r i x ; ␣ "
+ p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t . getNumberOfMemoryMatrixesToBeUsed ( )
+ " ␣ f o u n d ␣ i n ␣ o r d e r ␣#␣" +
p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t . getOrderNumber ( ) ) ;
MyExit . e x i t ( 1 ) ;
}
}
private
v o i d logOpen ( b o o l e a n
eraseFile ,
String
fileName )
{
File
f i l e O u t = new F i l e ( f i l e N a m e ) ;
i f ( ! t h i s . g r o s s S a l e s L o g F i l e O p e n && e r a s e F i l e )
{
try
{
FileWriter
erase
= new F i l e W r i t e r ( f i l e O u t ,
false );
erase . close ( ) ;
}
catch ( IOException e )
{
System . o u t . p r i n t l n ( e ) ;
MyExit . e x i t ( 1 ) ;
}
}
try
{
g r o s s S a l e s L o g = new F i l e W r i t e r ( f i l e O u t ,
this . grossSalesLogFileOpen = true
true ) ;
;
}
catch ( IOException e )
{
System . o u t . p r i n t l n ( e ) ;
MyExit . e x i t ( 1 ) ;
}
}
}
§
­
¦
APPENDICE
189
Caso 3
Listing 6.10: ComputationalAssembler.java Caso 3
¨
//
ComputationalAssembler . j a v a
i m p o r t swarm . G l o b a l s ;
i m p o r t swarm . d e f o b j . Zone ;
i m p o r t swarm . o b j e c t b a s e . SwarmObjectImpl ;
i m p o r t swarm . c o l l e c t i o n s . L i s t I m p l ;
i m p o r t swarm . c o l l e c t i o n s . L i s t I n d e x ;
i m p o r t swarm . random . N o r m a l D i s t I m p l ;
import java . lang . Float ;
import java . i o . ∗ ;
import java . u t i l . ∗ ;
/∗ ∗
∗ The ComputationalAssembler c l a s s
i n s t a n c e s make
∗ c o m p u t a t i o n a l p r o c e s s e s ; we have a computationa a s s e m b l e r i n s t a n c e f o r
∗ each u n i t
∗
∗
∗ @author<b r/>
∗ Marco Lamieri<a h r e f="m a i l t o : lamieri@econ . u n i t o . i t "></a></br>
∗ Francesco Merlo<a h r e f="m a i l t o : merlo@econ . u n i t o . i t "></a></br>
∗ @version 0 . 9 . 7 . 3 1 . b ( BasicJVE 1 . 0 )
∗/
public
class
ComputationalAssembler extends ComputationalAssemblerBasic
{
//Our MemoryMatrixes
MemoryMatrix d e s i g n M a t r i x ,
//A normal d i s t r i b u t i o n
basicNetMatrix , tcMatrix , orMatrix ,
agentMatrix ;
f o r random numbers
N o r m a l D i s t I m p l normal ;
// g r o s s S a l e s
public
F i l e management
boolean
FileWriter
grossSalesLogFileOpen = f a l s e ;
g r o s s S a l e s L o g=n u l l ;
i n t samplesN =0;
float
sampleSales = 0;
float
itemSales = 0;
p u b l i c MyWriter r e p o r t=n u l l ;
/∗ ∗
∗ the constructor
f o r ComputationalAssembler
∗/
public
C o m p u t a t i o n a l A s s e m b l e r ( Zone aZone ,
O r d e r D i s t i l l e r od , ESFrameModelSwarm mo)
{
// C a l l t h e c o n s t r u c t o r
f o r the parent c l a s s .
s u p e r ( aZone , od , mo ) ;
normal = new N o r m a l D i s t I m p l ( g e t Z o n e ( ) ) ;
}
// ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
// BasicJES Computational codes
// ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
/∗ ∗ c o m p u t a t i o n a l o p e r a t i o n s w i t h code −1901 < br><br>
∗
∗
this
∗
unique r e c e i v e d matrix and s e t
c o m p u t a t i o n a l code increment 1 by 1 p o s i t i o n 0 , 0 o f t h e
the
status
t o done
APPENDICE
190
∗/
public
void c1901 ( )
{
checkMatrixes (1901 ,1);
d e s i g n M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 0 ) ;
l a y e r = pendingComputationalSpecificationSet . getOrderLayer ( ) ;
// Zeroing t h e c o u n t e r
i f empty
i f ( d e s i g n M a t r i x . getEmpty ( l a y e r , 0 , 0 ) )
designMatrix . setValue ( layer , 0 , 0 , 0 . 0 ) ;
int
counter = ( i n t ) designMatrix . getValue ( layer , 0 , 0 ) ;
c o u n t e r ++;
//Here we s t o r e t h e number o f MetaSample produced
designMatrix . setValue ( layer ,0 ,0 , counter ) ;
System . o u t . p r i n t l n ( " MetaSample␣#" + c o u n t e r + " ␣ w i t h ␣ l a y e r ␣#" + l a y e r
+ " ␣ h a s ␣ been ␣ drawn " ) ;
done=t r u e ;
}
// end c1901
/∗ ∗ c o m p u t a t i o n a l o p e r a t i o n s w i t h code −1902 < br><br>
∗
this
∗
c o m p u t a t i o n a l code d i a l
with licensee ’ s p r e d i c t i o n s .
∗
∗/
public
void c1902 ( )
{
checkMatrixes (1902 ,2);
d e s i g n M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 0 ) ;
a g e n t M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 1 ) ;
l a y e r=p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t . g e t O r d e r L a y e r ( ) ;
// Making p r e d i c t i o n
for
a v a i l a b l e MetaSample
i f ( ! d e s i g n M a t r i x . getEmpty ( l a y e r , 0 , 0 ) )
{
// S w i t c h i n g t o an o t h e r
int
//The l i c e n s e e
int
prediction
f o r e c a s t = ( i n t ) normal . g e t S a m p l e W i t h M e a n $ w i t h V a r i a n c e ( 5 0 0 , 9 0 0 0 0 0 ) ;
//Min v a l u e
if
( f o r e c a s t < 10)
forecast = 10;
//Max v a l u e
if
article
j = getCounter ( agentMatrix , 1 ) ;
( f o r e c a s t > 25000)
f o r e c a s t = 25000;
// S t o r i n g t h e p r e d i c t i o n
APPENDICE
191
agentMatrix . setValue ( layer , 1 , j , f o r e c a s t ) ;
System . o u t . p r i n t l n ( " L i c e n s e e ␣#" + myUnit . getUnitNumber ( ) + " ␣ f o r e c a s t e d ␣ " + f o r e c a s t
+ " ␣ f o r ␣ MetaSample␣#" + j + " ␣ w i t h ␣ l a y e r ␣#" + l a y e r ) ;
// End o f
predictions
done=t r u e ;
}
// Waiting f o r some MetaSample −> done=f a l s e
}
// end c1902
/∗ ∗ c o m p u t a t i o n a l o p e r a t i o n s w i t h code −1903 < br><br>
∗
this
∗
c o m p u t a t i o n a l code sums up p r e d i c t i o n s .
∗
∗/
public
void c1903 ( )
{
f l o a t sum = 0 ;
int
threshold = 18000;
boolean endForecast = true ;
checkMatrixes (1901 ,37);
d e s i g n M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 0 ) ;
b a s i c N e t M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 3 6 ) ;
l a y e r = pendingComputationalSpecificationSet . getOrderLayer ( ) ;
// G e t t i n g t h e number o f
int
articles
counter = ( i n t ) designMatrix . getValue ( layer , 0 , 0 ) ;
for ( int
j = 1 ; j <= c o u n t e r
;
j ++)
{
for ( int
t = 1 ; t < = 3 5 ; t++)
{
MemoryMatrix a g e n t M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( t ) ;
// Checking
if
the
l i c e n s e e made a p r e d i c t i o n
for
t h i s MetaSample
i f ( ! ( a g e n t M a t r i x . getEmpty ( l a y e r , 1 , j ) ) )
{
sum = sum + a g e n t M a t r i x . g e t V a l u e ( l a y e r , 1 , j ) ;
}
}
// S t o r i n g
total
p r e d i c t i o n s i n b a s i c N e t Matrix
b a s i c N e t M a t r i x . s e t V a l u e ( l a y e r , 1 , j , sum ) ;
// Checking
if
i f MetaSample can be produced
( sum > t h r e s h o l d )
{
basicNetMatrix . setValue ( layer , 2 , j , 1 ) ;
System . o u t . p r i n t l n ( " MetaSample␣#" + j + " ␣ w i t h ␣ l a y e r ␣#" + l a y e r
+ " ␣ can ␣ be ␣ produced , ␣ f o r e c a s t=" + sum + " ␣ s t a t u s =1" ) ;
}
else
{
basicNetMatrix . setValue ( layer , 2 , j , 0 ) ;
APPENDICE
192
System . o u t . p r i n t l n ( " MetaSample␣#" + j + " ␣ w i t h ␣ l a y e r ␣#" + l a y e r
+ " ␣ can ␣NOT␣ be ␣ produced , ␣ f o r e c a s t=" + sum + " ␣ s t a t u s =0" ) ;
}
// Waiting
for ( int
all
predictions
t = 1 ; t < = 3 5 ; t++)
{
MemoryMatrix a g e n t M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( t ) ;
i f ( a g e n t M a t r i x . getEmpty ( l a y e r , 1 , j ) )
endForecast = f a l s e ;
}
if
( endForecast )
{
System . o u t . p r i n t l n ( " MetaSample␣#" + j + " ␣ w i t h ␣ l a y e r ␣#" + l a y e r
+ " ␣ f o r e c a s t e d ␣ by ␣ a l l ␣ l i c e n s e e " ) ;
done=t r u e ;
}
sum = 0 ;
}
}
// end c1903
/∗ ∗ c o m p u t a t i o n a l o p e r a t i o n s w i t h code −1904 < br><br>
∗
∗
this
∗
s e t 1 t o row 2 matrix i n pos 1 ∗
c o m p u t a t i o n a l code check t r e s h o l d and i f
∗
1 cell
∗
whit a counter in p o s i t i o n ( 0 , 1 )
above
and s e t done=t r u e .
f o r each number o f row read i n matrix i n pos 0 ( 0 , 0 ) ,
∗/
public
void c1904 ( )
{
float
val ;
checkMatrixes (1904 ,2);
d e s i g n M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 0 ) ;
b a s i c N e t M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 1 ) ;
l a y e r = pendingComputationalSpecificationSet . getOrderLayer ( ) ;
// S w i t c h i n g t o an o t h e r
int
article
i = getCounter ( basicNetMatrix , 1 ) ;
// check t h e number o f i t e m s and t h e
status
i f ( ! d e s i g n M a t r i x . getEmpty ( l a y e r , 0 , 0 ) & & ! b a s i c N e t M a t r i x . getEmpty ( l a y e r , 2 , i ) )
{
i f ( i <= d e s i g n M a t r i x . g e t V a l u e ( l a y e r , 0 , 0 ) & & b a s i c N e t M a t r i x . g e t V a l u e ( l a y e r , 2 , i ) = = 1 )
{
System . o u t . p r i n t l n ( " U n i t␣#" + myUnit . getUnitNumber ( ) + " ␣ p r o d u c e d ␣ MetaSample␣#"
+ i + " ␣ w i t h ␣ l a y e r ␣#" + l a y e r + " , ␣ s t a t u s =2" ) ;
basicNetMatrix . setValue ( layer , 2 , i , 2 ) ;
done=t r u e ;
}
APPENDICE
193
else
{
System . o u t . p r i n t l n ( " U n i t␣#" + myUnit . getUnitNumber ( ) + " ␣NOT␣ p r o d u c e d ␣ MetaSample␣#"
+ i + " ␣ w i t h ␣ l a y e r ␣#" + l a y e r + " , ␣ s t a t u s =1" ) ;
}
}
}
// end c1904
/∗ ∗ c o m p u t a t i o n a l o p e r a t i o n s w i t h code −1905 < br><br>
∗
∗ This c o m p u t a t i o n a l code d i a l s
w i t h TC o f f e r −p r i c e
∗/
public
void c1905 ( )
{
float
o f f e r P r i c e , random ;
checkMatrixes (1905 ,3);
d e s i g n M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 0 ) ;
basicNetMatrix
= ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 1 ) ;
t c M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 2 ) ;
l a y e r = pendingComputationalSpecificationSet . getOrderLayer ( ) ;
//Making an o f f e r −p r i c e
for
available
articles
i f ( ! d e s i g n M a t r i x . getEmpty ( l a y e r , 0 , 0 ) )
{
int
counter = ( i n t ) designMatrix . getValue ( layer , 0 , 0 ) ;
for ( int
i = 1 ; i <=c o u n t e r ;
i ++)
{
i f ( ! b a s i c N e t M a t r i x . getEmpty ( l a y e r , 2 , i ) )
{
i f ( basicNetMatrix . getValue ( layer , 2 , i ) > 0)
{
//The o f f e r −p r i c e
o f f e r P r i c e = ( i n t ) normal . g e t S a m p l e W i t h M e a n $ w i t h V a r i a n c e ( 7 , 1 0 ) ;
//Min v a l u e
if
( o f f e r P r i c e <1)
offerPrice = 1;
//Max v a l u e
if
( o f f e r P r i c e >20)
o f f e r P r i c e =20;
// S t o r i n g t h e o f f e r −p r i c e o f t h e TC
tcMatrix . setValue ( layer , 1 , i ,
offerPrice );
System . o u t . p r i n t l n ( " U n i t␣#" + myUnit . getUnitNumber ( )
+ " ␣ o f f e r ␣ p r i c e ␣ f o r ␣ MetaSample␣#" + i + " ␣ w i t h ␣ l a y e r ␣#" + l a y e r + " ␣ i s ␣ $ "
+ offerPrice );
}
else
System . o u t . p r i n t l n ( " U n i t␣#" + myUnit . getUnitNumber ( )
+ " ␣ can ␣ n o t ␣make␣ an ␣ o f f e r ␣ f o r ␣ Metasample␣#" + i
}
}
+ " ␣ w i t h ␣ l a y e r ␣#" + l a y e r
);
APPENDICE
194
done=t r u e ;
}
// Waiting f o r some MetaSample −> done=f a l s e
}
// end c1905
/∗ ∗ c o m p u t a t i o n a l o p e r a t i o n s w i t h code −1906 < br><br>
∗ This c o m p u t a t i o n a l code d i a l
w i t h t h e b i d d i n g phase
∗/
public
void c1906 ( )
{
MemoryMatrix c h o i c e M a t r i x ;
checkMatrixes (1906 ,8);
d e s i g n M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 0 ) ;
b a s i c N e t M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 6 ) ;
o r M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 7 ) ;
l a y e r = pendingComputationalSpecificationSet . getOrderLayer ( ) ;
// Checking MetaSamples
i f ( ! d e s i g n M a t r i x . getEmpty ( l a y e r , 0 , 0 ) )
{
int
counter = ( i n t ) designMatrix . getValue ( layer , 0 , 0 ) ;
for ( int
i = 1 ; i <=c o u n t e r ;
i ++)
{
int
choice = 0;
float
o f f e r =0;
// Checking t h e
status
i f ( ! b a s i c N e t M a t r i x . getEmpty ( l a y e r , 2 , i ) )
{
i f ( basicNetMatrix . getValue ( layer , 2 , i ) > 0)
{
//Here we make t h e b i d d i n g
for ( int
t = 1 ; t < = 5 ; t++)
{
MemoryMatrix t c M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( t ) ;
i f ( ! t c M a t r i x . getEmpty ( l a y e r , 1 , i ) )
{
i f ( tcMatrix . getValue ( layer , 1 , i ) < o f f e r
||
o f f e r ==0)
{
o f f e r = tcMatrix . getValue ( layer , 1 , i ) ;
choice = t ;
}
}
}
// Checking t h e TC chosen
i f ( ! b a s i c N e t M a t r i x . getEmpty ( l a y e r , 2 , i ) )
{
i f ( b a s i c N e t M a t r i x . g e t V a l u e ( l a y e r , 2 , i ) > 0 & & ( ! ( c h o i c e ==0)))
{
// G e t t i n g
its
offer
price
...
APPENDICE
195
c h o i c e M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( c h o i c e ) ;
float
o f f e r P r i c e = choiceMatrix . getValue ( layer , 1 , i ) ;
// . . .
storing
it
i n b a s i c N e t Matrix
...
basicNetMatrix . setValue ( layer , 3 , i , o f f e r P r i c e ) ;
// . . . and i n t h e orMatrix
orMatrix . setValue ( layer , 1 , i , choice ) ;
System . o u t . p r i n t l n ( " T r a d i n g ␣Company␣#" + o r M a t r i x . g e t V a l u e ( l a y e r , 1 , i )
+ " ␣ h a s ␣ been ␣ c h o s e n ␣ f o r ␣ MetaSample␣#" + i + " ␣ w i t h ␣ l a y e r ␣#" + l a y e r + " ␣ p r i c e ␣ "
+ basicNetMatrix . getValue ( layer , 3 , i ) ) ;
}
}
}
}
}
done=t r u e ;
}
// Waiting f o r some MetaSample −> done=f a l s e
}
// end c1906
/∗ ∗ c o m p u t a t i o n a l o p e r a t i o n s w i t h code −1907 < br><br>
∗
this
∗
c o m p u t a t i o n a l code d i a l
with licensee ’ s
first
order .
∗
∗/
public
void c1907 ( )
{
checkMatrixes (1907 ,3);
d e s i g n M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 0 ) ;
a g e n t M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 1 ) ;
b a s i c N e t M a t r i x =(MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 2 ) ;
l a y e r = pendingComputationalSpecificationSet . getOrderLayer ( ) ;
i f ( ! d e s i g n M a t r i x . getEmpty ( l a y e r , 0 , 0 ) )
{
int
if
j = getCounter ( agentMatrix , 2 ) ;
( ! b a s i c N e t M a t r i x . getEmpty ( l a y e r , 2 , j ) )
{
//Check i f
if
the
licensee
received the
r e l a t e d MetaSample
( b a s i c N e t M a t r i x . g e t V a l u e ( l a y e r , 2 , j ) >1)
{
int
o r d e r 1 = ( i n t ) normal . g e t S a m p l e W i t h M e a n $ w i t h V a r i a n c e ( 5 0 0 , 9 0 0 0 0 0 ) ;
//Min v a l u e
if
( o r d e r 1 <10)
order1 = 10;
//Max v a l u e
if
( o r d e r 1 >25000)
order1 = 25000;
agentMatrix . setValue ( layer , 2 , j , order1 ) ;
APPENDICE
if
196
( b a s i c N e t M a t r i x . getEmpty ( l a y e r , 4 , j ) )
basicNetMatrix . setValue ( layer , 4 , j , 0 . 0 ) ;
int
totOrder1 = ( i n t ) basicNetMatrix . getValue ( layer , 4 , j ) + order1 ;
basicNetMatrix . setValue ( layer , 4 , j , totOrder1 ) ;
System . o u t . p r i n t l n ( "The ␣1 s t ␣ o r d e r ␣ o f ␣ L i c e n s e e ␣#" + myUnit . getUnitNumber ( ) + " ␣ i s ␣ "
+ o r d e r 1 + " ␣ f o r ␣ i t e m␣#" + j + " ␣ w i t h ␣ l a y e r ␣#" + l a y e r + " ␣ t o t O r d e r␣#"+t o t O r d e r 1 ) ;
done=t r u e ;
}
// The a r t i c l e can not be ordered −> done=f a l s e
}
}
}
// end c1907
/∗ ∗ c o m p u t a t i o n a l o p e r a t i o n s w i t h code −1908 < br><br>
∗
this
∗
c o m p u t a t i o n a l code d i a l
w i t h or branch c h o i c e .
∗
∗/
public
void c1908 ( )
{
checkMatrixes (1908 ,3);
d e s i g n M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 0 ) ;
b a s i c N e t M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 1 ) ;
o r M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 2 ) ;
l a y e r = pendingComputationalSpecificationSet . getOrderLayer ( ) ;
i f ( ! d e s i g n M a t r i x . getEmpty ( l a y e r , 0 , 0 ) )
{
// S w i t c h i n g t o another
int
article
i = getCounter ( orMatrix , 0 ) ;
i f ( i <= d e s i g n M a t r i x . g e t V a l u e ( l a y e r , 0 , 0 ) )
{
i f ( ! b a s i c N e t M a t r i x . getEmpty ( l a y e r , 2 , i ) )
{
//Check i f
t h e item can be produced ( s t a t u s >1)
i f ( b a s i c N e t M a t r i x . g e t V a l u e ( l a y e r , 2 , i ) > 1 & & ! o r M a t r i x . getEmpty ( l a y e r , 1 , i ) )
{
float
branch = orMatrix . getValue ( l a y e r , 1 , i ) ;
orMatrix . s e t V a l u e ( l a y e r , 1 , 0 , branch ) ;
System . o u t . p r i n t l n ( " Branch␣␣#" + o r M a t r i x . g e t V a l u e ( l a y e r , 1 , 0 )
+ " ␣ p r o d u c e d ␣ i t e m␣#" + i + " ␣ w i t h ␣ l a y e r ␣#" + l a y e r ) ;
basicNetMatrix . setValue ( layer , 2 , i , 3 . 0 ) ;
done = t r u e ;
}
}
// The a r t i c l e can not be produced −> done=f a l s e
APPENDICE
197
}
}
}
//end c1908
/∗ ∗ c o m p u t a t i o n a l o p e r a t i o n s w i t h code −1909 < br><br>
∗
this
∗
c o m p u t a t i o n a l code d i a l
w i t h l i c e n s e e ’ s second o r d e r .
∗
∗/
public
void c1909 ( )
{
int
threshold = 100;
checkMatrixes (1909 ,3);
d e s i g n M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 0 ) ;
a g e n t M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 1 ) ;
b a s i c N e t M a t r i x =(MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 2 ) ;
l a y e r = pendingComputationalSpecificationSet . getOrderLayer ( ) ;
int
if
j = getCounter ( agentMatrix , 3 ) ;
( ! d e s i g n M a t r i x . getEmpty ( l a y e r , 0 , 0 ) )
{
if
( j <= d e s i g n M a t r i x . g e t V a l u e ( l a y e r , 0 , 0 ) )
{
// Checks
if
if
the
l i c e n s e e has a l r e a d y done t h e
first
order
( ! a g e n t M a t r i x . getEmpty ( l a y e r , 2 , j ) )
{
int
s e l e c t = ( i n t ) normal . g e t S a m p l e W i t h M e a n $ w i t h V a r i a n c e ( 1 0 0 , 5 0 0 0 0 ) ;
// d e c i d e t o do or not another o r d e r
if
( select > threshold )
{
int
o r d e r 2 = ( i n t ) normal . g e t S a m p l e W i t h M e a n $ w i t h V a r i a n c e ( 5 0 0 , 9 0 0 0 0 0 ) ;
//Min v a l u e
if
( o r d e r 2 <10)
order2 = 10;
//Max v a l u e
if
( o r d e r 2 >25000)
order2 = 25000;
agentMatrix . setValue ( layer , 3 , j , order2 ) ;
if
( b a s i c N e t M a t r i x . getEmpty ( l a y e r , 5 , j ) )
basicNetMatrix . setValue ( layer , 5 , j , 0 . 0 ) ;
int
totOrder2 = ( i n t )
basicNetMatrix . getValue ( layer , 5 , j ) + order2 ;
basicNetMatrix . setValue ( layer , 5 , j , totOrder2 ) ;
System . o u t . p r i n t l n ( "The ␣2 nd␣ o r d e r ␣ o f ␣ L i c e n s e e ␣#" + myUnit . getUnitNumber ( )
APPENDICE
198
+ " ␣ i s ␣ " + o r d e r 2 + " ␣ f o r ␣ i t e m␣#" + j + " ␣ w i t h ␣ l a y e r ␣#" + l a y e r + " ␣ t o t O r d e r␣#"
+ totOrder2 ) ;
} //end i f ( s e l e c t )
else
{
agentMatrix . setValue ( layer , 3 , j , 0 . 0 ) ;
if
( b a s i c N e t M a t r i x . getEmpty ( l a y e r , 5 , j ) )
basicNetMatrix . setValue ( layer , 5 , j , 0 . 0 ) ;
} //end e l s e
int
totOrder1 = ( i n t ) basicNetMatrix . getValue ( layer , 4 , j ) ;
int
totOrder2 = ( i n t ) basicNetMatrix . getValue ( layer , 5 , j ) ;
int
totOrder = totOrder1 + totOrder2 ;
basicNetMatrix . setValue ( layer , 6 , j , totOrder ) ;
} //end i f ( c h e c k i n g
first
order )
}
}
done = t r u e ;
// The a r t i c l e can not be ordered −> done=f a l s e
} // end c1909
/∗ ∗ c o m p u t a t i o n a l o p e r a t i o n s w i t h code −1910 < br><br>
∗
This c o m p u t a t i o n a l code p r i n t s t h e Report and s t o p s t h e s i m u l a t i o n .
∗
∗
∗/
public
void c1910 ( )
{
checkMatrixes (1910 ,2);
d e s i g n M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 0 ) ;
b a s i c N e t M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 1 ) ;
l a y e r = pendingComputationalSpecificationSet . getOrderLayer ( ) ;
try
{
r e p o r t = new MyWriter ( " l o g / r e p o r t . t x t " ) ;
report .
w r i t e ( " L a y e r ␣ | ␣ MetaSampleN ␣ | ␣ S t a t u s 0 ␣ | ␣ S t a t u s 1 ␣ | ␣ S t a t u s 2 ␣ | ␣ S t a t u s 3 ␣ | ␣ S t a t u s ␣ 4 ␣ ␣ \ n" ) ;
}
catch ( IOException e )
{
System . o u t . p r i n t l n ( e ) ;
MyExit . e x i t ( 1 ) ;
}
for ( int
{
l n = 1 ; l n <=16; l n ++)
APPENDICE
199
i n t metaSamplesN =0;
int [ ]
status ;
s t a t u s = new i n t [ 5 ] ;
for ( int
s = 0 ; s <=4; s++)
status [ s ]=0;
i f ( ! d e s i g n M a t r i x . getEmpty ( l n , 0 , 0 ) )
metaSamplesN = ( i n t ) d e s i g n M a t r i x . g e t V a l u e ( l n , 0 , 0 ) ;
for ( int
i t e m = 1 ; item <=150; i t e m++)
{
i f ( ! b a s i c N e t M a t r i x . getEmpty ( l n , 2 , i t e m ) )
s t a t u s [ ( i n t ) basicNetMatrix . getValue ( ln , 2 ,
item )]++;
}
String
t e x t = l n + " ␣ | ␣ " + metaSamplesN + " ␣ | ␣ " + s t a t u s [ 0 ] + " ␣ | ␣ " + s t a t u s [ 1 ]
+ " ␣ | ␣ " + s t a t u s [ 2 ] + " ␣ | ␣ " + s t a t u s [ 3 ] + " ␣ | ␣ " + s t a t u s [ 4 ] + " ␣\ n" ;
try
{
report . write ( text ) ;
}
catch ( IOException e )
{
System . o u t . p r i n t l n ( e ) ;
MyExit . e x i t ( 1 ) ;
}
}
try
{
report . close ( ) ;
}
catch ( IOException e )
{
System . o u t . p r i n t l n ( e ) ;
MyExit . e x i t ( 1 ) ;
}
System . o u t . p r i n t l n ( " ∗∗∗∗∗␣THIS␣ I S ␣THE␣END! ␣ ∗ ∗ ∗ ∗ ∗ " ) ;
StartESFrame . eSFrameObserverSwarm . g e t C o n t r o l P a n e l ( ) . s e t S t a t e S t o p p e d ( ) ;
done = t r u e ;
} //end c1910
/∗ ∗ c o m p u t a t i o n a l o p e r a t i o n s w i t h code −1913 < br><br>
∗
This c o m p u t a t i o n a l code d i s t r i b u t e s
∗
items to the
licensees .
∗
∗/
public
void c1913 ( )
{
checkMatrixes (1913 ,2);
d e s i g n M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
getMemoryMatrixAddress ( 0 ) ;
b a s i c N e t M a t r i x = ( MemoryMatrix ) p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t .
APPENDICE
200
getMemoryMatrixAddress ( 1 ) ;
l a y e r = pendingComputationalSpecificationSet . getOrderLayer ( ) ;
int
if
counter = getCounter ( basicNetMatrix , 2 ) ;
( ! d e s i g n M a t r i x . getEmpty ( l a y e r , 0 , 0 ) )
{
i f ( c o u n t e r <= d e s i g n M a t r i x . g e t V a l u e ( l a y e r , 0 , 0 ) )
{
//Check i f
item has been produced
i f ( basicNetMatrix . getValue ( layer , 2 , counter ) > 2)
{
System . o u t . p r i n t l n ( " Item␣␣#" + c o u n t e r + " ␣ w i t h ␣ l a y e r ␣#" + l a y e r
+ " ␣ h a s ␣ been ␣ d e l i v e r e d " ) ;
basicNetMatrix . setValue ( layer , 2 , counter , 4 . 0 ) ;
}
}
}
done = t r u e ;
} //end c1913
// ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
// P r i v a t e f u n c t i o n s
// ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
//The c o u n t e r
i s used i n some c o m p u t a t i o n l code i n o r d e r t o t a k e a c t i o n s
// on d i f f e r e n t
private
int
article
with only a recipe
g e t C o u n t e r ( MemoryMatrix c u r r e n t M a t r i x ,
i n t row )
{
// Zeroing t h e c o u n t e r
i f empty
i f ( c u r r e n t M a t r i x . getEmpty ( l a y e r , row , 0 ) )
c u r r e n t M a t r i x . s e t V a l u e ( l a y e r , row , 0 , 0 . 0 ) ;
//Here we increment t h e c o u n t e r
int
c o u n t e r = ( i n t ) c u r r e n t M a t r i x . g e t V a l u e ( l a y e r , row , 0 ) ;
c o u n t e r ++;
//The c o u n t e r must be l e s s than t h e number o f MetaSample
i f ( c o u n t e r <= d e s i g n M a t r i x . g e t V a l u e ( l a y e r , 0 , 0 ) )
c u r r e n t M a t r i x . s e t V a l u e ( l a y e r , row , 0 , c o u n t e r ) ;
return
counter ;
}
private
v o i d c h e c k M a t r i x e s ( i n t code ,
int
numberOfMatrixes )
{
i f ( pendingComputationalSpecificationSet .
getNumberOfMemoryMatrixesToBeUsed ( ) ! = numberOfMatrixes )
{
System . o u t . p r i n t l n ( " Code␣−"+ c o d e + " ␣ r e q u i r e s ␣ " + numberOfMatrixes + " ␣ m a t r i x ; ␣ "
+ p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t . getNumberOfMemoryMatrixesToBeUsed ( )
+ " ␣ f o u n d ␣ i n ␣ o r d e r ␣#␣" + p e n d i n g C o m p u t a t i o n a l S p e c i f i c a t i o n S e t . getOrderNumber ( ) ) ;
MyExit . e x i t ( 1 ) ;
}
}
APPENDICE
private
201
v o i d logOpen ( b o o l e a n
eraseFile ,
String
fileName )
{
File
f i l e O u t = new F i l e ( f i l e N a m e ) ;
i f ( ! t h i s . g r o s s S a l e s L o g F i l e O p e n && e r a s e F i l e )
{
try
{
FileWriter
erase
= new F i l e W r i t e r ( f i l e O u t ,
false );
erase . close ( ) ;
}
catch ( IOException e )
{
System . o u t . p r i n t l n ( e ) ;
MyExit . e x i t ( 1 ) ;
}
}
try
{
g r o s s S a l e s L o g = new F i l e W r i t e r ( f i l e O u t ,
this . grossSalesLogFileOpen = true
true ) ;
;
}
catch ( IOException e )
{
System . o u t . p r i n t l n ( e ) ;
MyExit . e x i t ( 1 ) ;
}
}
}
§
­
¦
Bibliografia
[1] Avvisati F.,
(2003),
Herbert A. Simon. Una microeconomia
empiricamente fondata, Università di Pisa.
[2] Axtell R., (2000), Why agents?
On the varied motivations for
agent computing in the social sciences, Center on Social and Economic
Dynamics, Working Paper no. 17.
[3] Axtell R. L., Epstein J. M., (1994), Agent-Based Modeling: understanding our creations, The Bulletin of the Santa Fe Institute, Winter
1994, pp. 28-32.
[4] Balla A., (2004), Le decisioni delle organizzazioni e la complessità.
Applicazione al caso BasicNet, Tesi di laurea in Economia e Commercio,
Università di Torino.
[5] BasicNet, http://www.basicnet.com.
[6] BasicNet, divisione Menestrello (2004), BasicNet, (documento
ad accesso riservato).
[7] BasicNet, divisione Menestrello (2002), BasicSamples.com,
(documento ad accesso riservato).
[8] BasicPress, http://www.basicpress.com.
202
BIBLIOGRAFIA
[9] Collier N., (2003), RePast: An Extensible Framework for Agent
Simulation, Social Science Research Computing, Università di Chicago.
[10] Colombatto E., (2001), Dall’impresa dei neoclassici all’imprenditore
di Kirzner, Economia Politica, XVIII, no. 2.
[11] Conte R., (1998), Il metodo simulativo, in La Ricerca Qualitativa (a
cura di Luca Ricolfi), Roma, Carocci Editore.
[12] Edmonds B., (2003), Simulation and Complexity. How they can relate,
presentato al workshop su ‘‘Virtual Worlds of Precision − Computerbased Simulations in the Natural and Social Sciences’’, Oxford, Gennaio
2003.
[13] Egidi M., (2003), Razionalità limitata, Sistemi intelligenti, XV, no. 1,
pp. 67-72.
[14] Ferraris G., (1999), Algoritmi genetici per l’economia, Tesi di laurea
in Economia e Commercio, Università di Torino.
[15] Fraquelli G., (2001), Elementi di Economia Manageriale, Torino,
UTET.
[16] Gilbert N., Terna P. (2000), How to build and use agent-based
models in social science, Mind & Society, no. 1, pp. 57-72.
[17] Huerta De Soto J., (2003), La Scuola Austriaca. Mercato e creatività imprenditoriale (a cura di Paolo Zanotto), Soveria Mannelli (CZ),
Rubbettino.
[18] Johnson P., Lancaster A., (2000), Swarm User Guide.
[19] Kilpatrick H. E. Jr., (2001), Complexity, spontaneous order, and
Friedrich Hayek: are spontaneous order and complexity essentially the
same thing?, Complexity, vol. 6, no. 4, John Willey & Sons.
203
BIBLIOGRAFIA
204
[20] Kirzner I. M., (1997), Entrepreneurial Discovery and the Competitive
Market Process: an Austrian Approach, Journal of Economic Literature,
vol. 35, no. 1, pp. 60-85.
[21] Lamieri M. (2002), Simulazione Agent Based in contesti d’impresa. Applicazione del modello Virtual Enterprise in JavaSwarm ad un’azienda
reale, Tesi di laurea in Economia e Commercio, Università di Torino.
[22] Langton C. G., (1992), Vita Artificiale (traduzione di Maurizio
Riccucci), Sistemi intelligenti, IV, no. 2, pp. 189-246.
[23] Merlo F. (2003a), L’impresa rifatta nel computer: Applicazione del
modello jES al caso BasicNet, Tesi di laurea in Economia e Commercio,
Università di Torino.
[24] Merlo F. (2003b), BasicJes:
esperimenti finali e considerazioni,
http://web.econ.unito.it/terna/jes_files/jesframe-0.9.9.20.tar.gz.
[25] Minar N., Burkhart R., Langton C., Askenazi M., (1996),
The SWARM Simulation System: a toolkit for building multi-agent
simulations, Santa Fe Institute, Working Paper.
[26] NetLogo, Home Page: http://ccl.northwestern.edu/netlogo.
[27] Ormerod P., (2003), L’economia della farfalla: società, mercato e
comportamento, Torino, Instar Libri.
[28] Parisi D., (1999), Se laboratorio è nel computer le scienze hanno
un’arma in più, Telèma, 5, pp. 28-30.
[29] RePast, Home Page: http://repast.sourceforge.net/index.php.
[30] Rosser J. B. Jr., (1999), On the complexities of complex economic
dynamics, Journal of Economic Perspective, vol. 13, no. 4, pp. 169-192.
BIBLIOGRAFIA
205
[31] Sanders I. T., McCabe J. A., (2003), The use of Complexity Science,
Washington Center for Complexity & Public Policy.
[32] Sciabarrà M., (2003) Il libro di CorsoJava.it, Versione 2.7.
[33] Simon H. A., (1985), Causalità, razionalità, organizzazione, Bologna,
Il Mulino.
[34] Simon H. A., (1958), Il comportamento amministrativo, Bologna, Il
Mulino.
[35] Swarm, Home Page: http://www.swarm.org e http://wiki.swarm.org.
[36] Terna P., (2004b), How to Use the Java Enterprise Simulator (jES) Program, http://web.econ.unito.it/terna/jes_files/jesframe0.9.9.20.tar.gz.
[37] Terna P., (2003a), La simulazione come strumento di indagine per
l’economia, Sistemi Intelligenti, XV, no. 2, pp. 347-376.
[38] Terna
tists:
of
(1998),
P.,
Building
Artificial
Agent
Societies
Simulation
Based
and
Tools
Models
Social
for
with
Simulation
Social
SWARM,
vol.
1,
ScienJournal
no.
2,
http://www.soc.surrey.ac.uk/JASSS/1/2/4.html
[39] Terna P., (2002), Simulazione ad agenti in contesti di impresa, Sistemi
intelligenti, XIV, no. 1, pp. 33-51.
[40] Terna P., (2004a), Simulazione di scelte complesse nelle organizzazioni, Ivrea, II Convegno Nazionale (2004) dell’AISC.
[41] Terna P., (2003b), The quest for the enterprise: jES, a Java Enterprise
Simulator, http://web.econ.unito.it/terna/jes.
BIBLIOGRAFIA
[42] Tinti T., (1998), La ‘‘sfida della complessità’’ verso il Terzo Millennio,
Novecento, anno 18, no. 12, pp. 7-12.
[43] Tisue S., Wilensky U., (2004), NetLogo: Design and Implementation
of a Multi-Agent Modeling Environment, Center for Connected Learning
and Computer-Based Modeling, Northwestern University (presented at
the International Conference on Complex Systems, Boston, May 16-21).
[44] Wilensky U., (1999), NetLogo 2.0.0 User Manual, Center for Connected Learning and Computer-Based Modeling, Northwestern University,
Evanston, IL.
[45] Wooldridge M., Jennings N. R., (1995), Intelligent Agents: Theory
and Practice, Knowledge Engineering Review, vol. 10, no. 2, pp. 115-152.
206