Browse Source

Eliminated source of non-determinism

Maxime Chevalier-Boisvert 7 years ago
parent
commit
4d84ecd45f
4 changed files with 12 additions and 9 deletions
  1. 1 1
      gym_minigrid/envs/lockedroom.py
  2. 5 3
      gym_minigrid/envs/multiroom.py
  3. 3 2
      gym_minigrid/register.py
  4. 3 3
      run_tests.py

+ 1 - 1
gym_minigrid/envs/lockedroom.py

@@ -91,7 +91,7 @@ class LockedRoom(MiniGridEnv):
         # Assign the door colors
         colors = set(COLOR_NAMES)
         for room in self.rooms:
-            color = self._randElem(colors)
+            color = self._randElem(sorted(colors))
             colors.remove(color)
             room.color = color
             if room.locked:

+ 5 - 3
gym_minigrid/envs/multiroom.py

@@ -104,10 +104,12 @@ class MultiRoomEnv(MiniGridEnv):
             # If this isn't the first room, place the entry door
             if idx > 0:
                 # Pick a door color different from the previous one
-                doorColors = set(COLORS.keys())
+                doorColors = set(COLOR_NAMES)
                 if prevDoorColor:
                     doorColors.remove(prevDoorColor)
-                doorColor = self._randElem(doorColors)
+                # Note: the use of sorting here guarantees determinism,
+                # This is needed because Python's set is not deterministic
+                doorColor = self._randElem(sorted(doorColors))
 
                 entryDoor = Door(doorColor)
                 grid.set(*room.entryDoorPos, entryDoor)
@@ -204,7 +206,7 @@ class MultiRoomEnv(MiniGridEnv):
             # Pick which wall to place the out door on
             wallSet = set((0, 1, 2, 3))
             wallSet.remove(entryDoorWall)
-            exitDoorWall = self._randElem(wallSet)
+            exitDoorWall = self._randElem(sorted(wallSet))
             nextEntryWall = (exitDoorWall + 2) % 4
 
             # Pick the exit door position

+ 3 - 2
gym_minigrid/register.py

@@ -1,6 +1,6 @@
 from gym.envs.registration import register as gymRegister
 
-envSet = set()
+envList = []
 
 def register(
     id,
@@ -8,6 +8,7 @@ def register(
     reward_threshold=900
 ):
     assert id.startswith("MiniGrid-")
+    assert id not in envList
 
     # Register the environment with OpenAI gym
     gymRegister(
@@ -17,4 +18,4 @@ def register(
     )
 
     # Add the environment to the set
-    envSet.add(id)
+    envList.append(id)

+ 3 - 3
run_tests.py

@@ -3,7 +3,7 @@
 import random
 import gym
 import numpy as np
-from gym_minigrid.register import envSet
+from gym_minigrid.register import envList
 from gym_minigrid.minigrid import Grid
 
 # Test specifically importing a specific environment
@@ -14,9 +14,9 @@ from gym_minigrid.wrappers import *
 
 ##############################################################################
 
-print('%d environments registered' % len(envSet))
+print('%d environments registered' % len(envList))
 
-for envName in sorted(envSet):
+for envName in envList:
     print('testing "%s"' % envName)
 
     # Load the gym environment