Chapter 7 Appendix B: Classroom Labs and Exploratory Activities

7.1 Purpose of This Appendix

The simulations in lifesimulatoR are designed not only to illustrate origin-of-life concepts but also to encourage exploration and scientific thinking.

The activities in this appendix allow students to investigate how changing model parameters influences system behavior. The goal is not to discover the “correct” origin-of-life scenario, but rather to understand how variation, selection, organization, and emergence interact in simplified models.

Each activity follows the scientific method:

  1. Form a hypothesis.
  2. Run simulations.
  3. Observe results.
  4. Interpret patterns.
  5. Identify limitations.
  6. Propose improvements.

These exercises can be used in classrooms, workshops, independent study projects, or science communication activities.

7.2 Lab 1: Mutation Rate and Evolutionary Change

7.2.1 Scientific Background

Mutation introduces novelty into a population.

Without mutation, evolution cannot explore new possibilities. However, excessive mutation may destroy useful information before selection can preserve it.

This creates a classic evolutionary trade-off.

7.2.2 Goal

Investigate how mutation rate affects molecular evolution.

7.2.3 Activity

rates <- c(0, 0.01, 0.05, 0.20)

results <- lapply(rates, function(rate) {
  simulate_abiogenesis(
    n_molecules = 100,
    generations = 100,
    mutation_rate = rate,
    selection_strength = 1,
    seed = 123
  )
})

names(results) <- paste0("mutation_", rates)

lapply(results, tail)
## $mutation_0
## # A tibble: 6 × 6
##   generation n_molecules mean_length mean_fitness diversity max_fitness
##        <int>       <int>       <dbl>        <dbl>     <int>       <dbl>
## 1         95         100          13         1.24         2        1.24
## 2         96         100          13         1.24         2        1.24
## 3         97         100          13         1.24         2        1.24
## 4         98         100          13         1.24         2        1.24
## 5         99         100          13         1.24         2        1.24
## 6        100         100          13         1.24         2        1.24
## 
## $mutation_0.01
## # A tibble: 6 × 6
##   generation n_molecules mean_length mean_fitness diversity max_fitness
##        <int>       <int>       <dbl>        <dbl>     <int>       <dbl>
## 1         95         100        11.4         1.24        42        1.25
## 2         96         100        11.5         1.24        33        1.25
## 3         97         100        11.5         1.24        35        1.25
## 4         98         100        11.7         1.24        36        1.25
## 5         99         100        11.8         1.24        37        1.25
## 6        100         100        11.9         1.25        40        1.25
## 
## $mutation_0.05
## # A tibble: 6 × 6
##   generation n_molecules mean_length mean_fitness diversity max_fitness
##        <int>       <int>       <dbl>        <dbl>     <int>       <dbl>
## 1         95         100          12         1.23        85        1.25
## 2         96         100          12         1.23        82        1.25
## 3         97         100          12         1.24        76        1.25
## 4         98         100          12         1.25        77        1.25
## 5         99         100          12         1.25        75        1.25
## 6        100         100          12         1.25        74        1.25
## 
## $mutation_0.2
## # A tibble: 6 × 6
##   generation n_molecules mean_length mean_fitness diversity max_fitness
##        <int>       <int>       <dbl>        <dbl>     <int>       <dbl>
## 1         95         100        12.8         1.23        99        1.25
## 2         96         100        12.7         1.24       100        1.25
## 3         97         100        12.7         1.23       100        1.25
## 4         98         100        12.7         1.22       100        1.25
## 5         99         100        12.5         1.24        99        1.25
## 6        100         100        12.5         1.24        99        1.25

7.2.4 Questions

  1. Which mutation rate produces the highest fitness?
  2. Which mutation rate produces the highest diversity?
  3. Is there a trade-off between diversity and fitness?
  4. What happens when mutation becomes extremely high?
  5. Can evolution occur without mutation?

7.2.5 Extension

Try mutation rates above 0.20 and compare the outcomes.

7.3 Lab 2: Selection Strength and Adaptation

7.3.1 Scientific Background

Selection favors some variants over others.

Stronger selection increases differences among variants, while weaker selection allows more variants to persist.

7.3.2 Goal

Explore how selection strength influences evolutionary outcomes.

7.3.3 Activity

strengths <- c(0, 0.5, 1, 3)

selection_results <- lapply(strengths, function(s) {
  simulate_abiogenesis(
    n_molecules = 100,
    generations = 100,
    mutation_rate = 0.02,
    selection_strength = s,
    seed = 123
  )
})

names(selection_results) <- paste0("selection_", strengths)

lapply(selection_results, tail)
## $selection_0
## # A tibble: 6 × 6
##   generation n_molecules mean_length mean_fitness diversity max_fitness
##        <int>       <int>       <dbl>        <dbl>     <int>       <dbl>
## 1         95         100        11.1         1.12        57        1.20
## 2         96         100        11.0         1.11        54        1.20
## 3         97         100        11.6         1.09        63        1.20
## 4         98         100        11.5         1.07        60        1.20
## 5         99         100        12.2         1.06        59        1.20
## 6        100         100        12.2         1.04        64        1.20
## 
## $selection_0.5
## # A tibble: 6 × 6
##   generation n_molecules mean_length mean_fitness diversity max_fitness
##        <int>       <int>       <dbl>        <dbl>     <int>       <dbl>
## 1         95         100          13         1.22        50        1.24
## 2         96         100          13         1.23        49        1.24
## 3         97         100          13         1.23        59        1.24
## 4         98         100          13         1.23        57        1.24
## 5         99         100          13         1.22        62        1.24
## 6        100         100          13         1.22        63        1.24
## 
## $selection_1
## # A tibble: 6 × 6
##   generation n_molecules mean_length mean_fitness diversity max_fitness
##        <int>       <int>       <dbl>        <dbl>     <int>       <dbl>
## 1         95         100        10.6         1.19        56        1.24
## 2         96         100        10.9         1.19        55        1.24
## 3         97         100        10.8         1.19        55        1.20
## 4         98         100        10.8         1.19        51        1.20
## 5         99         100        10.8         1.20        56        1.20
## 6        100         100        10.8         1.20        56        1.20
## 
## $selection_3
## # A tibble: 6 × 6
##   generation n_molecules mean_length mean_fitness diversity max_fitness
##        <int>       <int>       <dbl>        <dbl>     <int>       <dbl>
## 1         95         100          12         1.25        48        1.25
## 2         96         100          12         1.25        51        1.25
## 3         97         100          12         1.25        55        1.25
## 4         98         100          12         1.25        54        1.25
## 5         99         100          12         1.25        50        1.25
## 6        100         100          12         1.25        45        1.25

7.3.4 Questions

  1. What happens when selection strength equals zero?
  2. Does stronger selection always increase fitness?
  3. How does diversity change as selection becomes stronger?
  4. Can strong selection reduce exploration of new possibilities?

7.3.5 Extension

Plot diversity and fitness for each selection strength and compare the trajectories.

7.4 Lab 3: Diversity Versus Selection

7.4.1 Scientific Background

Mutation generates diversity, while selection often reduces diversity.

Understanding the balance between these forces is a central problem in evolutionary theory.

7.4.2 Goal

Explore how diversity changes under different levels of selection.

7.4.3 Activity

strengths <- c(0, 1, 3, 5)

diversity_results <- lapply(strengths, function(s) {
  simulate_abiogenesis(
    n_molecules = 100,
    generations = 100,
    mutation_rate = 0.02,
    selection_strength = s,
    seed = 123
  )
})

names(diversity_results) <- paste0("selection_", strengths)

lapply(diversity_results, tail)
## $selection_0
## # A tibble: 6 × 6
##   generation n_molecules mean_length mean_fitness diversity max_fitness
##        <int>       <int>       <dbl>        <dbl>     <int>       <dbl>
## 1         95         100        11.1         1.12        57        1.20
## 2         96         100        11.0         1.11        54        1.20
## 3         97         100        11.6         1.09        63        1.20
## 4         98         100        11.5         1.07        60        1.20
## 5         99         100        12.2         1.06        59        1.20
## 6        100         100        12.2         1.04        64        1.20
## 
## $selection_1
## # A tibble: 6 × 6
##   generation n_molecules mean_length mean_fitness diversity max_fitness
##        <int>       <int>       <dbl>        <dbl>     <int>       <dbl>
## 1         95         100        10.6         1.19        56        1.24
## 2         96         100        10.9         1.19        55        1.24
## 3         97         100        10.8         1.19        55        1.20
## 4         98         100        10.8         1.19        51        1.20
## 5         99         100        10.8         1.20        56        1.20
## 6        100         100        10.8         1.20        56        1.20
## 
## $selection_3
## # A tibble: 6 × 6
##   generation n_molecules mean_length mean_fitness diversity max_fitness
##        <int>       <int>       <dbl>        <dbl>     <int>       <dbl>
## 1         95         100          12         1.25        48        1.25
## 2         96         100          12         1.25        51        1.25
## 3         97         100          12         1.25        55        1.25
## 4         98         100          12         1.25        54        1.25
## 5         99         100          12         1.25        50        1.25
## 6        100         100          12         1.25        45        1.25
## 
## $selection_5
## # A tibble: 6 × 6
##   generation n_molecules mean_length mean_fitness diversity max_fitness
##        <int>       <int>       <dbl>        <dbl>     <int>       <dbl>
## 1         95         100          12         1.25        53        1.25
## 2         96         100          12         1.25        50        1.25
## 3         97         100          12         1.25        54        1.25
## 4         98         100          12         1.25        62        1.25
## 5         99         100          12         1.25        51        1.25
## 6        100         100          12         1.25        53        1.25

7.4.4 Questions

  1. Does strong selection always reduce diversity?
  2. Can diversity remain high while fitness increases?
  3. Why might evolution require both diversity and selection?
  4. Is the most diverse population necessarily the most successful?

7.4.5 Extension

Calculate diversity through time and compare different selection strengths.

7.5 Lab 4: Protocell Leakage and Compartment Stability

7.5.1 Scientific Background

Early compartments likely faced a difficult challenge.

They needed to retain useful molecules while still exchanging materials with the environment.

Too much leakage may prevent growth. Too little exchange may limit access to resources.

7.5.2 Goal

Explore how membrane leakage affects protocell populations.

7.5.3 Activity

leakages <- c(0.01, 0.03, 0.10, 0.20)

leakage_results <- lapply(leakages, function(l) {
  protocell_simulation(
    n_cells = 20,
    steps = 100,
    leakage_rate = l,
    seed = 123
  )
})

names(leakage_results) <- paste0("leakage_", leakages)

lapply(leakage_results, tail)
## $leakage_0.01
## # A tibble: 6 × 4
##    step n_cells mean_abundance max_abundance
##   <int>   <int>          <dbl>         <dbl>
## 1    95      74           6.65          9.73
## 2    96      74           6.78          9.88
## 3    97      75           6.84          9.95
## 4    98      76           6.89          9.85
## 5    99      77           6.95         10.00
## 6   100      79           6.91          9.89
## 
## $leakage_0.03
## # A tibble: 6 × 4
##    step n_cells mean_abundance max_abundance
##   <int>   <int>          <dbl>         <dbl>
## 1    95      20           6.84          7.44
## 2    96      20           6.85          7.41
## 3    97      20           6.87          7.43
## 4    98      20           6.89          7.48
## 5    99      20           6.91          7.56
## 6   100      20           6.90          7.49
## 
## $leakage_0.1
## # A tibble: 6 × 4
##    step n_cells mean_abundance max_abundance
##   <int>   <int>          <dbl>         <dbl>
## 1    95      20           2.00          2.28
## 2    96      20           2.00          2.32
## 3    97      20           2.01          2.39
## 4    98      20           2.01          2.35
## 5    99      20           2.02          2.45
## 6   100      20           2.00          2.35
## 
## $leakage_0.2
## # A tibble: 6 × 4
##    step n_cells mean_abundance max_abundance
##   <int>   <int>          <dbl>         <dbl>
## 1    95      20          0.895          1.11
## 2    96      20          0.898          1.13
## 3    97      20          0.900          1.21
## 4    98      20          0.904          1.14
## 5    99      20          0.911          1.21
## 6   100      20          0.892          1.10

7.5.4 Questions

  1. What happens when leakage becomes very high?
  2. Why might some leakage be beneficial?
  3. What membrane properties would be favored by selection?
  4. How might real protocells balance retention and exchange?

7.5.5 Extension

Change both growth rate and leakage rate to explore interactions between them.

7.6 Lab 5: Autocatalytic Network Connectivity

7.6.1 Scientific Background

Autocatalytic networks become more interconnected as catalytic interactions increase.

Highly connected networks may develop feedback loops and self-reinforcing behavior.

7.6.2 Goal

Explore how network connectivity influences system dynamics.

7.6.3 Activity

probabilities <- c(0.05, 0.10, 0.20, 0.40)

network_results <- lapply(probabilities, function(p) {
  autocatalytic_network(
    n_types = 8,
    steps = 50,
    catalysis_probability = p,
    seed = 123
  )
})

names(network_results) <- paste0("catalysis_", probabilities)

lapply(network_results, function(x) tail(x$time_series))
## $catalysis_0.05
## # A tibble: 6 × 3
##    step molecule abundance
##   <int> <chr>        <dbl>
## 1    50 M3            6.13
## 2    50 M4            1.89
## 3    50 M5           14.0 
## 4    50 M6            1.77
## 5    50 M7           14.0 
## 6    50 M8            1.83
## 
## $catalysis_0.1
## # A tibble: 6 × 3
##    step molecule abundance
##   <int> <chr>        <dbl>
## 1    50 M3            6.13
## 2    50 M4            1.89
## 3    50 M5           14.0 
## 4    50 M6            1.77
## 5    50 M7           14.0 
## 6    50 M8            6.06
## 
## $catalysis_0.2
## # A tibble: 6 × 3
##    step molecule abundance
##   <int> <chr>        <dbl>
## 1    50 M3            199.
## 2    50 M4            208.
## 3    50 M5            148.
## 4    50 M6            271.
## 5    50 M7            354.
## 6    50 M8            366.
## 
## $catalysis_0.4
## # A tibble: 6 × 3
##    step molecule abundance
##   <int> <chr>        <dbl>
## 1    50 M3          48509.
## 2    50 M4         156282.
## 3    50 M5         234561.
## 4    50 M6         225042.
## 5    50 M7         194458.
## 6    50 M8         221803.

7.6.4 Questions

  1. How do sparse and dense networks differ?
  2. Which networks appear more stable?
  3. Which networks show stronger feedback effects?
  4. What might happen if connectivity becomes extremely high?

7.6.5 Extension

Experiment with larger numbers of molecule types.

7.7 Lab 6: Comparing Origin-of-Life Frameworks

7.7.1 Scientific Background

Different origin-of-life theories emphasize different processes.

This activity compares three major frameworks represented in the package.

7.7.2 Goal

Compare molecular evolution, protocells, and autocatalytic networks.

7.7.3 Activity

Run:

simulate_abiogenesis()

protocell_simulation()

autocatalytic_network()

7.7.4 Questions

  1. Which origin-of-life framework does each simulation represent?
  2. What does each model explain particularly well?
  3. What does each model fail to explain?
  4. Which model seems most convincing?
  5. Could multiple frameworks be correct simultaneously?

7.7.5 Extension

Create a comparison table summarizing strengths and weaknesses.

7.8 Lab 7: Design Your Own Origin-of-Life Model

7.8.1 Scientific Background

Real scientific research often involves designing new models rather than simply using existing ones.

7.8.2 Goal

Develop a conceptual next-generation origin-of-life simulation.

7.8.3 Activity

Students should design a hypothetical model that combines multiple concepts from the book.

Possible components include:

  • Mutation
  • Selection
  • Molecular diversity
  • Protocells
  • Autocatalytic networks
  • Energy gradients
  • Environmental cycles
  • Spatial structure

7.8.4 Questions

  1. What mechanisms would your model include?
  2. What variables would be tracked?
  3. How would selection operate?
  4. How would new information arise?
  5. How would compartments interact with molecular evolution?

7.8.5 Extension

Create a flowchart or pseudocode describing the proposed simulation.

7.9 Assessment Ideas

Students can be asked to:

  1. Explain parameter choices.
  2. Compare simulation outputs.
  3. Interpret graphs and trends.
  4. Identify model limitations.
  5. Connect simulations to scientific theories.
  6. Propose model improvements.
  7. Design new experiments.
  8. Critically evaluate competing hypotheses.

7.10 Suggested Capstone Project

Students can select one major origin-of-life framework and investigate it in depth.

Possible projects include:

  • RNA World simulations
  • Protocell evolution
  • Autocatalytic networks
  • Diversity and complexity
  • Hybrid origin-of-life models

The project should include:

  • Background research
  • Simulation experiments
  • Data analysis
  • Interpretation
  • Discussion of limitations
  • Recommendations for future work

7.11 Key Takeaways

  • Scientific understanding develops through experimentation.
  • Simple models can reveal important principles.
  • Mutation, selection, diversity, networks, and compartments interact in complex ways.
  • No single simulation explains the origin of life.
  • Comparing models helps reveal strengths and limitations.
  • The origin of life remains one of the most fascinating open questions in science.
  • lifesimulatoR provides a platform for exploring these ideas through computational experiments.