Getting Started - JINGPaC 2.0
JINGPaC 2.0 viene distribuito con un'applicazione di test. Fare riferimento a questa pagina per ulteriori informazioni.
Getting Started - JINGPaC 1.0
Attenzione: le informazioni in questa sezione riguardano JINGPaC 1.0
.
Classi che devono essere implementate dall'utente (tutte le classi possono essere rinominate a preferenza) :
- DataReaderConcrete
-
questa classe deve implementare l'interfaccia DataReader del package classifier.
Il compito di questa classe è quello di caricare i dati (per l'addestramento del sistema) nel TrainingSet da una sorgente esterna... se il sistema da addestrare è SuperVisionato i dati di ingresso dovranno essere memorizzati come coppie "input-output atteso" in un data-pool (p.e. un oggetto HashMap); i valori di input per ogni coppia saranno quindi utilizzati come keys memorizzate in una struttura dati separata (p.e. un oggetto ArrayList).
Il metodo getMap() dovrà quindi ritornare l'intero data_pool mentre il metodo getInputObjects() ritornerà la struttura contenente le keys per l'accesso al data_pool stesso.
Se il sistema è non SuperVisionato basterà implementare il metodo getInputObjects().Nella realizzazione di un Classificatore di Pattern per targhe automobilistiche il nostro approccio è stato quello di estendere l'interfaccia DataReader con DataReaderTarghe.
import classifier.*; import classifier.gp.*; public interface DataReaderTarghe extends DataReader { public long getOccurencies(Long key); public boolean isExt(); }Questa interfaccia è stata quindi implementata da TargheReaderRed (data reader per input a 28 bit) e da TargheReaderExt (per input 128 bit).
Esempio di una entry del trainingSet a 28 bit
0 1 1 0 1 1 0 0 1 1 1 0 0 0 1 1 0 0 1 1 1 1 1 0 0 1 0 0 5
Esempio di una entry del trainingSet a 128 bit
8289280 7896702 7368824 1886417008 1
- FitnessFunctionConcrete
-
questa classe deve implementare l'interfaccia FitnessFunction del package classifier.gp.
La funzione di fitness rappresenta uno dei nodi cruciali dell' approccio basato su Genetic Programming: essa infatti deve valutare ciascun individuo (programma genetico) coinvolto nell'evoluzione mediante l'assegnazione di un opportuno punteggio di merito (fitness); tanto maggiore è il punteggio ottenuto tanto migliori sono le probabilità per un individuo di "propagare" il proprio patrimonio genetico tra le generazioni.
Il metodo evaluate(Population pop) dovrà pertanto processare ciascun programma genetico per ciascuna entry del TrainingSet andando a comparare il valore restituito con quello atteso ed assegnare ad ogni individuo l' opportuno punteggio.Un esempio di FitnessFunctionConcrete è rappresentato da BinaryClassifierFitness.
- fitnessConditionConcrete
-
questa classe deve implementare l'interfaccia fitnessCondition del package classfier.gp.
L'implementazione di questa classe deve esprime una condizione di arresto sul ciclo evolutivo; in particolare tale condizione dovrà essere espressa in funzione del punteggio di fitness del migliore individuo di ciascuna generazione.
L'evoluzione delle popolazioni coinvolte terminerà pertanto, o al raggiungimento del numero massimo di generazioni (parametro di setup) o al soddisfacimento della condizione espressa da un'istanza di fitnessConditionConcrete.La nostra implementazione sviluppata nell'ambito del progetto del Classificatore di Pattern per targhe automobilistiche è GPatternFitnessTest.
- FunctionConcrete
-
questa classe deve estendere la classe astratta Function del package classifier.gp; I mattoni di ogni singolo programma genetico sono oggetti FunctionConcrete e Variable; i primi estendono la classe astratta Function mentre i secondi la classe astratta Terminal ed entrambi la classe astratta GProgram; è chiaro quindi che tutte le funzioni che vanno a determinare il function set di un determinato processo evolutivo devono essere di tipo FunctionConcrete.
Nel costruttore della classe deve essere specificato il numero di operandi su cui la funzione lavora.
public FunctionConcrete() { arg = new GProgram[/*numero di operandi */]; }Il metodo eval() viene invocato durante l'esecuzione di un programma genetico; tramite override esso è stato ridefinito secondo le seguenti signature:
- long eval(long l)
- double eval(double i)
- char[] eval(char[] string)
- Object eval(Object input)
Per un corretto funzionamento è necessario che tutte le funzioni appartenenti al function set (e tutte le variabili del terminal set) siano coerenti con un unico tipo di dato.
Allo stadio attule di sviluppo abbiamo riscontrato buone prestazioni nei tempi di evoluzione tra una generazione e l'altra lavorando con i tipi primitivi mentre un significativo calo si manifesta lavorando con gli oggetti; è ragionevole supporre che tale riduzione nelle prestazioni sia dovuta al sistema di gestione della memoria del Garbage Collector. Attualmente stiamo cercando soluzioni per ridurre questo divario.Implementazioni di FunctionConcrete create nell'ambito del Classificatore di Pattern per targhe automobilistiche:
- FunctionAND
- Operatore AND binario bitwise.
- FunctionOR
- Operatore OR binario bitwise.
- FunctionXOR
- Operatore XOR binario bitwise.
- FunctionNOT
- Operatore NOT unario bitwise.
- Variable
-
questa classe deve estendere la classe astratta Terminal del package classifier.gp.
Insieme agli oggetti FunctionConcrete, i Variable costituiscono i "mattoni" di ciascun programma genetico; nella fattispecie essi rappresentano le foglie della struttura ad albero di un genetic program. Quando un dato di input viene passato ad un programma gli oggetti funzione (...i nodi dell'albero) chiamano ricorsivamente il metodo eval() dei nodi sottostanti, quando viene invocato il metodo eval() di una Variable esso deve ritornare il dato concreto che verrà processato dalla function al nodo parent...
Poichè il nostro approccio nell'implementazione del Classificatore di Pattern per targhe automobilistiche è stato quello di utilizzare sono operatori bitwise, abbiamo istanziato oggetti Varible passondo loro un valore long di mascheramento; in questo modo l'invocazione di eval() restituiva al nodo parent l'i-esimo bit del valore di input (AND logico tra l'input e la maschera...).
public Variable(long value) { this.mask = value; } public long eval(long x) { return (x & mask)/mask; } - errorConditionConcrete
-
questa classe deve implementare l'interfaccia errorCondition del package classifier.nn.
Similmente a fitnessConditionConcrete l'implementazione di questa classe deve esprimere una condizione di arresto sull'algoritmo di addestramento di una rete neurale.
La terminazione di una sessione di training infatti può avvenire qualora venga raggiunto il numero massimo di cicli (parametro di setup) o qualora la condizione espressa da errorConditionConcrete venga soddisfatta; tale condizione in particolar modo dovrà essere espressa in funzione dell'errore percentuale di classificazione rispetto al TrainingSet.
La nostra implementazione di errorConditionConcrete è NNPatternErrorTest.
Download
- JINGPaC 2.0
-
- JINGPaC 2.0 beta
- Questo pacchetto contiene i sorgenti, il jar, la JavaDoc e l'implementazione di esempio
-
- JINGPaC 2.0 KeyNote Presentation
- Presenatione di JINGPaC in formato KeyNote
- JINGPaC 1.0
-
- JINGPaC 1.0 source + example
-
Sorgente JINGPaC + codice sorgente di due applicazioni tester. vedi README interno all'archivio per istruzioni
Attenzione: a causa di un errore con alcune versioni di Java RMI l'esempio corredato non funziona. Commentate tutte le righe di codice relative ad RMI per eseguire JINGPaC in locale.
- JINGPaC 1.0 - ParamGUI
-
- ParamGUI
- Interfaccia grafica in SWING per settare i parametri della parte di Programmazione Genetica
JavaDoc
- JINGPaC 2.0 - JavaDoc
-
- JavaDoc
- Consulta online la JavaDoc di JINGPaC 2.0. L'archivio è contenuto nel file di installazione di JINGPaC
- JINGPaC 1.0 - JavaDoc
-
- JavaDoc
- Consulta online la JavaDoc di JINGPaC 1.0
Link
- Image Pattern Classifier
- Genetic Programming
- Neural Network
- Develop