Skip to content

InteractionBetweenAgents

benoitgaudou edited this page Aug 20, 2019 · 14 revisions

Interaction between agents

In this part, we will learn how interactions between agents works. We will also present you a bunch of operators useful for your modelling.

Index

The ask statement

The ask statement can be used in any reflex or action scope. It is used to specify the interaction between the instances of your species and the other agents. You only have to specify the species of the agents you want to interact with. Here are the different ways of calling the ask statement:

  • If you want to interact with one particular agent (for example, defined as an attribute of your species):
species my_species {
    agent target;
    
    reflex update {
	ask target {
	    // statements
	}
    }
}
  • If you want to interact with a group of agents:
species my_species {
    list<agent> targets;

    reflex update {
	ask targets {
	    // statements
	}
    }
}
  • If you want to interact with agents, as if they were instance of a certain species (can raise an error if it's not the case!):
species my_species {
    list<agent> targets;

    reflex update {
	ask targets as:my_species {
	    // statements
	}
    }
}
  • If you want to interact with all the agents of a species (note that the name of the species can be used in the ask, and in many other situations, as the population of this species, i.e. the list of agents instance of this species):
species my_species {
    reflex update {
	ask other_species {
	    // statements
	}
    }
}

species other_species { }

Note that you can use the attribute population of species if you find it more explicit:

ask other_species.population
  • If you want to interact with all the agents of a particular species from a list of agents (for example, using the global variable "agents"):
species my_specie {
    reflex update {
	ask agents of_species my_specie {
	    // statements
	}
    }
}

Pseudo-variables

Once you are in the ask scope, you can use some pseudo-variables to refer to the receiver agent (the one specified just after the ask statement) or the transmitter agent (the agent which is asking). We use the pseudo-variable self to refer to the receiver agent, and the pseudo-variable myself to refer to the transmitter agent. The pseudo variable self can be omitted when calling actions or attributes.

species speciesA {
    init {
	name <- "speciesA";
    }
	
    reflex update {
	ask speciesB {
            write name; // output : "speciesB"			
            write self.name; // output : "speciesB"
	    write myself.name; // output : "speciesA"
        }
    }
}

species speciesB {
    init {
	name <- "speciesB";
    }
}

Now, if we introduce a third species, we can write an ask statement inside another.

species speciesA {
    init {
	name <- "speciesA";
    }

    reflex update {
	ask speciesB {
	    write self.name; // output : "speciesB"
	    write myself.name; // output : "speciesA"
	    ask speciesC {
		write self.name; // output : "speciesC"
		write myself.name; // output : "speciesB"
	    }
	}
    }
}

species speciesB {
    init {
	name <- "speciesB";
    }
}

species speciesC {
    init {
	name <- "speciesC";
    }
}

Nb: try to avoid multiple imbrications of ask statements. Most of the time, there is another way to do the same thing.

Some useful interaction operators

The operator at_distance can be used to know the list of agents that are in a certain distance from another agent.

species my_species {
    reflex update {
	list<agent> neighbors <- agents at_distance(5);
	// neighbors contains the list of all the agents located at a distance <= 5 from the caller agent.
    }
}

The operator closest_to returns the closest agent of a position among a container.

species my_species {
    reflex update {
	agent agentA <- agents closest_to(self);
	// agentA contains the closest agent from the caller agent.
	agent agentB <- other_specie closest_to({2,3});
	// agentB contains the closest instance of other_specie from the location {2,3}.
    }
}

species other_specie { }

Example

To practice those notions, here is a short basic example. Let's build a model with a given number of agents with a circle display (keep in mind that their shape has kept its default value: a point). They can move randomly on the environment (i.e. here move can be understood as changing its location), and when they are close enough from another agent, a line is displayed between them. This line is destroyed when the distance between the two agents is too important.

Hint: use the operator polyline to construct a line. List the points between angle brackets [ and ].

images/connect_the_neighbors.png

Here is one example of implementation:

model connect_the_neighbors

global{
    float speed <- 0.2;
    float distance_to_intercept <- 10.0;
    int number_of_circle <- 100;
	
    init {
	create my_species number:number_of_circle;
    }
}

species my_species {
    reflex move {
	location <- {location.x+rnd(-speed,speed),location.y+rnd(-speed,speed)};
    }
	
    aspect default {
	draw circle(1) color: #yellow border: #black;
	ask my_species at_distance(distance_to_intercept) {
	    draw polyline([self.location,myself.location]) color:#black;
	}
    }
}

experiment my_experiment type:gui {
    output{
	display myDisplay {
	    species my_species aspect:default;
	}
    }
}
  1. What's new (Changelog)
  1. Installation and Launching
    1. Installation
    2. Launching GAMA
    3. Updating GAMA
    4. Installing Plugins
  2. Workspace, Projects and Models
    1. Navigating in the Workspace
    2. Changing Workspace
    3. Importing Models
  3. Editing Models
    1. GAML Editor (Generalities)
    2. GAML Editor Tools
    3. Validation of Models
  4. Running Experiments
    1. Launching Experiments
    2. Experiments User interface
    3. Controls of experiments
    4. Parameters view
    5. Inspectors and monitors
    6. Displays
    7. Batch Specific UI
    8. Errors View
  5. Running Headless
    1. Headless Batch
    2. Headless Server
    3. Headless Legacy
  6. Preferences
  7. Troubleshooting
  1. Introduction
    1. Start with GAML
    2. Organization of a Model
    3. Basic programming concepts in GAML
  2. Manipulate basic Species
  3. Global Species
    1. Regular Species
    2. Defining Actions and Behaviors
    3. Interaction between Agents
    4. Attaching Skills
    5. Inheritance
  4. Defining Advanced Species
    1. Grid Species
    2. Graph Species
    3. Mirror Species
    4. Multi-Level Architecture
  5. Defining GUI Experiment
    1. Defining Parameters
    2. Defining Displays Generalities
    3. Defining 3D Displays
    4. Defining Charts
    5. Defining Monitors and Inspectors
    6. Defining Export files
    7. Defining User Interaction
  6. Exploring Models
    1. Run Several Simulations
    2. Batch Experiments
    3. Exploration Methods
  7. Optimizing Model Section
    1. Runtime Concepts
    2. Optimizing Models
  8. Multi-Paradigm Modeling
    1. Control Architecture
    2. Defining Differential Equations
  1. Manipulate OSM Data
  2. Diffusion
  3. Using Database
  4. Using FIPA ACL
  5. Using BDI with BEN
  6. Using Driving Skill
  7. Manipulate dates
  8. Manipulate lights
  9. Using comodel
  10. Save and restore Simulations
  11. Using network
  12. Headless mode
  13. Using Headless
  14. Writing Unit Tests
  15. Ensure model's reproducibility
  16. Going further with extensions
    1. Calling R
    2. Using Graphical Editor
    3. Using Git from GAMA
  1. Built-in Species
  2. Built-in Skills
  3. Built-in Architecture
  4. Statements
  5. Data Type
  6. File Type
  7. Expressions
    1. Literals
    2. Units and Constants
    3. Pseudo Variables
    4. Variables And Attributes
    5. Operators [A-A]
    6. Operators [B-C]
    7. Operators [D-H]
    8. Operators [I-M]
    9. Operators [N-R]
    10. Operators [S-Z]
  8. Exhaustive list of GAMA Keywords
  1. Installing the GIT version
  2. Developing Extensions
    1. Developing Plugins
    2. Developing Skills
    3. Developing Statements
    4. Developing Operators
    5. Developing Types
    6. Developing Species
    7. Developing Control Architectures
    8. Index of annotations
  3. Introduction to GAMA Java API
    1. Architecture of GAMA
    2. IScope
  4. Using GAMA flags
  5. Creating a release of GAMA
  6. Documentation generation

  1. Predator Prey
  2. Road Traffic
  3. 3D Tutorial
  4. Incremental Model
  5. Luneray's flu
  6. BDI Agents

  1. Team
  2. Projects using GAMA
  3. Scientific References
  4. Training Sessions

Resources

  1. Videos
  2. Conferences
  3. Code Examples
  4. Pedagogical materials
Clone this wiki locally