From a7f9ed36039f7c1d7e699f2bcb7f0d8f3783f485 Mon Sep 17 00:00:00 2001 From: nollet <nollet> Date: Fri, 20 May 2022 18:29:40 +0200 Subject: [PATCH] fin J5 --- .../journal-de-bord/semaines/semaine1.md | 24 ++++++++++-- src/Scripts/Agent.cs | 10 +++-- src/Scripts/Comportement/Bord.cs | 12 +++++- src/Scripts/Comportement/CompositeSeq.cs | 11 ++++-- src/Scripts/Comportement/Paper.cs | 39 ++++++++++++++++++- src/Scripts/Comportement/Reynolds.cs | 3 +- src/Scripts/Environnement/Environnement.cs | 4 ++ src/Scripts/Environnement/Topologie/Cube.cs | 15 +++++++ .../Environnement/Topologie/Topologie.cs | 2 + src/Scripts/Utils.cs | 6 +++ 10 files changed, 111 insertions(+), 15 deletions(-) diff --git a/comptes-rendus/journal-de-bord/semaines/semaine1.md b/comptes-rendus/journal-de-bord/semaines/semaine1.md index c49d988..a583928 100755 --- a/comptes-rendus/journal-de-bord/semaines/semaine1.md +++ b/comptes-rendus/journal-de-bord/semaines/semaine1.md @@ -55,7 +55,7 @@ Voici ici le descriptif du travail effectué lors de la journée du 17/05/2022. ### de 16h à 18h -* fin changement architecture code projet +* fin changement architecture code projet (voir src pour voir les différents dossiers et fichiers .cs) <h2 id="mercredi"> <strong> 🧠 Journal de Bord - Jour 3</strong> <a href="#menu">↩️</a> </h2> @@ -64,15 +64,20 @@ Voici ici le descriptif du travail effectué lors de la journée du 18/05/2022. ### De 8h30 à 10h +* Progression du code des Comportements et Perceptions + ### de 10h à 12h +* Progression du code des Comportements et Perceptions +* Implémentation Comportement Composite + ### de 14h à 16h * Travail sur gestion des bords ### de 16h à 18h -* Gestion des bords OK +* Gestion des bords OK, ajout de comportement adéquate <h2 id="jeudi"> <strong> ☀️ Journal de Bord - Jour 4</strong> <a href="#menu">↩️</a> </h2> @@ -88,10 +93,13 @@ Voici ici le descriptif du travail effectué lors de la journée du 19/05/2022. ### de 14h à 16h - +* Réflexion sur concept : considération de la topologie comme un objet +* Ajout comportement restrictif 2D ### de 16h à 18h +* Possibilité de switcher entre environnement 2D et 3D + <h2 id="vendredi"> <strong> 🐦 Journal de Bord - Jour 5</strong> <a href="#menu">↩️</a> </h2> Voici ici le descriptif du travail effectué lors de la journée du 20/05/2022. @@ -100,6 +108,14 @@ Voici ici le descriptif du travail effectué lors de la journée du 20/05/2022. ### de 10h à 12h +* Changement fonctionnement du comportement composite (insertion poids d'importance) +* Réflexion sur l'intersection de bords (2 stratégies possibles, à discuter) + ### de 14h à 16h -### de 16h à 18h \ No newline at end of file +* Lecture et compréhension partie implémentation des règles de nuées du papier scientifique + +### de 16h à 18h + +* Début implémentation comportement du papier +* Lecture de l'article scientifique donnée par l'encadrant. \ No newline at end of file diff --git a/src/Scripts/Agent.cs b/src/Scripts/Agent.cs index af0bf26..c7e8983 100755 --- a/src/Scripts/Agent.cs +++ b/src/Scripts/Agent.cs @@ -20,11 +20,15 @@ public class Agent : MonoBehaviour, Visible void Start() { system = GameObject.Find("SMA").GetComponent<SMA>(); - //comportement = new Reynolds(this); - List<Comportement> comps = new List<Comportement> { new Reynolds(this), new Bord(this)}; - Comportement c = new CompositeSeq(this,comps); + + //List<Comportement> comps = new List<Comportement> { new Reynolds(this), new Bord(this), new Aleatoire(this)}; + List<Comportement> comps = new List<Comportement> { new Paper(this), new Bord(this), new Aleatoire(this)}; + List<int> imps = new List<int> { 5,8,1 }; + Comportement c = new CompositeSeq(this,comps,imps); + if(system._3D) comportement = c; else comportement = new Constrain2D(this,c); + perception = new Perception180(this,20.0f); direction = Vector3.zero; speed = 0.7f; diff --git a/src/Scripts/Comportement/Bord.cs b/src/Scripts/Comportement/Bord.cs index 661a977..98a3a6a 100755 --- a/src/Scripts/Comportement/Bord.cs +++ b/src/Scripts/Comportement/Bord.cs @@ -15,13 +15,23 @@ public class Bord : Comportement vectors.Add(proprietaire.direction); foreach(Observation o in observation) { if (!o.objet.isAlive()) { + + if(grandDanger(o)) for(int i=0;i<8;i++) vectors.Add(fuir(o.distance)); else if(moyenDanger(o)) for(int i=0;i<5;i++) vectors.Add(fuir(o.distance)); else if(petitDanger(o)) for(int i=0;i<3;i++) vectors.Add(fuir(o.distance)); + + + /* + if(grandDanger(o)) for(int i=0;i<8;i++) vectors.Add(fuir(proprietaire.direction)); + else if(moyenDanger(o)) for(int i=0;i<5;i++) vectors.Add(fuir(proprietaire.direction)); + else if(petitDanger(o)) for(int i=0;i<3;i++) vectors.Add(fuir(proprietaire.direction)); + */ } } Vector3 res = Utils.meanVector(vectors); - return Utils.noiseVector(res,nbBruit,bruit); + return res; + //return Utils.noiseVector(res,nbBruit,bruit); } private bool grandDanger(Observation o) { diff --git a/src/Scripts/Comportement/CompositeSeq.cs b/src/Scripts/Comportement/CompositeSeq.cs index 4138ade..96aa24c 100755 --- a/src/Scripts/Comportement/CompositeSeq.cs +++ b/src/Scripts/Comportement/CompositeSeq.cs @@ -6,18 +6,21 @@ public class CompositeSeq : Comportement { protected List<Comportement> comportements; + protected List<int> importances; - public CompositeSeq(Agent proprietaire,List<Comportement> c) : base(proprietaire) { + public CompositeSeq(Agent proprietaire,List<Comportement> c,List<int> i) : base(proprietaire) { comportements = c; + importances = i; } public CompositeSeq(Agent proprietaire) : base(proprietaire) { comportements = new List<Comportement>(); + importances = new List<int>(); } - public void removeComportement(int i) { comportements.RemoveAt(i); } + public void removeComportement(int i) { comportements.RemoveAt(i);importances.RemoveAt(i); } - public void AddComportement(Comportement c) { comportements.Add(c); } + public void AddComportement(Comportement c, int i) { comportements.Add(c); importances.Add(i);} public override Vector3 reagir(List<Observation> observation) { List<Vector3> vectors = new List<Vector3>(); @@ -25,7 +28,7 @@ public class CompositeSeq : Comportement Vector3 add; for(int i=0;i<comportements.Count;i++) { add = comportements[i].reagir(observation); - vectors.Add(add); + for(int j=0; j<importances[i];j++) vectors.Add(add); } return Utils.meanVector(vectors); } diff --git a/src/Scripts/Comportement/Paper.cs b/src/Scripts/Comportement/Paper.cs index 93a675b..da1078f 100755 --- a/src/Scripts/Comportement/Paper.cs +++ b/src/Scripts/Comportement/Paper.cs @@ -4,10 +4,45 @@ using UnityEngine; public class Paper : Comportement { - public Paper(Agent proprietaire) : base(proprietaire) {} + + private static List<Vector3> moves = new List<Vector3> + { + (new Vector3(-1.0f,1.0f,0.0f)).normalized, (new Vector3(0.0f,1.0f,0.0f)).normalized, (new Vector3(1.0f,1.0f,0.0f)).normalized, + (new Vector3(-1.0f,0.0f,0.0f)).normalized, (new Vector3(0.0f,0.0f,0.0f)).normalized, (new Vector3(1.0f,0.0f,0.0f)).normalized, + (new Vector3(-1.0f,-1.0f,0.0f)).normalized, (new Vector3(0.0f,-1.0f,0.0f)).normalized, (new Vector3(1.0f,-1.0f,0.0f)).normalized + }; + + public Paper(Agent proprietaire) : base(proprietaire) { + + } public override Vector3 reagir(List<Observation> observation) { - return Utils.randomDirection(); + + float disatifaction = 1.0f; Vector3 themove = Vector3.zero; float d; + for(int i=0;i<moves.Count;i++) { + d = computeDisatisfaction(moves[i],observation); + if (d < disatifaction) { + themove = moves[i]; disatifaction = d; + } + } + return themove; + } + + private float computeDisatisfaction(Vector3 move, List<Observation> observation) { + float d = 0.0f; int nb = 0; + float m = proprietaire.system.environnement.getMaxDistance(); + Vector3 possiblePos = proprietaire.transform.position + move; + for(int i=0;i<observation.Count;i++) { + if (observation[i].objet.isAlive()) { + d += Utils.abs(Utils.normVector(observation[i].distance) - idealDistance((Agent) observation[i].objet)); + nb += 1; + } + } + return d/(nb*m); + } + + private float idealDistance(Agent other) { + return 50.0f; } } diff --git a/src/Scripts/Comportement/Reynolds.cs b/src/Scripts/Comportement/Reynolds.cs index ddb7a7b..4d414db 100755 --- a/src/Scripts/Comportement/Reynolds.cs +++ b/src/Scripts/Comportement/Reynolds.cs @@ -22,7 +22,8 @@ public class Reynolds : Comportement } } Vector3 res = Utils.meanVector(vectors); - return Utils.noiseVector(res,nbBruit,bruit); + return res; + //return Utils.noiseVector(res,nbBruit,bruit); } private bool danger(Observation o) { diff --git a/src/Scripts/Environnement/Environnement.cs b/src/Scripts/Environnement/Environnement.cs index 9212ebb..b0e15a2 100755 --- a/src/Scripts/Environnement/Environnement.cs +++ b/src/Scripts/Environnement/Environnement.cs @@ -40,6 +40,10 @@ public class Environnement : MonoBehaviour return topologie.validPosition(); } + public float getMaxDistance() { + return topologie.getMaxDistance(); + } + public void changeTo3D(bool _3D) { foreach (Transform child in transform) Destroy(child.gameObject); if(_3D) topologie = new Cube(cube); diff --git a/src/Scripts/Environnement/Topologie/Cube.cs b/src/Scripts/Environnement/Topologie/Cube.cs index 20916b1..230e02a 100755 --- a/src/Scripts/Environnement/Topologie/Cube.cs +++ b/src/Scripts/Environnement/Topologie/Cube.cs @@ -46,8 +46,23 @@ public class Cube : Topologie return new Observation(new Obstacle(res),res-pos); } + protected List<List<Vector3>> getFaces() { + List<List<Vector3>> res = new List<List<Vector3>>(); + res.Add(new List<Vector3> {new Vector3(minX,minY,minZ),new Vector3(minX,maxY,minZ), new Vector3(minX,maxY,maxZ), new Vector3(minX,minY,maxZ)}); + res.Add(new List<Vector3> {new Vector3(maxX,minY,minZ),new Vector3(maxX,maxY,minZ), new Vector3(maxX,maxY,maxZ), new Vector3(maxX,minY,maxZ)}); + res.Add(new List<Vector3> {new Vector3(minX,minY,minZ),new Vector3(maxX,minY,minZ), new Vector3(maxX,minY,maxZ), new Vector3(minX,minY,maxZ)}); + res.Add(new List<Vector3> {new Vector3(minX,maxY,minZ),new Vector3(maxX,maxY,minZ), new Vector3(maxX,maxY,maxZ), new Vector3(minX,maxY,maxZ)}); + res.Add(new List<Vector3> {new Vector3(minX,minY,minZ),new Vector3(maxX,minY,minZ), new Vector3(maxX,maxY,minZ), new Vector3(minX,maxY,minZ)}); + res.Add(new List<Vector3> {new Vector3(minX,minY,maxZ),new Vector3(maxX,minY,maxZ), new Vector3(maxX,maxY,maxZ), new Vector3(minX,maxY,maxZ)}); + return res; + } + public override Vector3 validPosition() { return Utils.randomVector(minX, maxX, minY, maxY, minZ, maxZ); } + + public override float getMaxDistance() { + return Utils.normVector(minX,maxX,minY,maxY,minZ,maxZ); + } } diff --git a/src/Scripts/Environnement/Topologie/Topologie.cs b/src/Scripts/Environnement/Topologie/Topologie.cs index 7ad7de2..bfb4ecc 100755 --- a/src/Scripts/Environnement/Topologie/Topologie.cs +++ b/src/Scripts/Environnement/Topologie/Topologie.cs @@ -13,4 +13,6 @@ public abstract class Topologie public abstract Vector3 validPosition(); + public abstract float getMaxDistance(); + } diff --git a/src/Scripts/Utils.cs b/src/Scripts/Utils.cs index 461669f..7719585 100755 --- a/src/Scripts/Utils.cs +++ b/src/Scripts/Utils.cs @@ -59,6 +59,10 @@ public class Utils return (float) Math.Sqrt(Math.Pow(v.x,2) + Math.Pow(v.y,2) + Math.Pow(v.z,2)); } + public static float normVector(float minX, float maxX, float minY, float maxY, float minZ, float maxZ) { + return (float) Math.Sqrt(Math.Pow(maxX-minX,2) + Math.Pow(maxY-minY,2) + Math.Pow(maxZ-minZ,2)); + } + public static Vector3 noiseVector(Vector3 v, int nbBruit, float bruit ) { int coin1; int coin2; float x = v.x; float y = v.y; float z = v.z; for(int i=0;i<nbBruit;i++) { @@ -80,4 +84,6 @@ public class Utils return normalizedVector(x,y,z); } + public static float abs(float n) {return (float) Math.Sqrt(Math.Pow(n,2));} + } -- GitLab