Проблема, которую я хочу решить, на самом деле не так проста, но это своего рода игрушечная игра, которая поможет мне решить большую проблему.
, поэтому у меня есть матрица 5x5 со значениями, равными 0:
structure = np.zeros(25).reshape(5, 5)
, и цель в том, чтобы агент превратил все значения в 1, поэтому у меня есть:
goal_structure = np.ones(25).reshape(5, 5)
Я создал класс Player с 5 действиями для go влево , вправо, вверх, вниз или отразить (поверните значение от 0 до 1 или от 1 до 0). За вознаграждение, если агент меняет значение 0 на 1, он получает +1 вознаграждение. если он превращает 1 в 0, получает отрицательное вознаграждение (я пробовал много значений от -1 до 0 или даже -0.1). и если он просто идет влево, вправо, вверх или вниз, он получает вознаграждение 0.
Поскольку я хочу передать состояние в свой нейронный net, я изменил состояние, как показано ниже:
reshaped_structure = np.reshape(structure, (1, 25))
и затем я добавляю нормализованную позицию агента в конец этого массива (потому что я полагаю, что агент должен иметь представление о том, где он находится):
reshaped_state = np.append(reshaped_structure, (np.float64(self.x/4), np.float64(self.y/4)))
state = reshaped_state
но я не получаю любые хорошие результаты! это так же, как случайное! Я пробовал разные функции вознаграждения, разные алгоритмы оптимизации, такие как воспроизведение Exeperience, цель net, Double DQN, дуэли, но ни одна из них, похоже, не работает! и я думаю, что проблема с определением государства. Может ли кто-нибудь помочь мне с определением хорошего состояния?
Большое спасибо!
ps: это моя пошаговая функция:
class Player:
def __init__(self):
self.x = 0
self.y = 0
self.max_time_step = 50
self.time_step = 0
self.reward_list = []
self.sum_reward_list = []
self.sum_rewards = []
self.gather_positions = []
# self.dict = {}
self.action_space = spaces.Discrete(5)
self.observation_space = 27
def get_done(self, time_step):
if time_step == self.max_time_step:
done = True
else:
done = False
return done
def flip_pixel(self):
if structure[self.x][self.y] == 1:
structure[self.x][self.y] = 0.0
elif structure[self.x][self.y] == 0:
structure[self.x][self.y] = 1
def step(self, action, time_step):
reward = 0
if action == right:
if self.y < y_threshold:
self.y = self.y + 1
else:
self.y = y_threshold
if action == left:
if self.y > y_min:
self.y = self.y - 1
else:
self.y = y_min
if action == up:
if self.x > x_min:
self.x = self.x - 1
else:
self.x = x_min
if action == down:
if self.x < x_threshold:
self.x = self.x + 1
else:
self.x = x_threshold
if action == flip:
self.flip_pixel()
if structure[self.x][self.y] == 1:
reward = 1
else:
reward = -0.1
self.reward_list.append(reward)
done = self.get_done(time_step)
reshaped_structure = np.reshape(structure, (1, 25))
reshaped_state = np.append(reshaped_structure, (np.float64(self.x/4), np.float64(self.y/4)))
state = reshaped_state
return state, reward, done
def reset(self):
structure = np.zeros(25).reshape(5, 5)
reset_reshaped_structure = np.reshape(structure, (1, 25))
reset_reshaped_state = np.append(reset_reshaped_structure, (0, 0))
state = reset_reshaped_state
self.x = 0
self.y = 0
self.reward_list = []
self.gather_positions = []
# self.dict.clear()
return state