Skip to content

Commit 9de3a7f

Browse files
committed
feat: add experiment results
1 parent ed3fae6 commit 9de3a7f

33 files changed

+117865
-201
lines changed

Diff for: .idea/runConfigurations/Baseline.xml

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: .idea/workspace.xml

+14-69
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: README.adoc

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ and save the gathered data as a CSV run:
3030

3131
[source, shell]
3232
----
33-
./gradlew compareWithBaseline --args="config/exp3.json test.csv"
33+
./gradlew compareBTrees --args="config/exp3.json test.csv"
3434
----
3535

3636
== Documentation

Diff for: doc/report.adoc

+70-48
Original file line numberDiff line numberDiff line change
@@ -256,15 +256,21 @@ I nodi disponibili per la sperimentazione fanno parte di due gruppi.
256256

257257
I nodi del primo gruppo sono:
258258

259-
260-
- `isLightNearer`
261-
- `moveForward`
259+
- `checkForAndStore{Goal,Obstacle,Boundary,Visited}`: restituisce un successo solo se è presente l'entità della griglia specificata in una qualsiasi delle quattro direzioni cardinali ed entro un raggio predefinito. L'impostazione predefinita controlla le celle adiacenti al robot. Nel caso siano identificate le entità specificate, si memorizzano i punti corrispondenti nella lavagna del robot;
260+
- `turnToAvoidStored`: restituisce un fallimento nel caso non ci siano punti memorizzati nella lavagna del robot. In caso contrario orienta il robot in una direzione casuale che evita il movimento sulle celle in corrispondenza dei punti indicati;
261+
- `turnToFollowStored`: restituisce un fallimento nel caso non ci siano punti memorizzati nella lavagna del robot. In caso contrario orienta il robot in una direzione casuale tra quelle che consentono il movimento sulle celle in corrispondenza dei punti indicati;
262262

263263
I nodi del secondo gruppo sono:
264264

265-
- `checkFor{Goal,Obstacle,Boundary,Visited}{Forward,Left,Right}`: restituisce un successo solo se è presente l'entità della griglia specificata nella direzione fornita ed entro un raggio predefinito. In genere si controllano sono i vicini adiacenti nella direzione fornita;
265+
- `checkFor{Goal,Obstacle,Boundary,Visited}{Forward,Left,Right}`: restituisce un successo solo se è presente l'entità della griglia specificata nella direzione fornita ed entro un raggio predefinito. L'impostazione predefinita controlla le celle adiacenti al robot nella direzione fornita;
266266
- `turnTo{Left,Right}`: restituisce sempre un successo e fa muovere il robot nella direzione indicata di una cella. Se il movimento comporta lo scontro con un ostacolo o il superamento dei confini della griglia, è intercettato dalla macchina a stati finiti. Il movimento del robot è annullato e si memorizza l'avvenuta collisione. Analogamente si memorizzano le informazioni relative al movimento in celle già visitate e all'assenza di movimento;
267-
- `moveForward`
267+
268+
I seguenti nodi sono presenti in entrambi i gruppi:
269+
270+
- `stop`: è un nodo azione che restituisce sempre un successo ma non alcun effetto.
271+
- `turnRandomly`: è un nodo azione che imposta la direzione del robot in modo casuale;
272+
- `isNearerLight`: è un nodo condizione restituisce un successo solo se il robot si è avvicinato alla luce rispetto all'ultimo spostamento;
273+
- `moveForward`: è un nodo azione che fa muovere il robot di una cella in avanti, in funzione della direzione verso cui è orientato.
268274

269275
L'ambiente è modellato tramite celle libere o che contengono un ostacolo e tramite un token che indica la posizione iniziale del robot e uno che indica la posizione della luce da raggiungere. Si impiega una funzione di generazione casuale che imposta la posizione iniziale del robot e la luce agli opposti di una griglia quadrata. Gli ostacoli sono piazzati casualmente in modo da lasciare almeno un percorso libero tra la posizione di partenza e l'obiettivo.
270276

@@ -327,6 +333,7 @@ La valutazione avviene a partire dalle statistiche raccolte sull'andamento di un
327333
. distanza iniziale dalla luce;
328334
. distanza finale dalla luce;
329335
. numero di iterazioni con collisione;
336+
. numero di iterazioni in cui l'agente è fermo;
330337
. numero di celle rivisitate;
331338
. numero di iterazioni effettuate;
332339
. dimensione dell'albero di comportamento.
@@ -366,6 +373,19 @@ dove:
366373
- `s_total` indica il numero di iterazioni totali;
367374
- `w_collision` indica il peso della penalità per le collisioni.
368375

376+
La penalità legata al numero di iterazioni in cui l'agente non si muove spinge il processo di evoluzione a generare alberi di comportamento che restituiscono uno stato di successo, in quanto l'agente non compie azioni in un'iterazione se l'albero restituisce un fallimento.
377+
Il calcolo della penalità avviene nel seguente modo:
378+
379+
[example]
380+
----
381+
-(s_idle / s_total) * w_idle
382+
----
383+
384+
dove:
385+
386+
- `s_idle` indica il numero di iterazioni senza movimento;
387+
- `w_idle` indica il peso della penalità per l'assenza di movimento.
388+
369389
Il numero di celle rivisitate incentiva la ricerca di percorsi efficienti, ovvero che riducono il backtracking il più possible.
370390
Insieme al numero di iterazioni effettuate, consente di penalizzare percorsi eccessivamente lunghi.
371391
La penalità complessiva è calcolata in modo analogo a quella per le collisioni:
@@ -401,7 +421,7 @@ In questo modo si migliora il grado di robustezza del controller e la sua capaci
401421

402422
=== DSL per alberi di comportamento e griglie
403423

404-
Per facilitare la definizione degli alberi di comportamento manuale, è stato implementato un DSL interno per realizzare una loro specifica concisa. Un esempio di utilizzo è mostrato in <<btree-dsl-example>> e una sua rappresentazione in <<btree-string>>.
424+
Per facilitare la definizione degli alberi di comportamento manuale, è stato implementato un DSL interno per realizzare una loro specifica concisa. Un esempio di utilizzo è mostrato in <<btree-dsl-example>>.
405425

406426
[#btree-dsl-example]
407427
.Rappresentazione di un albero di comportamento che consente di effettuare la navigazione in un GridWorld evitando gli ostacoli e dirigendosi verso la luce.
@@ -428,24 +448,6 @@ btree {
428448
}
429449
----
430450

431-
[#btree-string]
432-
.Rappresentazione di un albero di comportamento in formato testuale.
433-
[example]
434-
----
435-
└── Navigation
436-
├── Phototaxis
437-
│ ├── checkForAndStore[GreenLight]
438-
│ ├── turnToFollowStored
439-
│ └── moveForward
440-
└── Sequence
441-
├── Selector
442-
│ ├── ObstacleAvoidance
443-
│ │ ├── checkForAndStore[Obstacle, Boundary]
444-
│ │ └── turnToAvoidStored
445-
│ └── turnRandomly
446-
└── moveForward
447-
----
448-
449451
In modo analogo è stato definito un DSL per la specifica della struttura della griglia, un cui esempio di utilizzo è mostrato in <<grid-dsl-example>> e la relativa rappresentazione in <<grid-string>>.
450452

451453
[#grid-dsl-example]
@@ -495,36 +497,29 @@ Per quanto riguarda la qualità del codice sono stati impiegati gli strumenti `K
495497

496498
=== Esperimenti
497499

498-
I test sono stati eseguiti su un computer con un processore Intel Core i7-10700 @4.8 GHz e 16 GB di RAM. Le configurazioni dei principali parametri per ciascuno dei tre esperimenti che si è scelto di riportare sono mostrate in <<ga-params>>.
499-
500-
[#ga-params]
501-
.Parametri impiegati per l'algoritmo genetico nei tre esperimenti in analisi. Il numero accanto a "Elitism" indica il numero di individui che formano l'elite di una generazione e il numero accanto a "Tournament" indica il numero di individui coinvolti in ciascun torneo.
502-
[cols='6,4,4,4', stripes=odd, options=unbreakable]
503-
|===
504-
| | Esperimento 1 | Esperimento 2 | Esperimento 3
505-
| Dimensioni della griglia | 7 | 9 | 9
506-
| Popolazione | 30 | 50 | 50
507-
| Generazioni | 1000 | 2000 | 2000
508-
| Steady fitness | 300 | 500 | 500
509-
| % Mutazione | 50 | 70 | 70
510-
| % Crossover | 60 | 80 | 80
511-
| Registro di nodi | exp1 | exp1 | exp2
512-
| Selezione dei sopravvissuti | Elitism 1 | Elitism 3 | Elitism 3
513-
| Selezione della discendenza | Tournament 3 | Tournament 5 | Tournament 5
514-
|===
515-
516-
In <<best-fitness>> è mostrato il miglior valore di fitness ottenuto in ciascuno dei tre esperimenti, a confronto con i risultati ottenuti da una baseline che impiega un selettore di Montecarlo.
500+
I test sono stati eseguiti su un computer con un processore Intel Core i7-10700 @4.8 GHz e 16 GB di RAM.
501+
È stata effettuata una grid search con le seguenti configurazioni di parametri:
502+
503+
- probabilità di crossover e mutazione:
504+
- numero di elité e campione per i tornei;
505+
- dimensioni della griglia, numero di ostacoli e massimo numero di iterazioni di ciascuna delle tre simulazioni utilizzate per il calcolo della fitness;
506+
- profondità degli alberi generati casualmente, numero minimo e massimo di figli per ciascun nodo di controllo.
507+
508+
Per l'analisi dei risultati sono stati quindi considerati ventiquattro esperimenti, disponibili nel repository del progetto, link:[qui].
509+
Il task gradle `runGAWithGridSearch` è stato impiegato per la generazione dei dati.
510+
Di seguito si riportano i risultati ritenuti più rappresentativi del gruppo di esperimenti.
511+
512+
517513

518514
Si osserva che...
519515

520516
In <<best-fitness-candle>> si riporta un confronto con i valori di fitness ottenuti dagli alberi dei tre esperimenti a confronto con un albero di comportamento programmato manualmente e un albero che determina un movimento casuale nell'ambiente di test, come baseline di confronto.
521-
Sono mostrati i risultati ottenuti aggregando il valore di fitness calcolato su una sequenza di cinque griglie casuali come ambiente di test per tutti gli alberi.
522517

523-
Si osserva che...
524518

525-
[#best-fitness]
526-
.Grafico della miglior fitness ottenuta per ciascuna generazione nei tre esperimenti in analisi.
527-
image::fitness_plot.png[align=center, scale=30%]
519+
Sono mostrati i risultati ottenuti calcolando la media del valore di fitness su trentasei simulazioni ottenute considerando diverse configurazioni della griglia e un diverso numero di iterazioni per la simulazione.
520+
I dati sono stati generati con il task gradle `compareBTrees`.
521+
522+
Si osserva che...
528523

529524
[#best-fitness-candle]
530525
.Grafico a candela della miglior fitness ottenuta in ciascuno dei tre esperimenti in analisi, a confronto con i risultati ottenuti impiegando un albero per il movimento casuale e un albero sviluppato manualmente.
@@ -533,6 +528,32 @@ image::fitness_plot.png[align=center, scale=30%]
533528
In X, Y e Z è riportato l'albero relativo al miglior genotipo.
534529
In X e Y sono riportati gli alberi impiegati come baseline.
535530

531+
[#btree-handcrafted-baseline2]
532+
.
533+
534+
[#btree-handcrafted-baseline]
535+
.Rappresentazione di un albero di comportamento in formato testuale.
536+
[example]
537+
----
538+
└── Navigation
539+
├── Phototaxis
540+
│ ├── checkForAndStore[GreenLight]
541+
│ ├── turnToFollowStored
542+
│ └── moveForward
543+
└── Sequence
544+
├── Selector
545+
│ ├── ObstacleAvoidance
546+
│ │ ├── checkForAndStore[Obstacle, Boundary]
547+
│ │ └── turnToAvoidStored
548+
│ └── turnRandomly
549+
└── moveForward
550+
----
551+
552+
[#exp-result-schema]
553+
.Rappresentazione della schema impiegato per memorizzare i risultati di un esperimento.
554+
[example]
555+
----
556+
536557
I risultati di ciascun esperimento sono riportati impiegando lo schema indicato in <<exp-result-schema>>, oltre che quelli mostrati in <<exp-config-schema>> e <<exp-moments-schema>>.
537558
538559
[#exp-result-schema]
@@ -580,6 +601,7 @@ steadyFitness: Int
580601
maxGenerations: Int
581602
maxReparationAttempts: Int
582603
leafNodes: String
604+
keepChildren: Boolean,
583605
gridDimensions: Int
584606
gridObstacles: Int
585607
maxTreeDepth: Int

Diff for: laboratory/.gitignore

+2-1
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1-
experiment
1+
experiment/*
2+
!experiment/archive/

Diff for: laboratory/build.gradle.kts

+3-3
Original file line numberDiff line numberDiff line change
@@ -56,13 +56,13 @@ tasks.register<JavaExec>("runRandomSelectorGA") {
5656
mainClass = "${project.group}.lab.RandomSelectionBaselineKt"
5757
}
5858

59-
tasks.register<JavaExec>("compareWithBaseline") {
60-
description = "Run the class to compare with the baseline."
59+
tasks.register<JavaExec>("compareBTrees") {
60+
description = "Run the class to compare the behavior trees."
6161
group = "custom"
6262

6363
standardOutput = System.out
6464
classpath = sourceSets.main.get().runtimeClasspath
65-
mainClass = "${project.group}.lab.HandcraftedBaselineKt"
65+
mainClass = "${project.group}.lab.BTreesComparisonRunnerKt"
6666
}
6767

6868
tasks.test {

0 commit comments

Comments
 (0)