#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 значений:
- Позиция корзины
- Скорость корзины
- Угол полюса
- Скорость полюса на конце
В вашем автопилоте полета состояние будет информацией, которую вам нужно, чтобы ваш агент принимал решение, например:
- Текущая широта
- Текущая скорость
- …