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:
- Form a hypothesis.
- Run simulations.
- Observe results.
- Interpret patterns.
- Identify limitations.
- 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.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.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.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.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.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.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.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.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.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.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.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.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.9 Assessment Ideas
Students can be asked to:
- Explain parameter choices.
- Compare simulation outputs.
- Interpret graphs and trends.
- Identify model limitations.
- Connect simulations to scientific theories.
- Propose model improvements.
- Design new experiments.
- 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.
lifesimulatoRprovides a platform for exploring these ideas through computational experiments.