Некоторые важные детали:
Хотя пространство и проблема нетривиальны, все, что я пытаюсь заставить его сделать изначально не стоит выбирать незаконные ходы и, возможно, не делать полностью вредных ходов. Однако этому не удалось научиться ни разу после множества различных прогонов по 10 миллионов шагов обучения каждый.
Среда моделирует 50 вокселей в трехмерном пространстве, которые находятся в заранее заданном исходном положении. и должен достичь целевой позиции с помощью последовательности команд (например: воксель 1 перемещается вниз). Начальная и целевая позиции постоянны во всех запусках в целях тестирования, но в идеале модель должна научиться делать это со случайными конфигурациями.
Пространство наблюдения состоит из 50 списков, содержащих 6 элементов: текущий x, y, z и целевые координаты x, y, z каждого куба. Пространство действий состоит из двух чисел: одно выбирает куб, а другое - направление его перемещения. Существуют некоторые ограничения на перемещение куба, поэтому обычно около 40–60 % пространства действий приводит к неправильному перемещению.
Код: Выделить всё
self.observation_space = spaces.Box(
low=-100, high=100, shape=(50, 6), dtype=np.float32
)
self.action_space = spaces.MultiDiscrete([
50, # Voxel ID
6 # Move ID (0 to 5)
])
Код: Выделить всё
def calculate_reward(self, action):
reward = 0
# Penalize invalid moves
if not is_legal(action):
reward -= 1
return reward
# If an incorrectly positioned voxel moves to a correct position, reward the model
if moved_voxel in self.target_positions and moved_voxel not in self.reached_target_positions:
reward += 1
# If a correctly positioned voxel moves to an incorrect position, reduce the reward
elif moved_voxel not in target_positions and moved_voxel in self.reached_target_positions:
reward -= 1
# Penalty for making any move to discourage long solutions
reward -= 0.1
return reward
Код: Выделить всё
from stable_baselines3 import PPO
model = PPO(
"MlpPolicy",
env,
device='cpu',
policy_kwargs=dict(
net_arch=[256, 512, 256]
)
n_steps=2000,
batch_size=100,
gae_lambda=0.95,
gamma=0.99,
n_epochs=10,
clip_range=0.2,
ent_coef=0.02,
vf_coef=0.5,
learning_rate=5e-5,
max_grad_norm=0.5
)
model.learn(total_timesteps=10_000_000, callback=callback, progress_bar=True)
obs = env.reset()
# Evaluate the model
for i in range(100):
action, _state = model.predict(obs, deterministic=True)
obs, reward, done, info = env.step(action)
print(f"Action: {action}, Reward: {reward}, Done: {done}")
if done.any():
obs = env.reset()
Код: Выделить всё
env = VoxelEnvironment()
env = SubprocVecEnv([make_env() for _ in range(8)])
env = VecNormalize(env, norm_obs=True, norm_reward=True, clip_reward=1, clip_obs=100)
/>

Заранее большое спасибо!
Подробнее здесь: https://stackoverflow.com/questions/793 ... nvironment
Мобильная версия