• Non ci sono risultati.

3.2 Primo Criterio: Metodo della matrice

3.2.2 Classe Test Matrix

La classe TestMatrix è utilizzata per l’implementazione dell’algoritmo (meto- do della matrice) descritto nel paragrafo precedente e per l’esecuzione della fase di analisi dei risultati mediante il metodo delle prove ripetute. La Figura 3.1 illustra un’astrazione del funzionamento della classe.

Figura 3.1: Classe TestMatrix

La fase denotata con “RITROVAMENTO MARCATURE MAGGIOR- MENTE PROBABILI” prevede l’esecuzione di un run pilota per la ricerca di un insieme di marcature caratterizzate dai più alti valori di probabilità analitica non normalizzata. Maggiori dettagli sono presenti nel paragrafo 3.2.3.

La fase di “INIZIALIZZAZIONE NUOVO RUN” comprende la costruzione della struttura di una rete di Petri stocastica e l’eliminazione del transitorio.

E’ indicata con “PASSO DI SIMULAZIONE” la fase che descrive il com- portamento dinamico della rete. In particolare vengono effettuate le fasi che rappresentano l’astrazione delle regole di enablig e di firing per un intervallo di tempo predefinito.

Il test denotato con “CRITERIO DI ARRESTO” implementa il metodo descritto nel paragrafo 3.2.1.

DATI” prevede l’aggiornamento delle strutture dati dedicate alla costruzione ed alla gestione dei campioni utilizzati per l’analisi dei dati.

Il test “RAGGIUNGIMENTO NUMERO RUN” rappresenta un conta- tore di iterazioni e verifica il raggiungimento di un numero di prove ripetute scelto inizialmente in modo arbitrario e sulla base di quanto descritto nel paragrafo 3.2.4.

La fase “COSTRUZIONE INTERVALLI DI CONFIDENZA” effettua al campione ottenuto mediante l’esecuzione delle prove ripetute un’analisi sta- tistica classica per la stima della media e della varianza di un particolare indice.

La classe implementata utilizza le seguenti strutture dati:

• Un valore intero (int) denotato con NumMark. In riferimento a quan- to descritto nel paragrafo 3.2.1, tale valore rappresenta il numero di marcature appartenenti all’insieme W .

• Un valore intero (int) denotato con NumSimulation, che indica il nu- mero degli n run i.i.d. (in riferimento al paragrafo 3.2.4) effettuati in fase di analisi dei risultati del simulatore.

• Un numero reale positivo (double) denotato con tolerance, che identi- fica un valore di tolleranza ξ scelto in modo arbitrario e descritto nel Passo 4 dell’algoritmo in paragrafo 3.2.1.

• Una matrice di valori reali (double) denotata con matrixrap, che iden- tifica la matrice Z descritta nel Passo 2 dell’algoritmo. Nel dettaglio tale matrice è caratterizzata da un numero NumMark di righe e di colonne.

• Una matrice di valori reali (double) denotata con matrixprob, carat- terizzata da un numero NumMark di righe ed un numero di colonne pari a NumSimulation. Ogni singola colonna della matrice contiene i valori delle probabilità di stato stimate da PFNetS e relative alle marcature dell’insieme W . Tali valori di probabilità sono ottenuti al termine di ciascun run di simulazione (termine dettato dal verificar- si del criterio descritto nel Passo 3 dell’algoritmo). La matrice così costruita viene utilizzata per la fase di convalida ed analisi dei risultati offerti da PFNetS.

• Un vettore di valori reali (double) denotato con vetanalitic, che iden- tifica il vettore g descritto nel Passo 1 dell’algortimo. La dimensione del vettore è pari a NumMark.

• Un vettore di valori reali (double) denotato con vetstim, che rappre- senta il vettoreπ descritto nel Passo 2 dell’algortimo. La dimensionee del vettore è pari a NumMark.

• Un vettore di stringhe (double) denotato con mk, che identifica l’in- sieme W descritto nel Passo 1 dell’algoritmo. La dimensione del vettore è pari a NumMark.

• Una hashtable denotata con mark. Tale struttura contiene lo storico dell’insieme W durante l’esecuzione dell’algoritmo per il ritrovamento delle marcature caratterizzate dai più alti valori di probabilità analitica a meno di una costante di normalizzazione G.

• Un oggetto pn che estende la classe MarkovianPetriNet e rappresenta una generica rete SPN di cui si vuole analizzare il comportamento mediante la simulazione.

La classe TestMatrix implementa i seguenti metodi:

private static double[][] builtmatrix (double tolerance, int dim, double[] probstim, double[] probmat)

Il metodo prende in ingresso un valore reale positivo tolerance che rappre- senta la tolleranza ξ scelta in modo arbitrario, un intero positivo dim che identifica la dimensione della matrice quadrata da restituire in output, un vettore probstim che identifica il vettoreπ ed infine un vettore probmat chee rappresenta il vettore g. In particolare, si applica il metodo per l’imple- mentazione del Passo 2 e per la verifica della condizione posta dal criterio di arresto descritto al Passo 3 dell’algoritmo. Tale controllo avviene mediante la chiamata al metodo ControlMatrix(matrix, tolerance), dove matrix rap- presenta la matrice quadrata Z. Il metodo ritorna il valore null se il controllo restituisce un esito negativo, restituisce la matrice matrix altrimenti.

Algoritmo 3.1 Metodo builtmatrix

private static double[][] buildmatrix(double tolerance, int dim, double[] probstim, double[] probmat){

double matrix[][] = new double[dim][dim]; boolean flag;

for (int i = 0; i < dim; i++) { for (int j = 0; j < dim; j++) {

if (i == j) {

matrix[i][j] = 1; } else {

if (probstim[i] != 0) {

matrix[i][j] = (probstim[j] / probstim[i]) * (probmat[i] / probmat[j]);

} } } }

flag = ControlMatrix(matrix, tolerance); if (flag == true) { return matrix; } else { return null; } }

private static boolean ControlMatrix (double[][] matrix, double tolerance)

Il metodo implementa il Passo 3 dell’algoritmo. Si occupa quindi di verificare che ogni elemento della matrice Z soddisfi quanto imposto dal criterio di arresto proposto. In tal caso il metodo restituisce in output il valore booleano true. Restituisce il valore booleano false altrimenti.

Algoritmo 3.2 Metodo ControlMatrix

private static boolean ControlMatrix(double[][] matrix, double tolerance) {

for (int i = 0; i < matrix.length; i++) { for (int j = 0; j < matrix.length; j++) {

if ((Math.abs(1 - matrix[i][j])) > tolerance) { return false; } } } return true; }

private static double[][] CompileMatrixProb (double[][] matrixprob, double[] vetstim, int j)

Il metodo è invocato al termine di ogni singolo j − esima run di simu- lazione ed inizializza la j − esima colonna della matrice matrixprob (passata come parametro) con i valori relativi al vettore vetstim le cui componenti rappresentano le probabilità stimate relative alle marcature dell’insieme W . La costruzione di tale matrice permette di ottenere dei campioni con i quali analizzare i risultati del simulatore PFNetS mediante il metodo delle prove ripetute.

Algoritmo 3.3 Metodo CompileMatrixProb

private static double[][] CompileMatrixProb(double[][] matrixprob, double[] vetstim, int j) {

for (int i = 0; i < NumMark; i++) { matrixprob[i][j] = vetstim[i]; }

return matrixprob; }

private static double computeMeans (double[][] matrixprob, int i)

Tale metodo prende in input la matrice matrixprob (restituita in output dal metodo CompileMatrixProb) e restituisce in output la media campionaria (indicata con X) calcolata sui valori presenti nella riga i−esima della matrice

stessa. In particolare, viene calcolata la media relativa ai valori assunti dalla i − esima marcatura dell’insieme W in ogni singolo run di simulazione.

Dato che, la fase di analisi dei dati offerti da PFNetS prevede l’utilizzo di un campione avente dimensione n ≥ 35, il metodo controlla che il numero di osservazioni (run terminati rispettando il criterio di arresto) sia maggiore di un valore minrun preso arbitrariamente in modo tale da soddisfare le condizioni imposte sulla dimensione del campione.

Algoritmo 3.4 Metodo computeMeans

private static double computeMeans(double[][] matrixprob, int i) {

int num = 0; double sum = 0.0;

for (int j = 0; j < NumSimulation; j++) { if (matrixprob[i][j] != 0.0) {

num++;

sum = sum + matrixprob[i][j]; }

} if (num >= minrun) { return sum / num; } else {

return -1.0; }

}

private static double computeVariance (double[][] matrixprob, int i, double mean)

Il metodo prende in input la matrice matrixprob (restituita in output dal

metodo CompileMatrixProb) ed un valore mean (restituito dal metodo computeMeans). Restituisce in output la varianza calcolata sui valori presenti nella riga i −

esima della matrice matrixprob utilizzando la media relativa alla stessa riga. La stima della varianza (indicata con s2(x)) rappresenta una funzione necessaria per il calcolo degli intervalli di confidenza utilizzati in fase di analisi dei risultati. In particolare per la stima della varianza è utilizzata la seguente formula: s2(x) = Pn j=1 xj− X 2 n − 1 (3.4)

dove n indica la dimensione del campione ed xicorrisponde alla j −esima osservazione del campione.

Algoritmo 3.5 Metodo computeVariance

private static double computeVariance(double[][] matrixprob, int i, double means) {

int num = 0; double sum = 0.0;

for (int j = 0; j < NumSimulation; j++) { if (matrixprob[i][j] != 0.0) {

num++;

sum = sum + Math.pow(matrixprob[i][j] - means, 2); }

}

return sum / (num - 1); }

private static double computeAmpIC (double[][] matrixprob, double mean, double variance, int i)

Tale metodo prende in input la matrice matrixprob (restituita in output dal metodo CompileMatrixProb), il valore mean (restituito dal metodo computeMeans) ed il valore variance (restituito dal metodo computeVariance).

Ritorna in output l’ampiezza dell’intervallo di confidenza calcolato a partire dai valori presenti nella riga i − esima della matrice matrixprob utilizzando la media e la varianza relative alla stessa riga.

Per la costruzione degli intervalli di confidenza si adottano livelli di confidenza pari al 95% ed al 99%.

Algoritmo 3.6 Metodo computeAmpIC

private static double computeAmpIC(double[][] matrixprob, double means, double variance, int i) {

double perc = 0.0; int num = 0; if (i == 95) { perc = 1.96; } else { perc = 2.576; }

for (int j = 0; j < NumSimulation; j++) { if (matrixprob[1][j] != 0.0) {

num++; }

}

double inf = means - perc * (Math.sqrt(variance / num)); double sup = means + perc * (Math.sqrt(variance / num)); return (sup - inf) / means;

}

3.2.3 Algoritmo per il ritrovamento delle marcature mag-

Documenti correlati