diff --git a/examples/boltzmann_wealth_model_experimental/Readme.md b/examples/boltzmann_wealth_model_experimental/Readme.md
new file mode 100644
index 00000000..fc27fdb2
--- /dev/null
+++ b/examples/boltzmann_wealth_model_experimental/Readme.md
@@ -0,0 +1,44 @@
+# Boltzmann Wealth Model (Tutorial)
+
+## Summary
+
+A simple model of agents exchanging wealth. All agents start with the same amount of money. Every step, each agent with one unit of money or more gives one unit of wealth to another random agent. This is the model described in the [Intro Tutorial](https://mesa.readthedocs.io/en/latest/tutorials/intro_tutorial.html), with the completed code.
+
+If you want to go over the step-by-step tutorial, please go and run the [Jupyter Notebook](https://github.com/projectmesa/mesa/blob/main/docs/tutorials/intro_tutorial.ipynb). The code here runs the finalized code in the last cells directly.
+
+As the model runs, the distribution of wealth among agents goes from being perfectly uniform (all agents have the same starting wealth), to highly skewed -- a small number have high wealth, more have none at all.
+
+## How to Run
+
+To follow the tutorial example, launch the Jupyter Notebook and run the code in ``Introduction to Mesa Tutorial Code.ipynb`` which you can find in the main mesa repo [here](https://github.com/projectmesa/mesa/blob/main/docs/tutorials/intro_tutorial.ipynb)
+
+Make sure to install the requirements first:
+
+```
+ pip install -r requirements.txt
+```
+
+To launch the interactive server, as described in the [last section of the tutorial](https://mesa.readthedocs.io/en/latest/tutorials/intro_tutorial.html#adding-visualization), run:
+
+```
+ $ solara run app.py
+```
+
+If your browser doesn't open automatically, point it to [http://127.0.0.1:8765/](http://127.0.0.1:8765/). When the visualization loads, click on the Play button.
+
+
+## Files
+
+* ``model.py``: Final version of the model.
+* ``app.py``: Code for the interactive visualization.
+
+## Further Reading
+
+The full tutorial describing how the model is built can be found at:
+https://mesa.readthedocs.io/en/latest/tutorials/intro_tutorial.html
+
+This model is drawn from econophysics and presents a statistical mechanics approach to wealth distribution. Some examples of further reading on the topic can be found at:
+
+[Milakovic, M. A Statistical Equilibrium Model of Wealth Distribution. February, 2001.](https://editorialexpress.com/cgi-bin/conference/download.cgi?db_name=SCE2001&paper_id=214)
+
+[Dragulescu, A and Yakovenko, V. Statistical Mechanics of Money, Income, and Wealth: A Short Survey. November, 2002](http://arxiv.org/pdf/cond-mat/0211175v1.pdf)
diff --git a/examples/boltzmann_wealth_model_experimental/__init__.py b/examples/boltzmann_wealth_model_experimental/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/examples/boltzmann_wealth_model_experimental/app.py b/examples/boltzmann_wealth_model_experimental/app.py
new file mode 100644
index 00000000..0fea7577
--- /dev/null
+++ b/examples/boltzmann_wealth_model_experimental/app.py
@@ -0,0 +1,34 @@
+from mesa_models.experimental import JupyterViz
+from model import BoltzmannWealthModel
+
+
+def agent_portrayal(agent):
+ size = 10
+ color = "tab:red"
+ if agent.wealth > 0:
+ size = 50
+ color = "tab:blue"
+ return {"size": size, "color": color}
+
+
+model_params = {
+ "N": {
+ "type": "SliderInt",
+ "value": 50,
+ "label": "Number of agents:",
+ "min": 10,
+ "max": 100,
+ "step": 1,
+ },
+ "width": 10,
+ "height": 10,
+}
+
+page = JupyterViz(
+ BoltzmannWealthModel,
+ model_params,
+ measures=["Gini"],
+ name="Money Model",
+ agent_portrayal=agent_portrayal,
+)
+page # noqa
diff --git a/examples/boltzmann_wealth_model_experimental/model.py b/examples/boltzmann_wealth_model_experimental/model.py
new file mode 100644
index 00000000..0f61b883
--- /dev/null
+++ b/examples/boltzmann_wealth_model_experimental/model.py
@@ -0,0 +1,76 @@
+import mesa
+
+
+def compute_gini(model):
+ agent_wealths = [agent.wealth for agent in model.schedule.agents]
+ x = sorted(agent_wealths)
+ N = model.num_agents
+ B = sum(xi * (N - i) for i, xi in enumerate(x)) / (N * sum(x))
+ return 1 + (1 / N) - 2 * B
+
+
+class BoltzmannWealthModel(mesa.Model):
+ """A simple model of an economy where agents exchange currency at random.
+
+ All the agents begin with one unit of currency, and each time step can give
+ a unit of currency to another agent. Note how, over time, this produces a
+ highly skewed distribution of wealth.
+ """
+
+ def __init__(self, N=100, width=10, height=10):
+ self.num_agents = N
+ self.grid = mesa.space.MultiGrid(width, height, True)
+ self.schedule = mesa.time.RandomActivation(self)
+ self.datacollector = mesa.DataCollector(
+ model_reporters={"Gini": compute_gini}, agent_reporters={"Wealth": "wealth"}
+ )
+ # Create agents
+ for i in range(self.num_agents):
+ a = MoneyAgent(i, self)
+ self.schedule.add(a)
+ # Add the agent to a random grid cell
+ x = self.random.randrange(self.grid.width)
+ y = self.random.randrange(self.grid.height)
+ self.grid.place_agent(a, (x, y))
+
+ self.running = True
+ self.datacollector.collect(self)
+
+ def step(self):
+ self.schedule.step()
+ # collect data
+ self.datacollector.collect(self)
+
+ def run_model(self, n):
+ for i in range(n):
+ self.step()
+
+
+class MoneyAgent(mesa.Agent):
+ """An agent with fixed initial wealth."""
+
+ def __init__(self, unique_id, model):
+ super().__init__(unique_id, model)
+ self.wealth = 1
+
+ def move(self):
+ possible_steps = self.model.grid.get_neighborhood(
+ self.pos, moore=True, include_center=False
+ )
+ new_position = self.random.choice(possible_steps)
+ self.model.grid.move_agent(self, new_position)
+
+ def give_money(self):
+ cellmates = self.model.grid.get_cell_list_contents([self.pos])
+ cellmates.pop(
+ cellmates.index(self)
+ ) # Ensure agent is not giving money to itself
+ if len(cellmates) > 0:
+ other = self.random.choice(cellmates)
+ other.wealth += 1
+ self.wealth -= 1
+
+ def step(self):
+ self.move()
+ if self.wealth > 0:
+ self.give_money()
diff --git a/examples/boltzmann_wealth_model_experimental/requirements.txt b/examples/boltzmann_wealth_model_experimental/requirements.txt
new file mode 100644
index 00000000..cd191a90
--- /dev/null
+++ b/examples/boltzmann_wealth_model_experimental/requirements.txt
@@ -0,0 +1,3 @@
+mesa~=1.1
+solara
+git+https://github.com/projectmesa/mesa-examples
diff --git a/examples/schelling_experimental/README.md b/examples/schelling_experimental/README.md
new file mode 100644
index 00000000..b0116b55
--- /dev/null
+++ b/examples/schelling_experimental/README.md
@@ -0,0 +1,48 @@
+# Schelling Segregation Model
+
+## Summary
+
+The Schelling segregation model is a classic agent-based model, demonstrating how even a mild preference for similar neighbors can lead to a much higher degree of segregation than we would intuitively expect. The model consists of agents on a square grid, where each grid cell can contain at most one agent. Agents come in two colors: red and blue. They are happy if a certain number of their eight possible neighbors are of the same color, and unhappy otherwise. Unhappy agents will pick a random empty cell to move to each step, until they are happy. The model keeps running until there are no unhappy agents.
+
+By default, the number of similar neighbors the agents need to be happy is set to 3. That means the agents would be perfectly happy with a majority of their neighbors being of a different color (e.g. a Blue agent would be happy with five Red neighbors and three Blue ones). Despite this, the model consistently leads to a high degree of segregation, with most agents ending up with no neighbors of a different color.
+
+## Installation
+
+To install the dependencies use pip and the requirements.txt in this directory. e.g.
+
+```
+ $ pip install -r requirements.txt
+```
+
+## How to Run
+
+To run the model interactively, in this directory, run the following command
+
+```
+ $ solara run app.py
+```
+
+Then open your browser to [http://127.0.0.1:8765/](http://127.0.0.1:8765/) and click the Play button.
+
+To view and run some example model analyses, launch the IPython Notebook and open ``analysis.ipynb``. Visualizing the analysis also requires [matplotlib](http://matplotlib.org/).
+
+## How to Run without the GUI
+
+To run the model with the grid displayed as an ASCII text, run `python run_ascii.py` in this directory.
+
+## Files
+
+* ``app.py``: Code for the interactive visualization.
+* ``run_ascii.py``: Run the model in text mode.
+* ``schelling.py``: Contains the agent class, and the overall model class.
+* ``analysis.ipynb``: Notebook demonstrating how to run experiments and parameter sweeps on the model.
+
+## Further Reading
+
+Schelling's original paper describing the model:
+
+[Schelling, Thomas C. Dynamic Models of Segregation. Journal of Mathematical Sociology. 1971, Vol. 1, pp 143-186.](https://www.stat.berkeley.edu/~aldous/157/Papers/Schelling_Seg_Models.pdf)
+
+An interactive, browser-based explanation and implementation:
+
+[Parable of the Polygons](http://ncase.me/polygons/), by Vi Hart and Nicky Case.
diff --git a/examples/schelling_experimental/__init__.py b/examples/schelling_experimental/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/examples/schelling_experimental/analysis.ipynb b/examples/schelling_experimental/analysis.ipynb
new file mode 100644
index 00000000..50f382c6
--- /dev/null
+++ b/examples/schelling_experimental/analysis.ipynb
@@ -0,0 +1,457 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Schelling Segregation Model\n",
+ "\n",
+ "## Background\n",
+ "\n",
+ "The Schelling (1971) segregation model is a classic of agent-based modeling, demonstrating how agents following simple rules lead to the emergence of qualitatively different macro-level outcomes. Agents are randomly placed on a grid. There are two types of agents, one constituting the majority and the other the minority. All agents want a certain number (generally, 3) of their 8 surrounding neighbors to be of the same type in order for them to be happy. Unhappy agents will move to a random available grid space. While individual agents do not have a preference for a segregated outcome (e.g. they would be happy with 3 similar neighbors and 5 different ones), the aggregate outcome is nevertheless heavily segregated.\n",
+ "\n",
+ "## Implementation\n",
+ "\n",
+ "This is a demonstration of running a Mesa model in an IPython Notebook. The actual model and agent code are implemented in Schelling.py, in the same directory as this notebook. Below, we will import the model class, instantiate it, run it, and plot the time series of the number of happy agents."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import matplotlib.pyplot as plt\n",
+ "\n",
+ "%matplotlib inline\n",
+ "\n",
+ "from model import Schelling"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now we instantiate a model instance: a 10x10 grid, with an 80% change of an agent being placed in each cell, approximately 20% of agents set as minorities, and agents wanting at least 3 similar neighbors."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "model = Schelling(10, 10, 0.8, 0.2, 3)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We want to run the model until all the agents are happy with where they are. However, there's no guarantee that a given model instantiation will *ever* settle down. So let's run it for either 100 steps or until it stops on its own, whichever comes first:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "100\n"
+ ]
+ }
+ ],
+ "source": [
+ "while model.running and model.schedule.steps < 100:\n",
+ " model.step()\n",
+ "print(model.schedule.steps) # Show how many steps have actually run"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The model has a DataCollector object, which checks and stores how many agents are happy at the end of each step. It can also generate a pandas DataFrame of the data it has collected:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "model_out = model.datacollector.get_model_vars_dataframe()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "