Skip to content
Snippets Groups Projects
Commit 973a7245 authored by nollet's avatar nollet
Browse files

fin J6

parent a7f9ed36
No related branches found
No related tags found
No related merge requests found
......@@ -18,12 +18,22 @@ Voici ici le descriptif du travail effectué lors de la journée du 23/05/2022.
### De 8h30 à 10h
* Relecture article scientifique
* Continuation implémentation comportement de l'article
### de 10h à 12h
* Continuation implémentation comportement de l'article
### de 14h à 16h
* Continuer lecture article donné par l'encadrant
* Fin (pour l'instant) implémentation comportement de l'article (voir v3)
### de 16h à 18h
* fin lecture article donné par l'encadrant
<h2 id="mardi"> <strong> ✏️ Journal de Bord - Jour 7</strong> <a href="#menu">↩️</a> </h2>
......
File added
......@@ -11,10 +11,14 @@ public class Agent : MonoBehaviour, Visible
private Comportement comportement;
private Perception perception;
public Vector3 direction;
public float speed;
public List<Vector3> oldDirections;
private float speed;
private List<Vector3> oldDirections;
private int Taille_Memoire = 5;
private int angle = 180;
private static int count = 0;
public int id;
// Start is called before the first frame update
void Start()
......@@ -23,7 +27,7 @@ public class Agent : MonoBehaviour, Visible
//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 };
List<int> imps = new List<int> { 5,5,2 };
Comportement c = new CompositeSeq(this,comps,imps);
if(system._3D) comportement = c;
......@@ -33,11 +37,18 @@ public class Agent : MonoBehaviour, Visible
direction = Vector3.zero;
speed = 0.7f;
oldDirections = new List<Vector3>();
id = Agent.count;
Agent.count++;
}
// Update is called once per frame
void Update()
{
if(angle != system.angle) {
angle = system.angle;
perception = new Perception(this,20.0f,(float) angle);
}
reagir(voir());
memoire();
}
......@@ -58,4 +69,33 @@ public class Agent : MonoBehaviour, Visible
public bool isAlive() { return true; }
void OnTriggerEnter(Collider other) {
direction = Vector3.zero;
//Debug.Log("enter trigger");
}
void OnTriggerExit(Collider other) {
direction = Utils.meanVector(oldDirections);
//Debug.Log("exit trigger");
}
public override bool Equals(object obj)
{
// If the passed object is null
if (obj == null)
{
return false;
}
if (!(obj is Agent))
{
return false;
}
return (this.id == ((Agent) obj).id);
}
public override int GetHashCode()
{
return id;
}
}
......@@ -7,8 +7,9 @@ public class Bord : Comportement
static public float Urgent = 5.0f;
static public float Preoccuppant = 8.0f;
static public float Intrigant = 10.0f;
private Vector3 currentGoal;
public Bord(Agent proprietaire) : base(proprietaire) {}
public Bord(Agent proprietaire) : base(proprietaire) { currentGoal = proprietaire.direction;}
public override Vector3 reagir(List<Observation> observation) {
List<Vector3> vectors = new List<Vector3>();
......@@ -30,7 +31,9 @@ public class Bord : Comportement
}
}
Vector3 res = Utils.meanVector(vectors);
return res;
//currentGoal = res;
return Utils.meanVector(new List<Vector3> {res,proprietaire.direction});
//return res;
//return Utils.noiseVector(res,nbBruit,bruit);
}
......
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class Paper : Comportement
{
[Serializable]
public class Memory
{
public Agent agent;
public float idealDistance;
public float predictDistance;
public float predictAttempt;
public float stagnation;
public float exilation;
public Memory(Agent a, float ideal, float predict, float attempt) {
agent = a; idealDistance = ideal; predictDistance = predict; predictAttempt = attempt;
stagnation = stagnationTolerance; exilation = exileTolerance;
}
};
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
(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,1.0f,-1.0f)).normalized, (new Vector3(0.0f,1.0f,-1.0f)).normalized, (new Vector3(1.0f,1.0f,-1.0f)).normalized,
(new Vector3(-1.0f,0.0f,-1.0f)).normalized, (new Vector3(0.0f,0.0f,-1.0f)).normalized, (new Vector3(1.0f,0.0f,-1.0f)).normalized,
(new Vector3(-1.0f,-1.0f,-1.0f)).normalized, (new Vector3(0.0f,-1.0f,-1.0f)).normalized, (new Vector3(1.0f,-1.0f,-1.0f)).normalized,
(new Vector3(-1.0f,1.0f,1.0f)).normalized, (new Vector3(0.0f,1.0f,1.0f)).normalized, (new Vector3(1.0f,1.0f,1.0f)).normalized,
(new Vector3(-1.0f,0.0f,1.0f)).normalized, (new Vector3(0.0f,0.0f,1.0f)).normalized, (new Vector3(1.0f,0.0f,1.0f)).normalized,
(new Vector3(-1.0f,-1.0f,1.0f)).normalized, (new Vector3(0.0f,-1.0f,1.0f)).normalized, (new Vector3(1.0f,-1.0f,1.0f)).normalized
};
// Critical real distance at which the FSRs are activated
private static float activeSeuil = 8.0f;
// Change rate (0 < P_C < 1) for increasing and decreasing ideal distances, and stagnation and exile tolerance times
private static float changeRate = 0.2f;
// Initial value of the stagnation tolerance time
private static float stagnationTolerance = 15.0f;
// Initial value of the exile tolerance time
private static float exileTolerance = 30.0f;
private List<Memory> memories = new List<Memory>();
public Paper(Agent proprietaire) : base(proprietaire) {
}
public override Vector3 reagir(List<Observation> observation) {
float disatifaction = 1.0f; Vector3 themove = Vector3.zero; float d;
List<Vector3> candidatesVectors = getTheMoves(observation);
Vector3 themove = getTheMove(candidatesVectors);
assumeTheMove(themove,observation);
return themove;
}
private List<Vector3> getTheMoves(List<Observation> observation) {
List<Vector3> candidatesVectors = new List<Vector3>();
float disatifaction = 1000.0f; float d;
for(int i=0;i<moves.Count;i++) {
d = computeDisatisfaction(moves[i],observation);
if (d < disatifaction) {
themove = moves[i]; disatifaction = d;
candidatesVectors.Clear();
candidatesVectors.Add(moves[i]);
disatifaction = d;
}
else if (d == disatifaction) candidatesVectors.Add(moves[i]);
}
return candidatesVectors;
}
private Vector3 getTheMove(List<Vector3> candidatesVectors) {
Vector3 themove = proprietaire.direction;
float d = 1000.0f; float sum;
for(int i=0;i<candidatesVectors.Count;i++) {
sum = Utils.abs(proprietaire.direction.x - candidatesVectors[i].x);
sum += Utils.abs(proprietaire.direction.y - candidatesVectors[i].y);
sum += Utils.abs(proprietaire.direction.z - candidatesVectors[i].z);
if (sum < d) {
d = sum;
themove = candidatesVectors[i];
}
}
return themove;
}
private void assumeTheMove(Vector3 themove,List<Observation> observation) {
Vector3 futurPos = proprietaire.transform.position + themove;
List<Observation> agentObservations = observation.FindAll(isAgent);
Agent concerned; Vector3 reachPoint; float reachDist;
for(int i=0;i<agentObservations.Count;i++) {
concerned = (Agent) agentObservations[i].objet;
reachPoint = proprietaire.transform.position + agentObservations[i].distance;
reachDist = Utils.normVector( reachPoint - futurPos );
for(int j=0;j<memories.Count;j++) {
if(memories[j].agent == concerned) {
memories[j].predictDistance = reachDist;
memories[j].predictAttempt = reachDist - Utils.normVector(agentObservations[i].distance);
}
}
}
}
private bool isAgent(Observation o) {return o.objet.isAlive();}
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;
Vector3 reachPoint;
float reachDist; Agent concerned; float dist;
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));
dist = Utils.normVector(observation[i].distance);
if(dist <= activeSeuil) {
concerned = (Agent) observation[i].objet;
reachPoint = proprietaire.transform.position + observation[i].distance;
reachDist = Utils.normVector( reachPoint - possiblePos );
addAgentInMemory(concerned,dist,m,reachDist);
d += Utils.abs( reachDist - idealDistance((Agent) observation[i].objet));
nb += 1;
}
}
return d/(nb*m);
}
if (nb==0) return 1000.0f;
else return d/(nb*m);
}
private void addAgentInMemory(Agent concerned,float dist,float max, float reachDist) {
bool hasToBeAdd = true;
int i = 0;
while (i < memories.Count && hasToBeAdd) {
if(memories[i].agent == concerned) hasToBeAdd = false;
i++;
}
if(hasToBeAdd) {
Memory mem = new Memory(concerned,Utils.random(dist,max),reachDist,0.0f);
memories.Add(mem);
}
}
private float idealDistance(Agent other) {
return 50.0f;
int i = 0;
while(memories[i].agent != other) i++;
float dist = Utils.normVector(other.transform.position - proprietaire.transform.position);
float c = memories[i].predictAttempt;
float u = Utils.abs(dist - memories[i].idealDistance) - Utils.abs(memories[i].predictDistance - memories[i].idealDistance);
int k = 0;
if (u > 0) {
if (c < 0) k = 1;
else if (c > 0) k = -1;
else k = Utils.randomPosOrNeg(1);
}
else if(u < 0) {
if (c < 0) k = -1;
else if (c > 0) k = 1;
else k = Utils.randomPosOrNeg(1);
}
float ideal = (1 + k*changeRate) * memories[i].idealDistance;
memories[i].idealDistance = ideal;
return 5.0f;
//return ideal;
/*
if(Utils.abs(ideal - memories[i].idealDistance) < changeRate && memories[i].stagnation > 1) {
memories[i].stagnation -= 1;
if(memories[i].stagnation <= 1) {
ideal = memories[i].idealDistance + changeRate * stagnationTolerance;
}
}
else if(memories[i].exilation > 1 && memories[i].stagnation <= 1) {
memories[i].exilation -= 1;
//memories[i].stagnation *= 1 + changeRate;
if(memories[i].exilation == 1) {
ideal = memories[i].idealDistance - (changeRate * stagnationTolerance + activeSeuil);
memories[i].stagnation = stagnationTolerance * (1 + changeRate);
memories[i].exilation = exileTolerance * (1 - changeRate);
}
}
memories[i].idealDistance = ideal;
return ideal;
*/
}
}
......@@ -10,6 +10,7 @@ public class SMA : MonoBehaviour
public GameObject boid;
public bool _3D = true;
private bool _old3D = true;
public int angle = 180;
// Start is called before the first frame update
......@@ -24,7 +25,6 @@ public class SMA : MonoBehaviour
{
if (_3D != _old3D) {
_old3D = _3D;
agents.Clear();
environnement.changeTo3D(_3D);
createAgents();
}
......@@ -37,7 +37,7 @@ public class SMA : MonoBehaviour
}
void createAgents() {
GameObject a;
GameObject a;agents.Clear();
for(int i=0; i<population; i++) {
a = Instantiate(boid, environnement.validPosition(), Quaternion.identity,environnement.transform) as GameObject;
agents.Add(a.GetComponent<Agent>());
......
......@@ -24,14 +24,14 @@ public class Utils
float z = 0.0f;
int r;
for(int i = 0; i<10; i++) {
r = UnityEngine.Random.Range(0,3);
r = random(0,3);
if (r == 0) x += 1.0f;
else if (r == 1) y += 1.0f;
else z += 1.0f;
}
if(UnityEngine.Random.Range(1,3) > 1) x = -x;
if(UnityEngine.Random.Range(1,3) > 1) y = -y;
if(UnityEngine.Random.Range(1,3) > 1) z = -z;
if(random(1,3) > 1) x = -x;
if(random(1,3) > 1) y = -y;
if(random(1,3) > 1) z = -z;
return normalizedVector(x,y,z);
}
......@@ -50,9 +50,9 @@ public class Utils
}
public static Vector3 randomVector(float minX, float maxX, float minY, float maxY, float minZ, float maxZ) {
return new Vector3(UnityEngine.Random.Range(minX,maxX),
UnityEngine.Random.Range(minY,maxY),
UnityEngine.Random.Range(minZ,maxZ));
return new Vector3(random(minX,maxX),
random(minY,maxY),
random(minZ,maxZ));
}
public static float normVector(Vector3 v) {
......@@ -66,8 +66,8 @@ public class Utils
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++) {
coin1 = UnityEngine.Random.Range(1,3);
coin2 = UnityEngine.Random.Range(1,4);
coin1 = random(1,3);
coin2 = random(1,4);
if(coin2 == 1) {
if(coin1 == 1) x+=bruit;
else x-= bruit;
......@@ -86,4 +86,10 @@ public class Utils
public static float abs(float n) {return (float) Math.Sqrt(Math.Pow(n,2));}
public static float random(float min, float max) {return UnityEngine.Random.Range(min,max);}
public static int random(int min, int max) {return UnityEngine.Random.Range(min,max);}
public static float randomPosOrNeg(float n) { return n * ((float) Math.Pow(-1,random(0,2))); }
public static int randomPosOrNeg(int n) { return n * ((int) Math.Pow(-1,random(0,2))); }
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment