From 4b97c2dedebf283a98ca33e34e8a38bf26b4fc46 Mon Sep 17 00:00:00 2001 From: jrafei <jana.eltayeb-el-rafei@etu.utc.fr> Date: Mon, 18 Dec 2023 23:37:14 +0100 Subject: [PATCH] ajout_comportement_lambda --- internal/simulation/controleur.go | 75 ++++++++++++++++++----------- internal/simulation/usagerLambda.go | 12 +++-- 2 files changed, 55 insertions(+), 32 deletions(-) diff --git a/internal/simulation/controleur.go b/internal/simulation/controleur.go index 9b6a329..742a36c 100644 --- a/internal/simulation/controleur.go +++ b/internal/simulation/controleur.go @@ -17,6 +17,7 @@ import ( */ type Controleur struct { + req *Request // requete reçue par le controleur faceCase string // chaine de caractère qui contient l'id de l'agent qui se trouve devant le controleur, exemple : "Agent1", "Fraudeur1", "X" ,etc. timer *time.Timer // timer qui permet de définir la durée de vie du controleur isExpired bool // true si le controleur est expiré, false sinon @@ -37,31 +38,44 @@ func (c *Controleur) startTimer() { func (c *Controleur) Percept(ag *Agent) { env := ag.env - if ag.direction == 0 { // vers le haut - if (ag.position[0] - 1) < 0 { + switch { + case ag.direction == 0: // vers le haut + if (ag.position[0] - 1) < 0 { c.faceCase = "X" // si le controleur est au bord de la station, alors il fait face à un mur - } else { + } else { c.faceCase = env.station[ag.position[0]-1][ag.position[1]] - } - } else if ag.direction == 1 { // vers la droite - if (ag.position[1] + 1) > 19 { + } + case ag.direction == 1: // vers la droite + if (ag.position[1] + 1) > 19 { c.faceCase = "X" // si le controleur est au bord de la station, alors il fait face à un mur } else { c.faceCase = env.station[ag.position[0]][ag.position[1]+1] } - } else if ag.direction == 2 { // vers le bas - if (ag.position[0] + 1) > 19 { - c.faceCase = "X" // si le controleur est au bord de la station, alors il fait face à un mur - } else { + case ag.direction == 2: // vers le bas + if (ag.position[0] + 1) > 19 { + c.faceCase = "X" // si le controleur est au bord de la station, alors il fait face à un mur + } else { c.faceCase = env.station[ag.position[0]+1][ag.position[1]] - } - }else { // vers la gauche - if (ag.position[1] - 1) < 0 { - c.faceCase = "X" // si le controleur est au bord de la station, alors il fait face à un mur - } else { + } + + case ag.direction == 3: // vers la gauche + if (ag.position[1] - 1) < 0 { + c.faceCase = "X" // si le controleur est au bord de la station, alors il fait face à un mur + } else { c.faceCase = env.station[ag.position[0]][ag.position[1]-1] - } } + + // comportement par défaut (comportement agent Lambda) + case ag.request != nil: //verifier si l'agent est communiqué par un autre agent (A VOIR SI IL EXISTE DEJA UN AGENT QUI COMMUNIQUE AVEC LE CONTROLEUR) + //print("Requete recue par l'agent lambda : ", ag.request.decision, "\n") + c.req = ag.request + default: + ag.stuck = ag.isStuck() + if ag.stuck { + return + + } + } } func (c *Controleur) Deliberate(ag *Agent) { @@ -85,29 +99,36 @@ func (c *Controleur) Deliberate(ag *Agent) { ag.decision = Stop // arreter l'agent devant lui } else if matchedFraud && !ag.env.controlledAgents[AgentID(c.faceCase)]{ ag.decision = Expel // virer l'agent devant lui - } else { - // Comportement de l'usager lambda (comportement par defaut) - if ag.stuck { - ag.decision = Wait // attendre - } else { - ag.decision = Move // avancer - } - } + //sinon comportement par défaut (comportement de l'usager lambda) + }else if ag.position == ag.destination && (ag.isOn[ag.position] == "W" || ag.isOn[ag.position] == "S") { // si l'agent est arrivé à sa destination et qu'il est sur une sortie + //fmt.Println(ag.id, "disappear") + ag.decision = Disappear + } else if ag.stuck{ // si l'agent est bloqué + ag.decision = Wait + }else { + ag.decision = Move + } } } func (c *Controleur) Act(ag *Agent) { - if ag.decision == Move { + switch ag.decision { + case Move: if !c.isExpired { ag.destination = c.randomDestination(ag) }else { ag.destination = ag.findNearestExit() } ag.MoveAgent() - } else if ag.decision == Wait { + + case Wait: n := rand.Intn(2) // temps d'attente aléatoire time.Sleep(time.Duration(n) * time.Second) - } else { // Expel ou Wait + + case Disappear: + RemoveAgent(&ag.env.station, ag) + + default : //Expel ou Wait agt_face_id := AgentID(c.faceCase) //id de l'agent qui se trouve devant le controleur //fmt.Print("L'agent ", agt_face_id, " a été expulsé\n") ag.env.agentsChan[agt_face_id] <- *NewRequest(ag.env.agentsChan[ag.id], ag.decision) // envoie la decision du controleur à l'agent qui se trouve devant lui diff --git a/internal/simulation/usagerLambda.go b/internal/simulation/usagerLambda.go index d296bc6..b4a784a 100644 --- a/internal/simulation/usagerLambda.go +++ b/internal/simulation/usagerLambda.go @@ -8,7 +8,7 @@ import ( ) type UsagerLambda struct { - req *Request + req *Request // requete recue par l'agent lambda } func (ul *UsagerLambda) Percept(ag *Agent) { @@ -51,11 +51,13 @@ func (ul *UsagerLambda) Deliberate(ag *Agent) { ag.decision = Expel ul.req = nil //demande traitée } - }else if ag.position == ag.destination && (ag.isOn[ag.position] == "W" || ag.isOn[ag.position] == "S") { - //fmt.Println(ag.id, "disapear") + }else if ag.position == ag.destination && (ag.isOn[ag.position] == "W" || ag.isOn[ag.position] == "S") { // si l'agent est arrivé à sa destination et qu'il est sur une sortie + //fmt.Println(ag.id, "disappear") ag.decision = Disappear - } else { - ag.decision = Move + } else if ag.stuck{ // si l'agent est bloqué + ag.decision = Wait + }else { + ag.decision = Move } } -- GitLab