Файл: Лабораторная работа 1 по курсу Инструменты бизнесаналитики исполнитель Богомолов Д. Н. Фио.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 06.11.2023

Просмотров: 49

Скачиваний: 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 тиков