Skip to content

Agent_Based_Clustering

Julius Bañgate edited this page Apr 16, 2023 · 3 revisions
Annotation 2023-04-16 045308_kMEANS

Path: Library models/Toy Models/Learning/models/Mas KMeans.gaml

/**
* Name: Agent Based Clustering
* Author: Jean-Danie Zucker with Patrick Taillandier's and Arnaud Grignard's Help
* Description: This model displays the step to stpe algorithm of k-means
* See for  https://en.wikipedia.org/wiki/K-means_clustering ...
* Clustering
* The k-medoid could be added
* To be added stop the simulation when convergence is reached
* To be added an overlay
* To be added position the points at the begining usug user interaction model...
*/
model MASKMEANS


global
{
// the number of classes to create (kmeans)
// It corresponds to the centroids
	int k ;
	// the number of points
	int N ;
	//number of dimensions
	int dimensions <- 2;
	float globalIntraDistance <- 0.0;
	bool converged <- false;
	font regular <- font("Helvetica", 14, # bold);
	init
	{
		//create datapoints agents
		create datapoints number: N
		{
			if (dimensions = 3)
			{
				location <- { rnd(100), rnd(100), rnd(100) };
			}

			if (dimensions = 2)
			{
				location <- { rnd(100), rnd(100) };
			}

		}
		//create centroid agents
		create centroids number: k
		{
			if (dimensions = 3)
			{
				location <- { rnd(100), rnd(100), rnd(100) };
			}

			if (dimensions = 2)
			{
				location <- { rnd(100), rnd(100) };
			}

		}
		int K <- length(centroids);
		if (K > 0) {loop i from:0 to: K-1 { ask centroids[i] { color_kmeans  <- hsb(i/K,1,1); }}}
					
					
			//give a random color to each centroid (i.e. to each datapoints agents of the group)
			//		loop c over: centroids { rgb col <- rnd_color(255); ask c { color_kmeans <- col;}}
		
	
	}
	
	reflex pauseAtConvergence when: converged { do pause;
		
	}
	reflex assign_points_to_centroid when: even(cycle)
	{
	    // The "assignment" step is also referred to as expectation step,
		ask centroids
		{
			mypoints <- list<datapoints> ([]);
		}

		loop pt over: datapoints
		{
			ask pt
			{
				if not empty(centroids) {
					mycenter <- centroids closest_to self;
					color_kmeans <- mycenter.color_kmeans;
					add self to: mycenter.mypoints;
				}
			}

		}

	}

	reflex update_centroids when: not even(cycle)
	{
	// the "update step" as maximization step,
	// making this algorithm a variant of the generalized expectation-maximization algorithm.

	//We give a random color to each group (i.e. to each datapoints agents of the group)
		ask centroids where (not empty(each.mypoints))
		{
			location <- mean(mypoints collect each.location);
			float oldist <- myIntraDistance;
			myIntraDistance <- mypoints sum_of (each distance_to self);
			converged <- (oldist-myIntraDistance) with_precision(2) = 0;
		}
		
		globalIntraDistance <- centroids sum_of (each.myIntraDistance);
	}

}

species datapoints
{
	rgb color_kmeans <- rgb(225,225,225) 	;
	centroids mycenter;
	aspect kmeans_aspect2D
	{
		draw circle(2) color: color_kmeans border:color_kmeans-25;
	}

	aspect kmeans_aspect3D
	{
		draw sphere(2) color: color_kmeans ;
	}

}

species centroids
{
	rgb color_kmeans <-  rgb(225,225,225);
	list<datapoints> mypoints;
	float myIntraDistance <- 0.0;
	aspect kmeans_aspect2D
	{
		// explicitly loops over a copy of the points to avoid concurrency issues with the simulation
		loop pt over: copy(mypoints)
		{
			draw line([location, pt]) + 0.1 color: color_kmeans;
		}
		draw cross(3, 0.5) color: color_kmeans border:color_kmeans-25;
	}

	aspect kmeans_aspect3D
	{
		loop pt over: mypoints
		{
			draw line([location, pt], 0.2) color: color_kmeans;
		}
		draw cube(5) color: color_kmeans border: # black;
		
	}

}

experiment clustering2D type: gui
{
	parameter "Number of clusters to split the data into" var: k init:4 category: "KMEANS";
	parameter "Number of points to be clustered" var: N init: 500;
	
		
	point target <- { 20, 95 };
	output
	{
		
		display map_kmeans 
		{

			graphics "Full target"
			{
				draw rectangle(120, 4) color: # yellow  at: { 50, 2 };
				draw rectangle(120, 4) color: # yellow at: target + { 30, 2 };
				if (not even(cycle))
				{
				// the "update step" as maximization step, (a mean is done to recenter)
					if ! (globalIntraDistance = 0) {
						draw "Current step was an estimation Step (each point is assigned the color of his nearest centroid" at:{ 12, 2 } font: regular color: # green;
						draw "Current sum of cluster intra-distance " + globalIntraDistance with_precision(1)  at:{ 12, 4 } font: regular color: # black;
						}
					if converged {draw "Algorithm has converged !" + " cycle "+ cycle at:{ 60, 4 } font: regular color: # red;}
					draw "Next step is a maximisation step the centroid will move to the center of its  associated points" at: target + { 0, 3 } font: regular color: # red;
				} else
				{
					if ! (globalIntraDistance = 0) {
						draw "Current step was a maximisation step the centroid moved to the center of its associated points" at: { 12, 2 } font: regular color: # red;
						draw "Current sum of cluster intra-distance " + globalIntraDistance with_precision(1)  at:{ 12, 4 } font: regular color: # black;
						}
					if converged {draw "Algorithm has converged !"  at:{ 60, 4 } font: regular color: # red;}
					draw "Next step is an estimation Step (each point is assigned the color of his nearest centroid" at: target + { 0, 3 } font: regular color: # green;
				}

			}
			species datapoints aspect: kmeans_aspect2D transparency:0.4;
			species centroids aspect: kmeans_aspect2D;

		}

	}
}

experiment clustering3D type: gui 
{
	parameter "Number of clusters to split the data into" var: k init:4 min: 0 max: 10 category: "KMEANS";
	parameter "Number of points to be clustered" var: N init:1000 ;
	parameter "Number of dimensions (2D or 3D)" var: dimensions init: 3 min: 2 max: 3;
	font regular <- font("Helvetica", 14, # bold);
	point target <- { 20, 95 };
	
	// The display is explicitly synchronized to avoid concurrency issues (if the points are changed in the simulation while being displayed)
	output synchronized: true
	{
		display map_kmeans type: 3d
		{
			species datapoints aspect: kmeans_aspect3D transparency:0.4;
			species centroids aspect: kmeans_aspect3D;
		}

	}

}
  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