Файл: Лабораторная работа 1 по курсу Инструменты бизнесаналитики исполнитель Богомолов Д. Н. Фио.docx
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 06.11.2023
Просмотров: 10
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
им. Н.Э. Баумана
Кафедра «Систем обработки информации и управления»
ОТЧЕТ
Лабораторная работа №_1_
по курсу «Инструменты бизнес-аналитики»
ИСПОЛНИТЕЛЬ: ___Богомолов Д.Н.___
ФИО
группа ИУ5-43М __________________
подпись
"__"_________2021_ г.
ПРЕПОДАВАТЕЛЬ: __________________
ФИО
_____Сухобоков А.В.___
подпись
"__"_________2021_ г.
Москва - 2021
Лабораторная работа №1
Цель. Необходимо построить модель для удержания маятника в равновесии (cartpole), используя обучение с подкреплением (Reinforcement Learning).
Cartpole - известный также как Перевернутый маятник с центром тяжести над своей точкой поворота. Он нестабилен, но его можно контролировать, перемещая точку поворота под центром массы. Цель состоит в том, чтобы сохранить равновесие карпола, прикладывая соответствующие усилия к точке поворота.
Рисунок 1. – Схематическое изображение тележки
Фиолетовый квадрат указывает на опорную точку.
Красные и зеленые стрелки показывают возможные горизонтальные силы, которые могут быть применены к точке поворота.
Полюс прикреплен неиспользуемым соединением к тележке, которая движется по дорожке без трения. Система управляется приложением силы +1 или -1 к тележке. Маятник начинается вертикально, и цель состоит в том, чтобы предотвратить его падение. Награда +1 предоставляется за каждый временной шаг, когда шест остается в вертикальном положении. Эпизод заканчивается, когда полюс отклоняется от вертикали более чем на 15 градусов или тележка перемещается более чем на 2,4 единицы от центра.
Импорт библиотек
Настройка гиперпараметров
Архитектура нейронной сети
Работа с моделью
class DQNCartPoleSolver():
def __init__(self, n_episodes=1000, n_win_ticks=195, max_env_steps=None, gamma=1.0, epsilon=1.0, epsilon_min=0.01,
epsilon_log_decay=0.995, alpha=0.01, alpha_decay=0.01, batch_size=64, monitor=False, quiet=False):
self.memory = deque(maxlen=100000)
self.env = gym.make('CartPole-v0')
if monitor: self.env = gym.wrappers.Monitor(self.env,
'../data/cartpole-1', force=True)
self.gamma = gamma
self.epsilon = epsilon
self.epsilon_min = epsilon_min
self.epsilon_decay = epsilon_log_decay
self.alpha = alpha
self.alpha_decay = alpha_decay
self.n_episodes = n_episodes
self.n_win_ticks = n_win_ticks
self.batch_size = batch_size
self.quiet = quiet
self.model = get_model(self.alpha, self.alpha_decay)
if max_env_steps is not None: self.env._max_episode_steps = max_env_steps
def remember(self, state, action, reward, next_state, done):
self.memory.append((state, action, reward, next_state, done))
def choose_action(self, state, epsilon):
return self.env.action_space.sample() if (np.random.random() <= epsilon)
else np.argmax(self.model.predict(state))
def get_epsilon(self, t):
return max(self.epsilon_min, min(self.epsilon, 1.0 –
math.log10((t + 1) * self.epsilon_decay)))
def preprocess_state(self, state):
return np.reshape(state, [1, 4])
def replay(self, batch_size):
x_batch, y_batch = [], []
minibatch = random.sample(self.memory, min(len(self.memory), batch_size))
for state, action, reward, next_state, done in minibatch:
y_target = self.model.predict(state)
y_target[0][action] = reward if done else reward + self.gamma *
np.max(self.model.predict(next_state)[0])
x_batch.append(state[0])
y_batch.append(y_target[0])
self.model.fit(np.array(x_batch), np.array(y_batch), batch_size=len(x_batch),
verbose=0)
if self.epsilon > self.epsilon_min:
self.epsilon *= self.epsilon_decay
def run(self):
scores = deque(maxlen=100)
for e in range(self.n_episodes):
state = self.preprocess_state(self.env.reset())
done = False
i = 0
while not done:
q = self.get_epsilon(e)
self.debug.append(q)
action = self.choose_action(state, q)
next_state, reward, done, _ = self.env.step(action)
next_state = self.preprocess_state(next_state)
self.remember(state, action, reward, next_state, done)
state = next_state
i += 1
scores.append(i)
mean_score = np.mean(scores)
if mean_score >= self.n_win_ticks and e >= 100:
if not self.quiet: print('Ran {} episodes. Solved after {} trials with mean {} ✔'.format(e,
e - 100,
mean_score))
return e - 100
if e % 100 == 0 and not self.quiet:
print('[Episode {}] - Mean survival time over last {} episodes was {} ticks.'.format(e,
100,
mean_score))
self.replay(self.batch_size)
if not self.quiet: print('Did not solve after {} episodes ????'.format(e))
return e
Создание экземпляра класса и запуск обучения
Кривая обучения
Рисунок 2 – график обучения модели
Тестирование модели
Устанавливаем максимальное количество тиков и тестируем модель.
Результат работы модели
Результат 300 тиков
Результат 250 тиков
Результат 480 тиков
Результат 300 тиков
Результат 200 тиков
Результат 500 тиков
Результат 150 тиков
Результат 246 тиков
Результат 424 тиков
Результат 199 тиков
Результат 315 тиков
Результат 345 тиков
Результат 195 тиков
Результат 350 тиков
Результат 421 тиков