{"id":39510171,"url":"https://github.com/pgalko/agent8","last_synced_at":"2026-01-18T06:01:23.544Z","repository":{"id":328767731,"uuid":"1116167031","full_name":"pgalko/Agent8","owner":"pgalko","description":null,"archived":false,"fork":false,"pushed_at":"2025-12-25T05:47:46.000Z","size":8046,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-12-26T19:26:57.808Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pgalko.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-12-14T10:36:46.000Z","updated_at":"2025-12-25T05:47:50.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/pgalko/Agent8","commit_stats":null,"previous_names":["pgalko/agent8"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/pgalko/Agent8","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pgalko%2FAgent8","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pgalko%2FAgent8/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pgalko%2FAgent8/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pgalko%2FAgent8/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pgalko","download_url":"https://codeload.github.com/pgalko/Agent8/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pgalko%2FAgent8/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28531991,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-18T00:39:45.795Z","status":"online","status_checked_at":"2026-01-18T02:00:07.578Z","response_time":98,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-01-18T06:01:22.906Z","updated_at":"2026-01-18T06:01:23.538Z","avatar_url":"https://github.com/pgalko.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Agent8 Climber v1 - Fear-Based Exploration Simulation\r\n\r\nA simulation exploring how people with different risk tolerances navigate uncertain territories, using rock climbing as a metaphor.\r\n\r\n## What is This?\r\n\r\nImagine two people exploring the same landscape of challenges:\r\n\r\n**Bold Explorer (low θ)**: Needs real stakes to feel engaged. Safe territory feels underwhelming. They venture into dangerous zones, which can accelerate learning - but also cuts many lifecycles short.\r\n\r\n**Cautious Explorer (high θ)**: Feels engaged even with modest stakes. They stay in safer territory, which limits initial options but allows for longer lifecycles and gradual skill building.\r\n\r\nBoth seek the same thing: **novelty** - the satisfaction of exploring new territory, developing skills, and operating at the edge of their abilities. The simulation tracks whether different personality types can achieve similar outcomes despite taking very different paths.\r\n\r\n### What Is Novelty?\r\n\r\nNovelty represents the value gained from exploration. It is the same reward for everyone - unlocking new routes, completing challenges, improving skills. What differs is the pacing:\r\n\r\n- Bold agents get larger bursts from high-stakes routes, but their lifecycles often end early\r\n- Cautious agents accumulate novelty more gradually, but over longer lifecycles\r\n\r\nNovelty is highest when you are operating at your edge - not too safe (boring), not too scary (overwhelming). This \"sweet spot\" differs by personality but exists for everyone.\r\n\r\n### Two Types of Skill\r\n\r\nAgents develop two capabilities through experience:\r\n\r\n| Skill | Developed By | What It Does |\r\n|-------|--------------|--------------|\r\n| **Physical** | Attempting difficult routes | Reduces fear of difficulty, improves success rate, unlocks harder routes over time |\r\n| **Mental** | Exposure to consequence (risk) | Reduces \"choking under pressure\" - the tendency to fail when consequences are high |\r\n\r\nEveryone starts at zero for both skills. The difference is exposure:\r\n\r\n- Bold agents regularly face high consequences and develop mental skill faster\r\n- Cautious agents encounter high stakes less often, so mental skill develops more slowly, though it still matters when they venture beyond their usual territory\r\n\r\n**Choking**: When the stakes exceed your mental training, you may fail a route you would normally complete. This matters for any agent who faces consequences beyond what they have trained for.\r\n\r\n### The Core Question\r\n\r\n\u003e Can different personality types find similar fulfillment despite opposite approaches?\r\n\r\nThe simulation suggests yes, but with important caveats. Strategy helps across personality types, and survival strongly influences lifetime outcomes. Bold explorers who survive can match cautious ones - but many do not survive.\r\n\r\n### Methodology\r\n\r\nThis is a **Monte Carlo** simulation. For each configuration, we run hundreds of stochastic agent lifecycles (typically 50-800) and aggregate the statistics. Each run involves random outcomes for route attempts, falls, and deaths based on the probability models described below.\r\n\r\nWe also use **Evolutionary optimization** to discover optimal strategy weights for each personality type - evolving populations of strategies over multiple generations and selecting for fitness (novelty + skill).\r\n\r\n\r\n---\r\n\r\n## Table of Contents\r\n\r\n1. [Quick Start](#quick-start)\r\n2. [The Model](#the-model)\r\n3. [Strategic Route Selection](#strategic-route-selection)\r\n4. [Evolutionary Optimization](#evolutionary-optimization)\r\n5. [Landscapes](#landscapes)\r\n6. [Running Experiments](#running-experiments)\r\n7. [Key Findings](#key-findings)\r\n8. [File Structure](#file-structure)\r\n\r\n---\r\n\r\n## Quick Start\r\n\r\n```bash\r\n# 1. Basic exploration (greedy agents)\r\npython run_exploration.py --quick --landscape compressed --plot\r\n\r\n# 2. Strategic exploration with default weights\r\npython run_strategic_exploration.py --quick --landscape compressed --thetas 2,4,6,8 --plot --heatmap\r\n\r\n# 3. Evolve optimal strategies and save them\r\npython run_evolution.py --landscape compressed --thetas 2,4,6,8 --plot --save output/optimal_weights.json\r\n\r\n# 4. Run strategic exploration with evolved weights\r\npython run_strategic_exploration.py --landscape compressed --thetas 2,4,6,8 --load-weights output/optimal_weights.json --plot --heatmap\r\n```\r\n\r\n---\r\n\r\n## The Model\r\n\r\n### Fear Sensitivity (θ)\r\n\r\nEach agent has a fear sensitivity parameter θ (theta) on a scale of 1-8. θ determines the agent's \"Lauda line\" - the maximum consequence (death probability) they will accept:\r\n\r\n| θ Range | Profile | Approximate Maximum Acceptable Death Risk |\r\n|---------|---------|-------------------------------------------|\r\n| 1-2 | Bold | 12-27% per attempt |\r\n| 3-4 | Moderate | 4-7% |\r\n| 5-6 | Cautious | 2-3% |\r\n| 7-8 | Very Cautious | 1-1.5% |\r\n\r\nThe Lauda line formula (named after Niki Lauda's famous risk calculation):\r\n```python\r\nlauda_line = 0.35 * exp(-0.6 * θ) + 0.01\r\n```\r\n\r\nThis is not a judgment - it is a parameter. Some people genuinely perform best with higher stakes; others thrive when consequences are contained.\r\n\r\n### The Fear Calculation\r\n\r\nAn agent evaluates each route by computing a fear score combining two factors:\r\n\r\n```python\r\nfear = consequence_fear + difficulty_fear\r\n```\r\n\r\n**Consequence fear** depends on personality (θ). It reaches 1.0 when the route's consequence equals the agent's Lauda line:\r\n\r\n```python\r\nconsequence_fear = route.consequence / lauda_line\r\n```\r\n\r\n**Difficulty fear** depends on physical skill. As agents develop ability, hard routes feel less intimidating. It also habituates with repeated exposure:\r\n\r\n```python\r\nconfidence = physical_skill / (2.0 + physical_skill)\r\ndifficulty_fear = 0.5 * difficulty * (1 - confidence) * habituation * boost\r\n```\r\n\r\nA route feels acceptable when total fear is 1.0 or less. Agents only consider routes where fear is between 0.5 and 1.0 - below 0.5 feels boring and disengaging.\r\n\r\n### Route Selection (How Agents Choose)\r\n\r\nAgents evaluate routes using a value function that combines three factors:\r\n\r\n```python\r\nvalue = fear_sweetness * stakes_engagement * novelty_potential\r\n```\r\n\r\n**Fear sweetness**: A bell curve centered at optimal fear (0.75). Value peaks when fear is in the sweet spot, drops for \"too boring\" or \"too scary\":\r\n\r\n```python\r\nfear_sweetness = exp(-((fear - 0.75) / 0.25)^2)\r\n```\r\n\r\n**Stakes engagement**: Bold agents need real consequence to feel engaged. A hard boulder with low death risk might hit the right fear level but feel hollow without real stakes:\r\n\r\n```python\r\nrequired_consequence = 0.025 / θ\r\n# θ=2: needs ~1.25% death rate for full engagement\r\n# θ=8: needs ~0.3% (easily satisfied)\r\nstakes_engagement = min(1.0, route.consequence / required_consequence)\r\n```\r\n\r\n**Novelty potential**: Based on engagement (peaks at 80% of max fear), freshness (decays with repetition), and individual talent:\r\n\r\n```python\r\nengagement = exp(-((relative_fear - 0.80) / 0.30)^2)\r\nfreshness = exp(-0.5 * experience)\r\nnovelty = 10.0 * engagement * freshness * talent * noise\r\n```\r\n\r\n### Success and Failure\r\n\r\nSuccess probability uses a two-skill model:\r\n\r\n```python\r\n# Physical success - based on difficulty and physical skill\r\nphys_factor = physical_skill / (1 + physical_skill)\r\nbase_success = 1 - route.difficulty\r\np_physical = min(0.99, max(0.05, base_success * (1 + phys_factor)))\r\n\r\n# Choking - high stakes + low mental skill = trouble\r\nmental_capacity = mental_skill / (0.5 + mental_skill)\r\np_choke = min(0.5, route.consequence * (1 - mental_capacity) * 5)\r\n\r\n# Combined: must physically succeed AND not choke\r\np_success = p_physical * (1 - p_choke)\r\n```\r\n\r\nOn failure, the agent falls. Death probability equals the route's consequence rating directly.\r\n\r\n### Skill Development\r\n\r\nSkills are gained from every attempt:\r\n\r\n```python\r\n# On success:\r\nphysical_gained = 0.05 * route.difficulty\r\nmental_gained = 0.05 * route.consequence * 10  # scaled up since consequence values are small\r\n\r\n# On failure (survived):\r\nphysical_gained = 0.05 * route.difficulty * 0.5\r\nmental_gained = 0.05 * route.consequence * 10 * 0.5\r\n```\r\n\r\n### Lifecycle Outcomes\r\n\r\nEach agent's lifecycle ends one of three ways:\r\n\r\n| Outcome | Meaning |\r\n|---------|---------|\r\n| **Completed** | Finished maximum attempts (full lifecycle) |\r\n| **Stagnated** | No acceptable routes remaining (alive but stuck) |\r\n| **Dead** | Fatal accident |\r\n\r\n---\r\n\r\n## Strategic Route Selection\r\n\r\n### Greedy vs Strategic Agents\r\n\r\n**Greedy**: Picks the route with highest immediate value (fear_sweetness * stakes_engagement * novelty_potential).\r\n\r\n**Strategic**: Adds three planning bonuses to immediate value:\r\n\r\n```python\r\nstrategic_value = immediate_value + unlock_bonus + freshness_bonus + diversity_bonus\r\n```\r\n\r\n### Strategy Behaviors\r\n\r\n| Behavior | Formula | Effect |\r\n|----------|---------|--------|\r\n| **Unlock** | `unlock_weight * min(n_almost, 20) * difficulty` | When routes are \"almost accessible\" (fear 1.0-1.5), prefer harder routes that build skill toward unlocking them |\r\n| **Freshness** | `freshness_weight * 50 * exp(-0.5 * experience)` | Prefer routes not recently attempted |\r\n| **Diversity** | `diversity_weight * 100` (if new grid cell) | Prefer routes in unvisited areas of the difficulty/consequence grid |\r\n\r\nDefault weights: unlock=0.2, freshness=0.1, diversity=0.1\r\n\r\n### Why Strategy Helps\r\n\r\nWithout strategy, greedy agents tend to:\r\n- Deplete favorite routes quickly (leading to stagnation)\r\n- Miss opportunities to unlock new territory through skill building\r\n- Cluster in one area of the landscape\r\n\r\nStrategic agents spread their exploration, avoid exhausting options, and unlock more routes over time.\r\n\r\n---\r\n\r\n## Evolutionary Optimization\r\n\r\n### Purpose\r\n\r\nHand-tuned strategy weights work reasonably well, but are they optimal? Evolution discovers better weights for each personality type.\r\n\r\n### What Gets Evolved\r\n\r\nThe three behavior weights: `[unlock_weight, freshness_weight, diversity_weight]`\r\n\r\nThese control HOW agents pick routes. They are separate from the fitness function which controls WHAT outcomes we optimize for.\r\n\r\n### Method\r\n\r\n![Evolution Results](output/evolution_results.png)\r\n\r\n*Evolved strategy weights by personality type. The stacked bars show direction (which behaviors matter), while the black line shows magnitude (how much strategy matters overall).*\r\n\r\n```\r\nGENERATION 0: Random population of weight combinations\r\n─────────────────────────────────────────────────────────┐\r\n│  Individual    Weights [u,f,d]      Fitness             │\r\n├─────────────────────────────────────────────────────────┤\r\n│  A             [0.1, 0.8, 0.3]    → 30 runs → 1200      │\r\n│  B             [0.5, 0.1, 0.7]    → 30 runs → 1350      │\r\n│  C             [0.3, 0.2, 0.4]    → 30 runs → 1450 ★    │\r\n│  D             [0.9, 0.2, 0.1]    → 30 runs → 1100      │\r\n└─────────────────────────────────────────────────────────┘\r\n                         │\r\n                         ▼\r\n              SELECTION (keep top 50%)\r\n              CROSSOVER (blend parent genes)\r\n              MUTATION (add random noise)\r\n                         │\r\n                         ▼\r\n              ... repeat for 30 generations ...\r\n                         │\r\n                         ▼\r\nFINAL: Optimized Weights for this θ\r\n┌─────────────────────────────────────────────────────────┐\r\n│  Best: [0.45, 0.22, 0.38]  Fitness: 1620                │\r\n└─────────────────────────────────────────────────────────┘\r\n```\r\n\r\n### Fitness Function\r\n\r\nWhat we optimize for (the goals):\r\n\r\n```python\r\nfitness = novelty_weight * avg_novelty + survival_weight * avg_survival * 1000 + skill_weight * avg_skill * 100\r\n```\r\n\r\nDefault weights: novelty=1.0, survival=0.0, skill=0.5\r\n\r\n### Interpreting Results\r\n\r\nStrategy weights are decomposed into magnitude and direction:\r\n\r\n```python\r\nmagnitude = sum(weights)           # How much strategy matters overall\r\ndirection = weights / magnitude    # Which behaviors matter most (sums to 100%)\r\n```\r\n\r\n**Magnitude interpretation:**\r\n\r\n| Range | Meaning |\r\n|-------|---------|\r\n| \u003e 1.5 | Strategy provides meaningful benefit |\r\n| 1.0 - 1.5 | Strategy provides moderate benefit |\r\n| \u003c 1.0 | Natural instincts may suffice |\r\n\r\nIn practice, evolved magnitudes cluster in the 1.3-1.8 range across personality types, suggesting strategy helps everyone to a similar degree. What varies more is the type of strategy that helps.\r\n\r\n### Saving and Loading Weights\r\n\r\n```bash\r\n# Evolve and save\r\npython run_evolution.py --landscape compressed --thetas 2,4,6,8 --save output/optimal_weights.json\r\n\r\n# Use evolved weights\r\npython run_strategic_exploration.py --load-weights output/optimal_weights.json --thetas 2,4,6,8\r\n```\r\n\r\n---\r\n\r\n## Landscapes\r\n\r\n### Compressed Landscape (Recommended)\r\n\r\nTight consequence bands (0.1% to 3.5%) designed so all θ values can explore most of the 5x5 grid:\r\n\r\n```python\r\nlandscape = Landscape.create_compressed(seed=42)\r\n```\r\n\r\nConsequence bands:\r\n- C1: 0.10% - 0.40% (accessible to all θ)\r\n- C2: 0.40% - 0.70% (accessible to θ \u003c= 7)\r\n- C3: 0.70% - 1.20% (accessible to θ \u003c= 6)\r\n- C4: 1.20% - 2.00% (accessible to θ \u003c= 5)\r\n- C5: 2.00% - 3.50% (accessible to θ \u003c= 4)\r\n\r\n```\r\n                        CONSEQUENCE\r\n              C1        C2        C3        C4        C5\r\n           (0.1%)    (0.4%)    (0.7%)    (1.2%)    (2.0%)\r\n         ┌─────────┬─────────┬─────────┬─────────┬─────────┐\r\n    D1   │   500   │   500   │   500   │   500   │   500   │  Easy\r\n         ├─────────┼─────────┼─────────┼─────────┼─────────┤\r\n    D2   │   500   │   500   │   500   │   500   │   500   │\r\n         ├─────────┼─────────┼─────────┼─────────┼─────────┤\r\n    D3   │   500   │   500   │   500   │   500   │   500   │\r\n         ├─────────┼─────────┼─────────┼─────────┼─────────┤\r\n    D4   │   500   │   500   │   500   │   500   │   500   │\r\n         ├─────────┼─────────┼─────────┼─────────┼─────────┤\r\n    D5   │   500   │   500   │   500   │   500   │   500   │  Hard\r\n         └─────────┴─────────┴─────────┴─────────┴─────────┘\r\n                                                    = 12,500 routes\r\n```\r\n\r\n**Why compressed?** \r\n- All θ values can access most of the grid\r\n- Enables fair comparison of exploration patterns\r\n- Reveals territorial differentiation by personality\r\n\r\n### Other Options\r\n\r\n```python\r\n# Fair: Routes calibrated per-θ for equal sweet-spot access\r\nlandscape = Landscape.create_fair(thetas=[2, 4, 6, 8])\r\n\r\n# Stratified: Uniform 5x5 grid with wider consequence range\r\nlandscape = Landscape.create_stratified_coverage(seed=42)\r\n```\r\n\r\n---\r\n\r\n## Running Experiments\r\n\r\n### Basic Exploration (Greedy)\r\n\r\n```bash\r\npython run_exploration.py --quick --landscape compressed --plot --heatmap\r\npython run_exploration.py --full --landscape compressed --thetas 1,2,4,6,8 --plot --heatmap\r\n```\r\n\r\n### Strategic Exploration\r\n\r\n```bash\r\n# With default weights\r\npython run_strategic_exploration.py --quick --landscape compressed --thetas 2,4,6,8 --plot --heatmap\r\n\r\n# With evolved weights\r\npython run_strategic_exploration.py --landscape compressed --thetas 2,4,6,8 --load-weights output/optimal_weights.json --plot --heatmap\r\n```\r\n\r\n### Evolutionary Optimization\r\n\r\n```bash\r\n# Quick test (~5 min)\r\npython run_evolution.py --quick --landscape compressed --thetas 4,8 --plot\r\n\r\n# Standard run (~20 min)\r\npython run_evolution.py --landscape compressed --thetas 2,4,6,8 --plot --save output/optimal_weights.json\r\n\r\n# Full optimization (~1 hour)\r\npython run_evolution.py --full --landscape compressed --thetas 1,2,3,4,5,6,7,8 --plot --heatmap --save output/optimal_weights.json\r\n```\r\n\r\n### Command Line Options\r\n\r\n| Option | Description |\r\n|--------|-------------|\r\n| `--quick` | Fewer runs/generations (fast) |\r\n| `--full` | More runs/generations (precise) |\r\n| `--thetas` | Comma-separated θ values |\r\n| `--plot` | Generate learning curves |\r\n| `--heatmap` | Generate exploration heatmaps |\r\n| `--landscape` | `compressed`, `fair`, or `stratified` |\r\n| `--seed` | Random seed |\r\n| `--max-attempts` | Max attempts per agent |\r\n| `--save` | Save evolved weights to JSON |\r\n| `--load-weights` | Load evolved weights from JSON |\r\n\r\n---\r\n\r\n## Key Findings\r\n\r\n### Exploration Patterns\r\n\r\n![Exploration Heatmap](output/exploration_heatmap.png)\r\n\r\n*Bold agents (low θ) explore vertically into high-consequence territory. Cautious agents (high θ) explore horizontally, pushing difficulty within safer zones.*\r\n\r\n### Learning Trajectories\r\n\r\n![Learning Curves](output/strategic_learning_curves.png)\r\n\r\n\r\n*Novelty and skill accumulation over time. Cautious agents (θ=7-8) often accumulate more total novelty because their lifecycles last longer. All agents tend to converge toward operating at their personal edge (fear around 0.8).*\r\n\r\n### What the Simulations Suggest\r\n\r\n**1. Similar novelty at personal edges**\r\n\r\nAgents across θ values tend to achieve comparable novelty per attempt when operating at their sweet spot (fear around 0.75-0.80). The absolute difficulty matters less than being appropriately challenged for your own threshold.\r\n\r\n**2. Different exploration territories**\r\n\r\nBold and cautious agents explore different regions:\r\n- Bold agents explore vertically (consequence dimension) - they access high-risk routes\r\n- Cautious agents explore horizontally (difficulty dimension) - they push technical skill within safer zones\r\n\r\n**3. Survival shapes lifetime outcomes**\r\n\r\nCautious agents often accumulate more lifetime novelty - not because they find more per attempt, but because they survive longer. Bold agents can match this, but many lifecycles end early.\r\n\r\n**4. Strategy helps across personality types**\r\n\r\nEvolution suggests strategy provides moderate benefit for all personality types (magnitude roughly 1.3-1.8 across θ values). What varies more is which behaviors matter:\r\n- Unlock focus (building toward inaccessible routes) tends to dominate\r\n- Freshness (avoiding repetition) provides secondary benefit\r\n- Diversity (exploring new areas) appears more relevant at the extremes (very bold or very cautious)\r\n\r\n**5. Strategic agents avoid stagnation**\r\n\r\nGreedy agents frequently exhaust their preferred routes and stagnate (20-40% of lifecycles). Strategic agents rarely stagnate because freshness and diversity bonuses spread exploration.\r\n\r\n### Caveats\r\n\r\nThis is a simplified simulation, not a predictive model of human behavior. The findings suggest patterns worth investigating, not definitive conclusions about how people actually behave.\r\n\r\n---\r\n\r\n## File Structure\r\n\r\n```\r\nagent8_climber_v1/\r\n|-- run_exploration.py              # Greedy agent exploration\r\n|-- run_strategic_exploration.py    # Strategic exploration\r\n|-- run_evolution.py                # Evolutionary optimization\r\n|\r\n|-- src/\r\n|   |-- agent.py                    # Agent with fear model and two-skill system\r\n|   |-- strategic_agent.py          # Strategic planning behaviors\r\n|   |-- evolution.py                # Evolutionary optimizer\r\n|   |-- landscape.py                # Route generation\r\n|   |-- exploration.py              # Simulation loop\r\n|   |-- visualizations.py           # Plotting\r\n|\r\n|-- output/                         # Generated figures and data\r\n|-- requirements.txt\r\n|-- README.md\r\n```\r\n\r\n---\r\n\r\n## Requirements\r\n\r\n```\r\nPython 3.8+\r\nnumpy\r\nmatplotlib\r\n```\r\n\r\nInstall with: `pip install -r requirements.txt`\r\n\r\n---\r\n\r\n## Example Workflow\r\n\r\n```bash\r\n# 1. Quick exploration to verify setup\r\npython run_exploration.py --quick --landscape compressed --thetas 2,4,6,8 --plot\r\n\r\n# 2. Evolve optimal strategies for each θ\r\npython run_evolution.py --landscape compressed --thetas 2,4,6,8 --plot --save output/optimal_weights.json\r\n\r\n# 3. Run strategic exploration with evolved weights\r\npython run_strategic_exploration.py --landscape compressed --thetas 2,4,6,8 --load-weights output/optimal_weights.json --plot --heatmap\r\n\r\n# 4. Full production run (all θ values)\r\npython run_evolution.py --full --landscape compressed --thetas 1,2,3,4,5,6,7,8 --plot --heatmap --save output/optimal_weights.json\r\n```\r\n\r\n---\r\n\r\n## Acknowledgments\r\n\r\nThanks to Sophie Herzog for ideas and feedback.\r\n\r\n---\r\n\r\n## License\r\n\r\nMIT\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpgalko%2Fagent8","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpgalko%2Fagent8","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpgalko%2Fagent8/lists"}