Сапер РЛ выполняет повторяющиеся действияPython

Программы на Python
Ответить
Anonymous
 Сапер РЛ выполняет повторяющиеся действия

Сообщение Anonymous »

(Я использую обучение с подкреплением)
Библиотеки
Для среды я использовал Gymnasium. Для DQN я использовал Stable-Baselines3.
Каждый раунд ИИ решает открыть 2–4 поля и открывает эти поля непрерывно в цикле. Никакой стратегии нет! ИИ, похоже, не заботится об отрицательных наградах. Как будто его не волнует пространство наблюдения, его ничего не волнует. Тренировка в течение более длительного времени приводит к открытию большего количества полей. Например, тренировка на 1000 шагов открывает около 2 полей. За 100 000 шагов открывается около 4 полей. Но он всегда открывает одни и те же поля каждый раунд.
Объяснение того, как работает программа:
У ИИ Сапера есть пространство действий, состоящее из Мультидискрета в форме [x , й]. Пространство наблюдения ИИ представляет собой поле 8x8, в котором каждое поле принимает значение от 0 до 10. 0 означает, что бомба не обнаружена, 1 означает, что в радиусе 1 бомба, 2 означает, что в радиусе 2 бомбы, ..., 10 означает, что она обнаружена и в радиусе нет бомб.
Награды
Если координаты x и y поля, которое нужно раскрыть, попадают в уже открытое поле (поле в поле, которое не равно 0, что означает, что оно не необнаружено), ИИ получает награду -5. Кроме того, в классе ИИ есть переменная, которая отслеживает, сколько неправильных ходов осталось (эта переменная в настоящее время не видна ИИ). Каждый раз, когда он дает координату, указывающую на уже открытое поле, переменная уменьшается на 1. Я установил максимальное количество плохих ходов равным 30, пока игра не закончится и ИИ не проиграет (без дополнительной отрицательной награды). Обнаружение поля, на котором нет бомбы, дает ИИ 0,2 + бонус, который увеличивается в зависимости от правильного угадывания ИИ. Когда игра выиграна, ИИ получает награду в размере 50, когда игра проиграна, ИИ получает награду в размере -50.

Код: Выделить всё

from stable_baselines3.common.env_checker import check_env
from stable_baselines3 import A2C
from stable_baselines3.common.logger import configure
import stable_baselines3 as PPO
from stable_baselines3.common.evaluation import evaluate_policy

env = MinesweeperEnv(render_mode="human")
#check_env(env)
# create
tmp_path = "/tmp/sb3_log/"
logger = configure(tmp_path, ["stdout", "csv", "tensorboard"])

model = A2C("MlpPolicy", env, verbose=1, learning_rate=0.005)
model.set_logger(logger)
model.learn(total_timesteps=10000, progress_bar=False)
model.save("minesweeperai")
model = A2C.load("minesweeperai", env=env)
# evaluate existing model, test how good it is
mean_reward, std_reward = evaluate_policy(model, model.get_env(), n_eval_episodes=10)
print(mean_reward)
# returns around -124
vec_env = model.get_env()
obs = vec_env.reset()
for i in range(1000):
action, _states = model.predict(obs, deterministic=True)
obs, rewards, dones, info = vec_env.step(action)
vec_env.render('human')
pygame.quit()
# mostly doesnt have any moves left

Код: Выделить всё

class MinesweeperEnv(Env):
#...
self.action_space = MultiDiscrete([8, 8])

# the observation space is the "input" of the ai, what type it expects to see
self.observation_space = Box(low=0, high=10, shape=(8, 8), dtype=int)
#...
def step(self, action):
# reminder:
# state = array of visible tiles: [0, 0, 0, 1, 10, ...]
y, x = action

reward = 0
debug = False
self.done = False

neighbors = self.get_neighbors(self.state, x, y)

# check the tile of index action and solve it
#print(self.state)

self.moves -= 1

if self.moves  0 or self.remaining_fields == 63:
#reward += 0.1
self.streak += 1
else:
reward -= 0.4
self.streak = 0

# Reward wenn keine bombe ist
if self.solution[x, y] != 10:
reward += 0.2 + (0.2*(math.log10(self.streak+1))*(1/math.log10(2))-0.2)
# reward wenn bombe ist
else:
reward += -10
self.lives -= 1

# Gewinnen
if np.count_nonzero((self.state != 10) & (self.state != 0)) == 64 - np.count_nonzero(self.solution == 10):
self.done = True
reward = 50
if self.render_mode == "human" and self.dorender:
print("Gewonnen")
self.render()

# Check if time is 0. if it is, the ai will finish.
if self.lives 

Подробнее здесь: [url]https://stackoverflow.com/questions/79251038/minesweeper-rl-executing-repeated-actions[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»