как назначить состояния в DQN (Deep Q-Network)?

#c# #python #unity3d #neural-network #q-learning

#c# #python #unity3d #нейронная сеть #q-обучение

Вопрос:

Я создаю симуляцию полета с автопилотом, поэтому мне нужно создать DQN (Deep Q-Network) для управления автопилотом, но я не знаю оптимального количества состояний.

моделирование выполняется в unity, и вся окружающая среда и физика тоже выполнены, DQN нужно будет только выводить (W, A, S, D) для управления плоскостью, я нашел код, который управляет CARTPOLE, который теоретически должен иметь возможность обучать и управлять плоскостью просто отлично,единственная проблема в том, что я точно не знаю, являются ли выбранные мной состояния правильными или нет.

это код:

     
    import os
    import random
    import gym
    import numpy as np
    from collections import deque
    from keras.models import Sequential
    from keras.layers import Dense
    from keras.optimizers import Adam



    class DQNAGENT:

        def __init__(self,state_size,_action_size):

            self.state_size = state_sizes
            self.action_size = actions_sizes
            self.memory = deque(maxlen=2000)
            self.gamma = 0.95
            self.epsilon = 1.00
            self.epsilon_decay_rate = 0.995
            self.epsilon_min = 0.01
            self.learning_rate = 0.001
            self.model = self.build_model()

        def buildmodel(self):

            model = Sequential()
            model.add(Dense(24, input_dim=self.state_size, activation='relu'))
            model.add(Dense(24, activation='relu'))
            model.add(Dense(self.action_size, activation='linear'))
            model.compile(loss='mse',optimizer=Adam(lr=self.learning_rate))
            return model

        def remember(self, state, action, reward, next_state, done):

            self.memory.append((state, action, reward, next_state, done))

        def act(self, state):

            if np.random.rand()  self.epsilon_min:
                self.epsilon *= self.epsilon_decay_rate

        def load(self, name):

            self.model.load_weights(name)

        def save(self, name):

            self.model.save_weights(name)


    def main():
        #environemnet variables
        state_sizes=0
        actions_sizes=4
        #training Variables
        batch_size=32
        n_episodeds=100
        output_directory= 'model_output/autopilot'
        if not os.path.exists(output_directory):
            os.makedirs(output_directory)

        agent = DQNAGENT(state_sizes,actions_sizes)
        done = False

        for e in range(n_episodeds):
            state = #states of the game
            for time in range(5000):
                action = agent.act(state)
                #next_state, reward, done, _ = ##env.step(action)
                #put the next state from unity
                reward = reward if not done else -10
                agent.remember(state, action, reward, next_state, done)
                state = next_state
                if len(agent.memory) > batch_size:
                    agent.replay(batch_size)
      

там, где класс agent является агентом, который будет обучен, эти функции в порядке, но в основном размеры состояний равны нулю, потому что я еще не знаю число этих трех строк, которые я не могу преобразовать, чтобы иметь возможность работать в моем проекте

 state = #states of the game
action = agent.act(state)
next_state, reward, done, _ = ##env.step(action)
  

исходный код содержал следующие строки :

 env = gym.make('CartPole-v1')
state_size = env.observation_space.shape[0]
state = env.reset()
next_state, reward, done, _ = env.step(action)
  

поскольку он получает эти переменные из пакета Gym, но мне нужно ввести их вручную, моя среда будет состоять из скорости полета, положения самолета, положения в аэропорту и т. Д. Это то, что, я думаю, будет написано, поэтому, если кто-нибудь может помочь мне выяснить, правильно ли это или даже лучше, скажите мне, что будетоптимальные состояния будут действительно оценены.

исключенный результат выглядит примерно так.

 statesizes = 4
states= "how to write those states in this variable"
  

Ответ №1:

Состояния — это просто информация, которую ваш агент имеет в текущем «кадре / шаге».
Это то, что НУЖНО агенту для выбора действия agent.act(state) .

В примере с CartPole состояние представляет собой поле из 4 значений:

  • Позиция корзины
  • Скорость корзины
  • Угол полюса
  • Скорость полюса на конце

В вашем автопилоте полета состояние будет информацией, которую вам нужно, чтобы ваш агент принимал решение, например:

  • Текущая широта
  • Текущая скорость