Buckets:
| import"../chunks/DsnmJJEf.js";import{i as K,h as O,C as P,H as s,a as e,E as $,s as ll}from"../chunks/C07d6Hje.js";import{p as sl,o as el,s as l,f as al,a as z,b as nl,c as D,n as tl}from"../chunks/BSuxAqoA.js";const il='{"title":"Snake Environment","local":"snake-environment","sections":[{"title":"Overview","local":"overview","sections":[{"title":"Features","local":"features","sections":[],"depth":3},{"title":"Game Rules","local":"game-rules","sections":[],"depth":3}],"depth":2},{"title":"Quick Start","local":"quick-start","sections":[{"title":"Using Docker (Recommended)","local":"using-docker-recommended","sections":[],"depth":3},{"title":"Using Local Server","local":"using-local-server","sections":[],"depth":3}],"depth":2},{"title":"Actions","local":"actions","sections":[{"title":"Snake Mode (Default)","local":"snake-mode-default","sections":[],"depth":3},{"title":"Human Mode","local":"human-mode","sections":[],"depth":3}],"depth":2},{"title":"Observations","local":"observations","sections":[],"depth":2},{"title":"Configuration","local":"configuration","sections":[{"title":"Environment Parameters","local":"environment-parameters","sections":[],"depth":3},{"title":"Custom Rewards","local":"custom-rewards","sections":[],"depth":3}],"depth":2},{"title":"Building and Deployment","local":"building-and-deployment","sections":[{"title":"Build Docker Image","local":"build-docker-image","sections":[],"depth":3},{"title":"Run Docker Container","local":"run-docker-container","sections":[],"depth":3},{"title":"Web Interface","local":"web-interface","sections":[],"depth":3}],"depth":2},{"title":"Dependencies","local":"dependencies","sections":[],"depth":2},{"title":"Example Training Loop","local":"example-training-loop","sections":[],"depth":2},{"title":"Troubleshooting","local":"troubleshooting","sections":[{"title":"marlenv Installation Issues","local":"marlenv-installation-issues","sections":[],"depth":3},{"title":"Import Errors","local":"import-errors","sections":[],"depth":3},{"title":"Docker Build Issues","local":"docker-build-issues","sections":[],"depth":3}],"depth":2},{"title":"Citation","local":"citation","sections":[],"depth":2},{"title":"License","local":"license","sections":[],"depth":2}],"depth":1}';var ol=D('<meta name="hf:doc:metadata"/>'),cl=D('<p></p> <!> <!> <p>A multi-agent snake game environment for OpenEnv, based on <a href="https://github.com/kc-ml2/marlenv" rel="nofollow">marlenv</a>’s Snake-v1. This environment provides a single-agent interface to the classic snake game where the snake must navigate a grid, eat fruits, and avoid walls and its own body.</p> <!> <p>The Snake environment wraps the marlenv Snake-v1 environment to provide a clean OpenEnv-compatible interface. Multiple snakes can battle on a fixed size grid map, but this implementation focuses on single-agent gameplay.</p> <!> <ul><li><strong>Grid-based gameplay</strong>: Configurable grid size (default: 20x20)</li> <li><strong>Fruit collection</strong>: Snake grows when eating fruits</li> <li><strong>Partial observability</strong>: Optional vision range for limited field of view</li> <li><strong>Customizable rewards</strong>: Configurable reward function for different game aspects</li> <li><strong>Two control modes</strong>: <ul><li><code>snake</code>: Relative actions (turn left/right)</li> <li><code>human</code>: Global directions (up/down/left/right)</li></ul></li></ul> <!> <ul><li>Snake dies when its head hits a wall or its own body</li> <li>Snake grows by one unit when it eats a fruit</li> <li>Episode ends when the snake dies or reaches maximum steps</li> <li>Rewards can be customized for: eating fruits, survival time, and death penalty</li></ul> <!> <!> <!> <!> <!> <p>Then connect from another terminal:</p> <!> <!> <p>The action space depends on the <code>observer</code> mode:</p> <!> <p>Relative actions based on current direction:</p> <ul><li><code>0</code>: No-op (continue in same direction)</li> <li><code>1</code>: Turn left (90 degrees counterclockwise)</li> <li><code>2</code>: Turn right (90 degrees clockwise)</li></ul> <!> <p>Global directional actions:</p> <ul><li><code>0</code>: No-op</li> <li><code>1</code>: Move left</li> <li><code>2</code>: Move right</li> <li><code>3</code>: Move down</li> <li><code>4</code>: Move up</li></ul> <!> <p>Each observation includes:</p> <ul><li><code>grid</code>: The full game grid as a 2D array (height × width)</li> <li><code>observation</code>: Encoded observation based on vision range</li> <li><code>episode_score</code>: Cumulative score in current episode</li> <li><code>episode_steps</code>: Number of steps taken</li> <li><code>episode_fruits</code>: Number of fruits eaten</li> <li><code>episode_kills</code>: Number of kills (always 0 in single-agent mode)</li> <li><code>alive</code>: Whether the snake is still alive</li></ul> <!> <!> <!> <!> <p>You can customize the reward function to encourage different behaviors:</p> <!> <!> <!> <p>From the repository root:</p> <!> <p>The Dockerfile uses <code>pip install</code> with <code>requirements.txt</code> for maximum compatibility.</p> <!> <!> <!> <p>When <code>ENABLE_WEB_INTERFACE=true</code> is set, you can access the web interface at <code>http://localhost:8000/web</code> to interact with the environment through your browser.</p> <!> <p>The snake environment requires:</p> <ul><li><code>marlenv</code>: Multi-agent snake game implementation</li> <li><code>gym==0.24.1</code>: OpenAI Gym (required by marlenv)</li> <li><code>numpy</code>: Numerical operations</li> <li>Standard OpenEnv dependencies (fastapi, pydantic, uvicorn)</li></ul> <p>These are automatically installed when using Docker or installing via pip.</p> <!> <!> <!> <!> <p>If you encounter issues installing marlenv, you can install it from source:</p> <!> <!> <p>Make sure you’re in the correct directory when running the server:</p> <!> <!> <p>Ensure the base image is built first:</p> <!> <!> <p>The underlying snake game is from marlenv:</p> <!> <!> <p>BSD 3-Clause License - See LICENSE file in the root directory.</p> <!> <p></p>',1);function Ml(H,L){sl(L,!1),el(()=>{new URLSearchParams(window.location.search).get("fw")}),K();var a=cl();O("12exjpa",Y=>{var F=ol();ll(F,"content",il),z(Y,F)});var n=l(al(a),2);P(n,{containerStyle:"float: right; margin-left: 10px; display: inline-flex; position: relative; z-index: 10;"});var t=l(n,2);s(t,{title:"Snake Environment",local:"snake-environment",headingTag:"h1"});var i=l(t,4);s(i,{title:"Overview",local:"overview",headingTag:"h2"});var o=l(i,4);s(o,{title:"Features",local:"features",headingTag:"h3"});var c=l(o,4);s(c,{title:"Game Rules",local:"game-rules",headingTag:"h3"});var r=l(c,4);s(r,{title:"Quick Start",local:"quick-start",headingTag:"h2"});var p=l(r,2);s(p,{title:"Using Docker (Recommended)",local:"using-docker-recommended",headingTag:"h3"});var d=l(p,2);e(d,{code:"ZnJvbSUyMGVudnMuc25ha2VfZW52JTIwaW1wb3J0JTIwU25ha2VBY3Rpb24lMkMlMjBTbmFrZUVudiUwQSUwQSUyMyUyMFN0YXJ0JTIwZW52aXJvbm1lbnQlMjBmcm9tJTIwRG9ja2VyJTIwaW1hZ2UlMEFjbGllbnQlMjAlM0QlMjBTbmFrZUVudi5mcm9tX2RvY2tlcl9pbWFnZSglMjJzbmFrZS1lbnYlM0FsYXRlc3QlMjIpJTBBJTBBJTIzJTIwUmVzZXQlMjB0byUyMHN0YXJ0JTIwbmV3JTIwZXBpc29kZSUwQXJlc3VsdCUyMCUzRCUyMGNsaWVudC5yZXNldCgpJTBBcHJpbnQoZiUyMlNuYWtlJTIwYWxpdmUlM0ElMjAlN0JyZXN1bHQub2JzZXJ2YXRpb24uYWxpdmUlN0QlMjIpJTBBcHJpbnQoZiUyMkdyaWQlMjBzaGFwZSUzQSUyMCU3QmxlbihyZXN1bHQub2JzZXJ2YXRpb24uZ3JpZCklN0R4JTdCbGVuKHJlc3VsdC5vYnNlcnZhdGlvbi5ncmlkJTVCMCU1RCklN0QlMjIpJTBBJTBBJTIzJTIwVGFrZSUyMGFjdGlvbnMlMEFyZXN1bHQlMjAlM0QlMjBjbGllbnQuc3RlcChTbmFrZUFjdGlvbihhY3Rpb24lM0QwKSklMjAlMjAlMjMlMjBDb250aW51ZSUyMHN0cmFpZ2h0JTBBcHJpbnQoZiUyMlJld2FyZCUzQSUyMCU3QnJlc3VsdC5yZXdhcmQlN0QlMjIpJTBBcHJpbnQoZiUyMlNjb3JlJTNBJTIwJTdCcmVzdWx0Lm9ic2VydmF0aW9uLmVwaXNvZGVfc2NvcmUlN0QlMjIpJTBBJTBBcmVzdWx0JTIwJTNEJTIwY2xpZW50LnN0ZXAoU25ha2VBY3Rpb24oYWN0aW9uJTNEMSkpJTIwJTIwJTIzJTIwVHVybiUyMGxlZnQlMEFyZXN1bHQlMjAlM0QlMjBjbGllbnQuc3RlcChTbmFrZUFjdGlvbihhY3Rpb24lM0QyKSklMjAlMjAlMjMlMjBUdXJuJTIwcmlnaHQlMEElMEElMjMlMjBDaGVjayUyMGdhbWUlMjBzdGF0ZSUwQXN0YXRlJTIwJTNEJTIwY2xpZW50LnN0YXRlKCklMEFwcmludChmJTIyRXBpc29kZSUzQSUyMCU3QnN0YXRlLmVwaXNvZGVfaWQlN0QlMjIpJTBBcHJpbnQoZiUyMlN0ZXBzJTNBJTIwJTdCc3RhdGUuc3RlcF9jb3VudCU3RCUyMiklMEElMEElMjMlMjBDbGVhbnVwJTBBY2xpZW50LmNsb3NlKCk=",highlighted:`<span class="hljs-keyword">from</span> envs.snake_env <span class="hljs-keyword">import</span> SnakeAction, SnakeEnv | |
| <span class="hljs-comment"># Start environment from Docker image</span> | |
| client = SnakeEnv.from_docker_image(<span class="hljs-string">"snake-env:latest"</span>) | |
| <span class="hljs-comment"># Reset to start new episode</span> | |
| result = client.reset() | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Snake alive: <span class="hljs-subst">{result.observation.alive}</span>"</span>) | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Grid shape: <span class="hljs-subst">{<span class="hljs-built_in">len</span>(result.observation.grid)}</span>x<span class="hljs-subst">{<span class="hljs-built_in">len</span>(result.observation.grid[<span class="hljs-number">0</span>])}</span>"</span>) | |
| <span class="hljs-comment"># Take actions</span> | |
| result = client.step(SnakeAction(action=<span class="hljs-number">0</span>)) <span class="hljs-comment"># Continue straight</span> | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Reward: <span class="hljs-subst">{result.reward}</span>"</span>) | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Score: <span class="hljs-subst">{result.observation.episode_score}</span>"</span>) | |
| result = client.step(SnakeAction(action=<span class="hljs-number">1</span>)) <span class="hljs-comment"># Turn left</span> | |
| result = client.step(SnakeAction(action=<span class="hljs-number">2</span>)) <span class="hljs-comment"># Turn right</span> | |
| <span class="hljs-comment"># Check game state</span> | |
| state = client.state() | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Episode: <span class="hljs-subst">{state.episode_id}</span>"</span>) | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Steps: <span class="hljs-subst">{state.step_count}</span>"</span>) | |
| <span class="hljs-comment"># Cleanup</span> | |
| client.close()`,lang:"python",wrap:!1});var M=l(d,2);s(M,{title:"Using Local Server",local:"using-local-server",headingTag:"h3"});var h=l(M,2);e(h,{code:"JTIzJTIwSW5zdGFsbCUyMGRlcGVuZGVuY2llcyUwQWNkJTIwc3JjJTJGZW52cyUyRnNuYWtlX2VudiUwQXBpcCUyMGluc3RhbGwlMjAtZSUyMC4lMEElMEElMjMlMjBSdW4lMjBzZXJ2ZXIlMEF1diUyMHJ1biUyMC0tcHJvamVjdCUyMC4lMjBzZXJ2ZXI=",highlighted:`<span class="hljs-comment"># Install dependencies</span> | |
| <span class="hljs-built_in">cd</span> src/envs/snake_env | |
| pip install -e . | |
| <span class="hljs-comment"># Run server</span> | |
| uv run --project . server`,lang:"bash",wrap:!1});var m=l(h,4);e(m,{code:"ZnJvbSUyMGVudnMuc25ha2VfZW52JTIwaW1wb3J0JTIwU25ha2VBY3Rpb24lMkMlMjBTbmFrZUVudiUwQSUwQSUyMyUyMENvbm5lY3QlMjB0byUyMHJ1bm5pbmclMjBzZXJ2ZXIlMEFjbGllbnQlMjAlM0QlMjBTbmFrZUVudihiYXNlX3VybCUzRCUyMmh0dHAlM0ElMkYlMkZsb2NhbGhvc3QlM0E4MDAwJTIyKSUwQXJlc3VsdCUyMCUzRCUyMGNsaWVudC5yZXNldCgpJTBBcmVzdWx0JTIwJTNEJTIwY2xpZW50LnN0ZXAoU25ha2VBY3Rpb24oYWN0aW9uJTNEMCkp",highlighted:`<span class="hljs-keyword">from</span> envs.snake_env <span class="hljs-keyword">import</span> SnakeAction, SnakeEnv | |
| <span class="hljs-comment"># Connect to running server</span> | |
| client = SnakeEnv(base_url=<span class="hljs-string">"http://localhost:8000"</span>) | |
| result = client.reset() | |
| result = client.step(SnakeAction(action=<span class="hljs-number">0</span>))`,lang:"python",wrap:!1});var y=l(m,2);s(y,{title:"Actions",local:"actions",headingTag:"h2"});var J=l(y,4);s(J,{title:"Snake Mode (Default)",local:"snake-mode-default",headingTag:"h3"});var u=l(J,6);s(u,{title:"Human Mode",local:"human-mode",headingTag:"h3"});var T=l(u,6);s(T,{title:"Observations",local:"observations",headingTag:"h2"});var w=l(T,6);s(w,{title:"Configuration",local:"configuration",headingTag:"h2"});var U=l(w,2);s(U,{title:"Environment Parameters",local:"environment-parameters",headingTag:"h3"});var j=l(U,2);e(j,{code:"ZnJvbSUyMGVudnMuc25ha2VfZW52LnNlcnZlci5zbmFrZV9lbnZpcm9ubWVudCUyMGltcG9ydCUyMFNuYWtlRW52aXJvbm1lbnQlMEElMEFlbnYlMjAlM0QlMjBTbmFrZUVudmlyb25tZW50KCUwQSUyMCUyMCUyMCUyMGhlaWdodCUzRDIwJTJDJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIzJTIwR3JpZCUyMGhlaWdodCUyMChkZWZhdWx0JTNBJTIwMjApJTBBJTIwJTIwJTIwJTIwd2lkdGglM0QyMCUyQyUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMEdyaWQlMjB3aWR0aCUyMChkZWZhdWx0JTNBJTIwMjApJTBBJTIwJTIwJTIwJTIwc25ha2VfbGVuZ3RoJTNEMyUyQyUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMEluaXRpYWwlMjBzbmFrZSUyMGxlbmd0aCUyMChkZWZhdWx0JTNBJTIwMyklMEElMjAlMjAlMjAlMjB2aXNpb25fcmFuZ2UlM0Q1JTJDJTIwJTIwJTIwJTIwJTIwJTIwJTIzJTIwUGFydGlhbCUyMG9ic2VydmFiaWxpdHklMjAoTm9uZSUyMGZvciUyMGZ1bGwlMjBncmlkKSUwQSUyMCUyMCUyMCUyMG9ic2VydmVyJTNEJ3NuYWtlJyUyQyUyMCUyMCUyMCUyMCUyMyUyMCdzbmFrZSclMjBvciUyMCdodW1hbiclMjBtb2RlJTBBJTIwJTIwJTIwJTIwbWF4X2VwaXNvZGVfc3RlcHMlM0QxMDAwJTJDJTIwJTIwJTIzJTIwTWF4aW11bSUyMHN0ZXBzJTIwcGVyJTIwZXBpc29kZSUwQSUyMCUyMCUyMCUyMHJld2FyZF9kaWN0JTNEJTdCJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIzJTIwQ3VzdG9tJTIwcmV3YXJkJTIwZnVuY3Rpb24lMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAnZnJ1aXQnJTNBJTIwMS4wJTJDJTIwJTIwJTIwJTIwJTIzJTIwUmV3YXJkJTIwZm9yJTIwZWF0aW5nJTIwZnJ1aXQlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAna2lsbCclM0ElMjAwLjAlMkMlMjAlMjAlMjAlMjAlMjAlMjMlMjBSZXdhcmQlMjBmb3IlMjBraWxscyUyMChtdWx0aS1hZ2VudCklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAnbG9zZSclM0ElMjAtMS4wJTJDJTIwJTIwJTIwJTIwJTIzJTIwUGVuYWx0eSUyMGZvciUyMGRlYXRoJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJ3dpbiclM0ElMjAwLjAlMkMlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBSZXdhcmQlMjBmb3IlMjB3aW5uaW5nJTIwKG11bHRpLWFnZW50KSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCd0aW1lJyUzQSUyMDAuMCUyQyUyMCUyMCUyMCUyMCUyMCUyMyUyMFJld2FyZCUyMHBlciUyMHRpbWVzdGVwJTBBJTIwJTIwJTIwJTIwJTdEJTBBKQ==",highlighted:`<span class="hljs-keyword">from</span> envs.snake_env.server.snake_environment <span class="hljs-keyword">import</span> SnakeEnvironment | |
| env = SnakeEnvironment( | |
| height=<span class="hljs-number">20</span>, <span class="hljs-comment"># Grid height (default: 20)</span> | |
| width=<span class="hljs-number">20</span>, <span class="hljs-comment"># Grid width (default: 20)</span> | |
| snake_length=<span class="hljs-number">3</span>, <span class="hljs-comment"># Initial snake length (default: 3)</span> | |
| vision_range=<span class="hljs-number">5</span>, <span class="hljs-comment"># Partial observability (None for full grid)</span> | |
| observer=<span class="hljs-string">'snake'</span>, <span class="hljs-comment"># 'snake' or 'human' mode</span> | |
| max_episode_steps=<span class="hljs-number">1000</span>, <span class="hljs-comment"># Maximum steps per episode</span> | |
| reward_dict={ <span class="hljs-comment"># Custom reward function</span> | |
| <span class="hljs-string">'fruit'</span>: <span class="hljs-number">1.0</span>, <span class="hljs-comment"># Reward for eating fruit</span> | |
| <span class="hljs-string">'kill'</span>: <span class="hljs-number">0.0</span>, <span class="hljs-comment"># Reward for kills (multi-agent)</span> | |
| <span class="hljs-string">'lose'</span>: -<span class="hljs-number">1.0</span>, <span class="hljs-comment"># Penalty for death</span> | |
| <span class="hljs-string">'win'</span>: <span class="hljs-number">0.0</span>, <span class="hljs-comment"># Reward for winning (multi-agent)</span> | |
| <span class="hljs-string">'time'</span>: <span class="hljs-number">0.0</span>, <span class="hljs-comment"># Reward per timestep</span> | |
| } | |
| )`,lang:"python",wrap:!1});var b=l(j,2);s(b,{title:"Custom Rewards",local:"custom-rewards",headingTag:"h3"});var g=l(b,4);e(g,{code:"JTIzJTIwRW5jb3VyYWdlJTIwc3Vydml2YWwlMEFyZXdhcmRfZGljdCUyMCUzRCUyMCU3QiUwQSUyMCUyMCUyMCUyMCdmcnVpdCclM0ElMjAxLjAlMkMlMEElMjAlMjAlMjAlMjAnbG9zZSclM0ElMjAtMTAuMCUyQyUwQSUyMCUyMCUyMCUyMCd0aW1lJyUzQSUyMDAuMDElMkMlMjAlMjAlMjMlMjBTbWFsbCUyMHJld2FyZCUyMGZvciUyMHN0YXlpbmclMjBhbGl2ZSUwQSU3RCUwQSUwQSUyMyUyMEZhc3QlMjBmcnVpdCUyMGNvbGxlY3Rpb24lMEFyZXdhcmRfZGljdCUyMCUzRCUyMCU3QiUwQSUyMCUyMCUyMCUyMCdmcnVpdCclM0ElMjAxMC4wJTJDJTBBJTIwJTIwJTIwJTIwJ2xvc2UnJTNBJTIwLTEuMCUyQyUwQSUyMCUyMCUyMCUyMCd0aW1lJyUzQSUyMC0wLjAxJTJDJTIwJTIwJTIzJTIwUGVuYWx0eSUyMGZvciUyMHRha2luZyUyMHRvbyUyMGxvbmclMEElN0Q=",highlighted:`<span class="hljs-comment"># Encourage survival</span> | |
| reward_dict = { | |
| <span class="hljs-string">'fruit'</span>: <span class="hljs-number">1.0</span>, | |
| <span class="hljs-string">'lose'</span>: -<span class="hljs-number">10.0</span>, | |
| <span class="hljs-string">'time'</span>: <span class="hljs-number">0.01</span>, <span class="hljs-comment"># Small reward for staying alive</span> | |
| } | |
| <span class="hljs-comment"># Fast fruit collection</span> | |
| reward_dict = { | |
| <span class="hljs-string">'fruit'</span>: <span class="hljs-number">10.0</span>, | |
| <span class="hljs-string">'lose'</span>: -<span class="hljs-number">1.0</span>, | |
| <span class="hljs-string">'time'</span>: -<span class="hljs-number">0.01</span>, <span class="hljs-comment"># Penalty for taking too long</span> | |
| }`,lang:"python",wrap:!1});var I=l(g,2);s(I,{title:"Building and Deployment",local:"building-and-deployment",headingTag:"h2"});var C=l(I,2);s(C,{title:"Build Docker Image",local:"build-docker-image",headingTag:"h3"});var v=l(C,4);e(v,{code:"JTIzJTIwQnVpbGQlMjBiYXNlJTIwaW1hZ2UlMjBmaXJzdCUyMChpZiUyMG5vdCUyMGFscmVhZHklMjBidWlsdCklMEFkb2NrZXIlMjBidWlsZCUyMC10JTIwb3BlbmVudi1iYXNlJTNBbGF0ZXN0JTIwLWYlMjBzcmMlMkZvcGVuZW52JTJGY29yZSUyRmNvbnRhaW5lcnMlMkZpbWFnZXMlMkZEb2NrZXJmaWxlJTIwLiUwQSUwQSUyMyUyMEJ1aWxkJTIwc25ha2UlMjBlbnZpcm9ubWVudCUyMGltYWdlJTBBZG9ja2VyJTIwYnVpbGQlMjAtdCUyMHNuYWtlLWVudiUzQWxhdGVzdCUyMC1mJTIwZW52cyUyRnNuYWtlX2VudiUyRnNlcnZlciUyRkRvY2tlcmZpbGUlMjAu",highlighted:`<span class="hljs-comment"># Build base image first (if not already built)</span> | |
| docker build -t openenv-base:latest -f src/openenv/core/containers/images/Dockerfile . | |
| <span class="hljs-comment"># Build snake environment image</span> | |
| docker build -t snake-env:latest -f envs/snake_env/server/Dockerfile .`,lang:"bash",wrap:!1});var Z=l(v,4);s(Z,{title:"Run Docker Container",local:"run-docker-container",headingTag:"h3"});var k=l(Z,2);e(k,{code:"JTIzJTIwUnVuJTIwdGhlJTIwY29udGFpbmVyJTBBZG9ja2VyJTIwcnVuJTIwLXAlMjA4MDAwJTNBODAwMCUyMHNuYWtlLWVudiUzQWxhdGVzdCUwQSUwQSUyMyUyME9yJTIwd2l0aCUyMGVudmlyb25tZW50JTIwdmFyaWFibGVzJTBBZG9ja2VyJTIwcnVuJTIwLXAlMjA4MDAwJTNBODAwMCUyMCU1QyUwQSUyMCUyMC1lJTIwRU5BQkxFX1dFQl9JTlRFUkZBQ0UlM0R0cnVlJTIwJTVDJTBBJTIwJTIwc25ha2UtZW52JTNBbGF0ZXN0",highlighted:`<span class="hljs-comment"># Run the container</span> | |
| docker run -p 8000:8000 snake-env:latest | |
| <span class="hljs-comment"># Or with environment variables</span> | |
| docker run -p 8000:8000 \\ | |
| -e ENABLE_WEB_INTERFACE=<span class="hljs-literal">true</span> \\ | |
| snake-env:latest`,lang:"bash",wrap:!1});var B=l(k,2);s(B,{title:"Web Interface",local:"web-interface",headingTag:"h3"});var f=l(B,4);s(f,{title:"Dependencies",local:"dependencies",headingTag:"h2"});var Q=l(f,8);s(Q,{title:"Example Training Loop",local:"example-training-loop",headingTag:"h2"});var W=l(Q,2);e(W,{code:"ZnJvbSUyMGVudnMuc25ha2VfZW52JTIwaW1wb3J0JTIwU25ha2VBY3Rpb24lMkMlMjBTbmFrZUVudiUwQWltcG9ydCUyMHJhbmRvbSUwQSUwQSUyMyUyMENvbm5lY3QlMjB0byUyMGVudmlyb25tZW50JTBBZW52JTIwJTNEJTIwU25ha2VFbnYuZnJvbV9kb2NrZXJfaW1hZ2UoJTIyc25ha2UtZW52JTNBbGF0ZXN0JTIyKSUwQSUwQSUyMyUyMFRyYWluaW5nJTIwbG9vcCUwQWZvciUyMGVwaXNvZGUlMjBpbiUyMHJhbmdlKDEwKSUzQSUwQSUyMCUyMCUyMCUyMHJlc3VsdCUyMCUzRCUyMGVudi5yZXNldCgpJTBBJTIwJTIwJTIwJTIwdG90YWxfcmV3YXJkJTIwJTNEJTIwMCUwQSUyMCUyMCUyMCUyMGRvbmUlMjAlM0QlMjBGYWxzZSUwQSUwQSUyMCUyMCUyMCUyMHdoaWxlJTIwbm90JTIwZG9uZSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMFNpbXBsZSUyMHJhbmRvbSUyMHBvbGljeSUyMChyZXBsYWNlJTIwd2l0aCUyMHlvdXIlMjBhZ2VudCklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBhY3Rpb24lMjAlM0QlMjBTbmFrZUFjdGlvbihhY3Rpb24lM0RyYW5kb20ucmFuZGludCgwJTJDJTIwMikpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcmVzdWx0JTIwJTNEJTIwZW52LnN0ZXAoYWN0aW9uKSUwQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHRvdGFsX3Jld2FyZCUyMCUyQiUzRCUyMHJlc3VsdC5yZXdhcmQlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBkb25lJTIwJTNEJTIwcmVzdWx0LmRvbmUlMEElMEElMjAlMjAlMjAlMjBwcmludChmJTIyRXBpc29kZSUyMCU3QmVwaXNvZGUlN0QlM0ElMjBSZXdhcmQlM0QlN0J0b3RhbF9yZXdhcmQlN0QlMkMlMjAlMjIlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBmJTIyRnJ1aXRzJTNEJTdCcmVzdWx0Lm9ic2VydmF0aW9uLmVwaXNvZGVfZnJ1aXRzJTdEJTJDJTIwJTIyJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwZiUyMlN0ZXBzJTNEJTdCcmVzdWx0Lm9ic2VydmF0aW9uLmVwaXNvZGVfc3RlcHMlN0QlMjIpJTBBJTBBZW52LmNsb3NlKCk=",highlighted:`<span class="hljs-keyword">from</span> envs.snake_env <span class="hljs-keyword">import</span> SnakeAction, SnakeEnv | |
| <span class="hljs-keyword">import</span> random | |
| <span class="hljs-comment"># Connect to environment</span> | |
| env = SnakeEnv.from_docker_image(<span class="hljs-string">"snake-env:latest"</span>) | |
| <span class="hljs-comment"># Training loop</span> | |
| <span class="hljs-keyword">for</span> episode <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">10</span>): | |
| result = env.reset() | |
| total_reward = <span class="hljs-number">0</span> | |
| done = <span class="hljs-literal">False</span> | |
| <span class="hljs-keyword">while</span> <span class="hljs-keyword">not</span> done: | |
| <span class="hljs-comment"># Simple random policy (replace with your agent)</span> | |
| action = SnakeAction(action=random.randint(<span class="hljs-number">0</span>, <span class="hljs-number">2</span>)) | |
| result = env.step(action) | |
| total_reward += result.reward | |
| done = result.done | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Episode <span class="hljs-subst">{episode}</span>: Reward=<span class="hljs-subst">{total_reward}</span>, "</span> | |
| <span class="hljs-string">f"Fruits=<span class="hljs-subst">{result.observation.episode_fruits}</span>, "</span> | |
| <span class="hljs-string">f"Steps=<span class="hljs-subst">{result.observation.episode_steps}</span>"</span>) | |
| env.close()`,lang:"python",wrap:!1});var A=l(W,2);s(A,{title:"Troubleshooting",local:"troubleshooting",headingTag:"h2"});var G=l(A,2);s(G,{title:"marlenv Installation Issues",local:"marlenv-installation-issues",headingTag:"h3"});var S=l(G,4);e(S,{code:"cGlwJTIwaW5zdGFsbCUyMGdpdCUyQmh0dHBzJTNBJTJGJTJGZ2l0aHViLmNvbSUyRmtjLW1sMiUyRm1hcmxlbnYuZ2l0",highlighted:"pip install git+https://github.com/kc-ml2/marlenv.git",lang:"bash",wrap:!1});var V=l(S,2);s(V,{title:"Import Errors",local:"import-errors",headingTag:"h3"});var E=l(V,4);e(E,{code:"Y2QlMjBzcmMlMkZlbnZzJTJGc25ha2VfZW52JTBBdXYlMjBydW4lMjAtLXByb2plY3QlMjAuJTIwc2VydmVy",highlighted:`<span class="hljs-built_in">cd</span> src/envs/snake_env | |
| uv run --project . server`,lang:"bash",wrap:!1});var N=l(E,2);s(N,{title:"Docker Build Issues",local:"docker-build-issues",headingTag:"h3"});var R=l(N,4);e(R,{code:"ZG9ja2VyJTIwYnVpbGQlMjAtdCUyMG9wZW5lbnYtYmFzZSUzQWxhdGVzdCUyMC1mJTIwc3JjJTJGb3BlbmVudiUyRmNvcmUlMkZjb250YWluZXJzJTJGaW1hZ2VzJTJGRG9ja2VyZmlsZSUyMC4=",highlighted:"docker build -t openenv-base:latest -f src/openenv/core/containers/images/Dockerfile .",lang:"bash",wrap:!1});var x=l(R,2);s(x,{title:"Citation",local:"citation",headingTag:"h2"});var X=l(x,4);e(X,{code:"JTQwTUlTQyU3Qm1hcmxlbnYyMDIxJTJDJTBBJTIwJTIwJTIwJTIwYXV0aG9yJTIwJTNEJTIwJTdCTUwyJTdEJTJDJTBBJTIwJTIwJTIwJTIwdGl0bGUlMjAlM0QlMjAlN0JNYXJsZW52JTJDJTIwTXVsdGktYWdlbnQlMjBSZWluZm9yY2VtZW50JTIwTGVhcm5pbmclMjBFbnZpcm9ubWVudCU3RCUyQyUwQSUyMCUyMCUyMCUyMGhvd3B1Ymxpc2hlZCUyMCUzRCUyMCU3QiU1Q3VybCU3Qmh0dHAlM0ElMkYlMkZnaXRodWIuY29tJTJGa2MtbWwyJTJGbWFybGVudiU3RCU3RCUyQyUwQSUyMCUyMCUyMCUyMHllYXIlMjAlM0QlMjAlN0IyMDIxJTdEJTBBJTdE",highlighted:`<span class="language-xml">@MISC</span><span class="hljs-template-variable">{marlenv2021, | |
| author = {ML2}</span><span class="language-xml">, | |
| title = </span><span class="hljs-template-variable">{Marlenv, Multi-agent Reinforcement Learning Environment}</span><span class="language-xml">, | |
| howpublished = </span><span class="hljs-template-variable">{\\url{http://github.com/kc-ml2/marlenv}</span><span class="language-xml">}, | |
| year = </span><span class="hljs-template-variable">{2021}</span><span class="language-xml"> | |
| }</span>`,lang:"bibtex",wrap:!1});var _=l(X,2);s(_,{title:"License",local:"license",headingTag:"h2"});var q=l(_,4);$(q,{source:"https://github.com/huggingface/openenv/blob/main/docs/source/environments/snake.md"}),tl(2),z(H,a),nl()}export{Ml as component}; | |
Xet Storage Details
- Size:
- 24.7 kB
- Xet hash:
- 7187c89f7887f79ebc840b8246f8b31b4c9e3e9555c287f71475086bb8d2cf91
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.