diff --git a/agent.go b/agent.go index 1222a62af26fcf5ef9d5c48693ee013dd7d53e8d..29eac1c1f87be9d46f2d9290404b7ce97e087666 100644 --- a/agent.go +++ b/agent.go @@ -2,7 +2,7 @@ package simulation import ( //"container/heap" - "fmt" + //"fmt" "log" "math/rand" "time" @@ -46,6 +46,7 @@ type Behavior interface { type UsagerLambda struct{} func (ul *UsagerLambda) Percept(ag *Agent, env *Environment) { + // TODO: Essayer un nouveau chemin quand l'agent est bloqué } func (ul *UsagerLambda) Deliberate(ag *Agent) { @@ -61,20 +62,22 @@ func (ul *UsagerLambda) Act(ag *Agent, env *Environment) { if ag.decision == Move { start := ag.coordBasOccupation end := ag.destination - path := findPathBFS(ag.env.station, start, end) - if len(path) > 0 && env.station[path[0][0]][path[0][1]] != "A" { - fmt.Println(ag.id, path) + if len(path) > 0 && env.station[path[0][0]][path[0][1]] != "A" { // TODO: Pas ouf les conditions je trouve ag.env.station[ag.coordBasOccupation[0]][ag.coordBasOccupation[1]] = ag.isOn ag.isOn = ag.env.station[path[0][0]][path[0][1]] ag.coordBasOccupation[0] = path[0][0] ag.coordBasOccupation[1] = path[0][1] ag.env.station[ag.coordBasOccupation[0]][ag.coordBasOccupation[1]] = "A" } - vitesseInSeconds := int(ag.vitesse) + //vitesseInSeconds := int(ag.vitesse) // Multiply the vitesse by time.Second - sleepDuration := time.Duration(vitesseInSeconds) * time.Second - time.Sleep(sleepDuration) + //sleepDuration := time.Duration(vitesseInSeconds) * time.Second + time.Sleep(200 * time.Millisecond) + } + if ag.decision == Wait { + n := rand.Intn(1) // n will be between 0 and 10 + time.Sleep(time.Duration(n) * time.Second) } } @@ -128,6 +131,40 @@ func (ag *Agent) Act(env *Environment) { * * */ +/* +func findPathBFS(matrix [20][20]string, start, end Coord) []Coord { + queue := []Coord{start} + visited := make(map[Coord]bool) + parents := make(map[Coord]Coord) + + for len(queue) > 0 { + current := queue[0] + queue = queue[1:] + + if current == end { + // Construire le chemin à partir des parents + path := []Coord{current} + for parent, ok := parents[current]; ok; parent, ok = parents[parent] { + path = append([]Coord{parent}, path...) + } + return path[1:] + } + + visited[current] = true + + neighbors := getNeighborsBFS(matrix, current) + for _, neighbor := range neighbors { + if !visited[neighbor] { + parents[neighbor] = current + queue = append(queue, neighbor) + } + } + } + + return nil // Aucun chemin trouvé +} +*/ + func findPathBFS(matrix [20][20]string, start, end Coord) []Coord { queue := []Coord{start} visited := make(map[Coord]bool) @@ -170,7 +207,7 @@ func getNeighborsBFS(matrix [20][20]string, current Coord) []Coord { newRow, newCol := current[0]+move[0], current[1]+move[1] // Vérifier si la nouvelle position est valide et non visitée - if newRow >= 0 && newRow < len(matrix) && newCol >= 0 && newCol < len(matrix[0]) && (matrix[newRow][newCol] == "_" || matrix[newRow][newCol] == "B") { + if newRow >= 0 && newRow < len(matrix) && newCol >= 0 && newCol < len(matrix[0]) && (matrix[newRow][newCol] != "Q" && matrix[newRow][newCol] != "X") { neighbors = append(neighbors, Coord{newRow, newCol}) } } diff --git a/cmd/simu/main.go b/cmd/simu/main.go index bac00185ea04403b2c5d9c54aaab9934eb55e5da..ea7a7f103863ee5436690dcc853c75b2ef000140 100644 --- a/cmd/simu/main.go +++ b/cmd/simu/main.go @@ -6,7 +6,7 @@ import ( ) func main() { - s := simulation.NewSimulation(3, -1, 600*time.Second) - go simulation.StartAPI(s) + s := simulation.NewSimulation(30, -1, 600*time.Second) + //go simulation.StartAPI(s) s.Run() } diff --git a/simu.go b/simu.go index 6a4597576c15217fb1ff5f6962f41df8eba3249b..69b4e6473aadb0bb38bc5304910678ad1724dcba 100644 --- a/simu.go +++ b/simu.go @@ -3,6 +3,7 @@ package simulation import ( "fmt" "log" + //"math/rand" "sync" "time" ) @@ -21,12 +22,13 @@ var carte [20][20]string = [20][20]string{ {"X", "X", "X", "X", "X", "X", "X", "X", "W", "W", "X", "X", "X", "X", "X", "X", "X", "X", "X", "X"}, {"X", "X", "X", "X", "X", "X", "X", "X", "_", "_", "X", "X", "X", "X", "X", "X", "X", "X", "X", "X"}, {"X", "X", "X", "X", "X", "X", "X", "X", "_", "_", "X", "X", "X", "X", "X", "X", "X", "X", "X", "X"}, - {"X", "X", "X", "X", "X", "X", "X", "X", "_", "_", "X", "X", "X", "X", "X", "X", "X", "X", "X", "X"}, - {"X", "X", "X", "X", "X", "X", "X", "X", "_", "_", "X", "X", "X", "X", "X", "X", "X", "X", "X", "X"}, - {"X", "X", "X", "X", "X", "X", "X", "X", "_", "_", "X", "X", "X", "X", "X", "X", "X", "X", "X", "X"}, - {"X", "X", "X", "X", "X", "X", "X", "X", "_", "_", "X", "X", "X", "X", "X", "X", "_", "_", "_", "X"}, - {"_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_"}, + {"X", "X", "_", "_", "_", "_", "_", "_", "_", "_", "X", "X", "X", "X", "X", "X", "X", "X", "X", "X"}, + {"X", "X", "_", "X", "X", "X", "X", "X", "_", "_", "X", "X", "X", "X", "X", "X", "X", "X", "X", "X"}, + {"X", "X", "_", "X", "X", "X", "X", "X", "_", "_", "X", "X", "X", "X", "X", "X", "X", "X", "X", "X"}, + {"X", "X", "_", "X", "X", "X", "X", "X", "_", "_", "X", "X", "X", "X", "X", "X", "_", "_", "_", "X"}, {"_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_"}, + {"_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "X", "_"}, + {"Q", "Q", "Q", "Q", "Q", "Q", "Q", "Q", "Q", "Q", "Q", "Q", "Q", "Q", "Q", "Q", "Q", "Q", "B", "B"}, {"Q", "Q", "Q", "Q", "Q", "Q", "Q", "Q", "Q", "Q", "Q", "Q", "Q", "Q", "Q", "Q", "Q", "Q", "B", "B"}, {"Q", "Q", "Q", "Q", "Q", "Q", "Q", "Q", "Q", "Q", "Q", "Q", "Q", "Q", "Q", "Q", "Q", "Q", "B", "B"}, {"Q", "Q", "Q", "Q", "Q", "Q", "Q", "Q", "Q", "Q", "Q", "Q", "Q", "Q", "Q", "Q", "Q", "Q", "B", "B"}, @@ -39,6 +41,29 @@ var carte [20][20]string = [20][20]string{ {"X", "X", "X", "X", "S", "S", "X", "X", "X", "X", "X", "X", "E", "E", "X", "X", "X", "X", "X", "X"}, } +var playground [20][20]string = [20][20]string{ + {"_", "X", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_"}, + {"_", "X", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_"}, + {"_", "X", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_"}, + {"_", "X", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_"}, + {"_", "X", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_"}, + {"_", "X", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_"}, + {"_", "X", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_"}, + {"_", "X", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_"}, + {"_", "X", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_"}, + {"_", "X", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_"}, + {"_", "X", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_"}, + {"_", "X", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_"}, + {"_", "X", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_"}, + {"_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_"}, + {"_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_"}, + {"_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_"}, + {"_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_"}, + {"_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_"}, + {"_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_"}, + {"_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_", "_"}, +} + type Simulation struct { env Environment agents []Agent @@ -56,14 +81,17 @@ func NewSimulation(agentCount int, maxStep int, maxDuration time.Duration) (simu simu.maxDuration = maxDuration simu.env = *NewEnvironment([]Agent{}, carte) + //simu.env = *NewEnvironment([]Agent{}, playground) // création des agents et des channels for i := 0; i < agentCount; i++ { // création de l'agent id := fmt.Sprintf("Agent #%d", i) syncChan := make(chan int) - ag := NewAgent(id, &simu.env, syncChan, 1, 0, true, Coord{0, 8+i%2}, Coord{0, 8+i%2}, &UsagerLambda{},Coord{0, 8+i%2}, Coord{12-4*(i%2),18-15*(i%2)}) - fmt.Println(ag.id,ag.departure,ag.destination) + ag := NewAgent(id, &simu.env, syncChan, 1, 0, true, Coord{0, 8 + i%2}, Coord{0, 8 + i%2}, &UsagerLambda{}, Coord{0, 8 + i%2}, Coord{12 - 4*(i%2), 18 - 15*(i%2)}) + + //ag := NewAgent(id, &simu.env, syncChan, 1, 0, true, Coord{4,10}, Coord{4,10}, &UsagerLambda{}, Coord{4,10}, Coord{0, 0}) + // ajout de l'agent à la simulation simu.agents = append(simu.agents, *ag) @@ -86,7 +114,7 @@ func (simu *Simulation) Run() { go simu.Print() // Démarrage des agents - // Démarrage des agents + var wg sync.WaitGroup for _, agt := range simu.agents { wg.Add(1) @@ -94,11 +122,11 @@ func (simu *Simulation) Run() { defer wg.Done() agent.Start() }(agt) -} - + } + // On sauvegarde la date du début de la simulation simu.start = time.Now() - + // Lancement de l'orchestration de tous les agents // simu.step += 1 // plus de sens for _, agt := range simu.agents { @@ -124,7 +152,7 @@ func (simu *Simulation) Print() { for i := 0; i < 20; i++ { fmt.Println(simu.env.station[i]) } - //time.Sleep(time.Second / 60) // 60 fps ! + //time.Sleep(time.Second / 4) // 60 fps ! time.Sleep(time.Second) // 1 fps ! //fmt.Print("\033[H\033[2J") // effacement du terminal }