- Исполнители
-
Обучение
Учебный центр Python Запускаемые примеры, NumPy, pandas и другое Учебный центр C и C++ Указатели, память, STL и современный C++ Учебный центр C#Основы C#, ООП, LINQ, async и упражнения .NET Алгоритмы на Python Поиск, сортировка, рекурсия и визуализация O(n) Алгоритмы на C и C++ Сравнение реализаций на C и C++
- Задачи
Q-learning учится только на опыте, насколько хорошо каждое действие в каждом состоянии, Q(s, a). После действия a в состоянии s, получения reward и перехода в состояние s':
- target = reward, если эпизод закончился (
done= 1) - target = reward + gamma × максимум по a' от Q(s', a'), иначе
- Q(s, a) ← Q(s, a) + alpha × (target - Q(s, a))
Начните со всех значений Q, равных 0, и применяйте переходы по порядку.
Реализуйте q_learning(num_states, num_actions, transitions, alpha, gamma).
Входные данные
num_states, num_actions: Размер таблицы.
transitions: По одной строке [state, action, reward, next_state, done] на шаг.
alpha: Скорость обучения.
gamma: Коэффициент дисконтирования.
Выходные данные
Верните таблицу Q в виде матрицы с одной строкой на состояние и одним столбцом на действие.
Ограничения
1 ≤ num_states, num_actions ≤ 100, 0 ≤ число переходов ≤ 10 000
-100 ≤ reward ≤ 100, done равно 0 или 1
0 < alpha ≤ 1, 0 ≤ gamma ≤ 1
Примеры
Пример 1
Ввод:
alpha = 0.5
gamma = 0.9
num_states = 2
num_actions = 2
transitions = [
[0, 1, 0, 1, 0],
[1, 0, 10, 0, 1]
]
Ожидаемый вывод:
[
[0.0, 0.0],
[5.0, 0.0]
]
Пояснение
На первом шаге награды ещё нет: target = 0 + 0.9 × max(Q[1]) = 0, поэтому Q[0][1] остаётся 0. Второй шаг завершает эпизод с наградой 10: Q[1][0] = 0 + 0.5 × (10 - 0) = 5.
Пример 2
Ввод:
alpha = 0.5
gamma = 0.9
num_states = 2
num_actions = 2
transitions = [
[1, 0, 10, 0, 1],
[0, 1, 0, 1, 0]
]
Ожидаемый вывод:
[
[0.0, 2.25],
[5.0, 0.0]
]
Пояснение
Те же шаги в обратном порядке. Q[1][0] сначала становится 5, поэтому шаг из состояния 0 его видит: target = 0 + 0.9 × 5 = 4.5 и Q[0][1] = 0.5 × 4.5 = 2.25. Награда распространилась на одно состояние назад.
Ссылки
-
Пример 1 Не запущеноВвод:
alpha = 0.5 gamma = 0.9 num_states = 2 num_actions = 2 transitions = [ [0, 1, 0, 1, 0], [1, 0, 10, 0, 1] ]Ожидаемый вывод:[ [0.0, 0.0], [5.0, 0.0] ]Ваш вывод -
Пример 2 Не запущеноВвод:
alpha = 0.5 gamma = 0.9 num_states = 2 num_actions = 2 transitions = [ [1, 0, 10, 0, 1], [0, 1, 0, 1, 0] ]Ожидаемый вывод:[ [0.0, 2.25], [5.0, 0.0] ]Ваш вывод
При отправке также выполняются ещё 4 скрытых теста.
Онлайн-компилятор и отладчик C++
Компилируйте и отлаживайте C++ с точками останова, просмотром переменных и пошаговым выполнением GDB в серверном режиме.
🚀 2,392,395 всего выполнений (21 в этом месяце)
Практикуйте C++ на задачах
Решайте задачи прямо в редакторе: запускайте тесты, отправляйте решение и получайте AI-рецензию.
Выбрать тему
Изучайте C и C++ вместе на практическом коде: вывод, модель памяти, структуры данных, алгоритмы и современный C++.
💻 Об онлайн-компиляторе C++
Онлайн-компилятор C++ от CodeUtility позволяет писать, компилировать и запускать код прямо в браузере — без установки и настройки компилятора. Он работает в безопасной песочнице и поддерживает реальные стандарты C++ - от C++11, C++14, C++17 и до последней версии.
Этот инструмент использует настоящий компилятор C++, работающий в облаке, чтобы компилировать и выполнять ваш код, обеспечивая точное и единообразное поведение в разных версиях. Вы можете свободно экспериментировать с основами C++ - переменными, функциями, циклами, условиями и объектно-ориентированным программированием.
Готовитесь к собеседованиям, осваиваете современные возможности C++ или проверяете логику алгоритмов - Онлайн-компилятор C++ от CodeUtility предоставляет простую, но мощную среду для мгновенного запуска кода с любого устройства.
Больше, чем средство запуска кода
Используйте в одном исполнителе многофайловый редактор, изолированный терминал выполнения, библиотеки для выбранной среды, постоянные рабочие пространства, общий доступ и совместную работу в реальном времени.
Как пользоваться этим исполнителем?
Выберите среду выполнения, откройте или создайте файл, напишите код и нажмите «Запустить». Результат появится в терминале. Пользователи, вошедшие в систему, могут хранить файлы в рабочем пространстве, устанавливать библиотеки и совместно работать через общие ресурсы.
- Выберите версию и отредактируйте текущий файл или откройте другой файл рабочего пространства.
- Запустите код, при необходимости введите данные в терминале и просмотрите сохранённую историю запусков.
- Используйте библиотеки, инструменты рабочего пространства, общий доступ и чат, когда для задачи требуется несколько фрагментов кода.
💡 Основы C++ и примеры, которые можно попробовать выше
1. Объявление переменных и констант
В C++ необходимо объявлять тип каждой переменной. Используйте const, чтобы определить значения только для чтения, которые нельзя изменить после инициализации.
int age = 30;
double pi = 3.14159;
char grade = 'A';
std::string name = "Alice";
bool isActive = true;
// Константы
const int MAX_USERS = 100;
const std::string COMPANY = "CodeUtility";
// Попытка изменить const приведёт к ошибке компиляции
// MAX_USERS = 200; // ❌ ошибка
2. Условия (if / switch)
Используйте if, else if, else для ветвления. Для множества вариантов используйте switch.
int x = 2;
if (x == 1) {
std::cout << "Один\n";
} else if (x == 2) {
std::cout << "Два\n";
} else {
std::cout << "Другое\n";
}
// switch-case
switch (x) {
case 1:
std::cout << "Один\n";
break;
case 2:
std::cout << "Два\n";
break;
default:
std::cout << "Другое\n";
}
3. Циклы
Используйте for, while и do-while для повторения блоков кода.
for (int i = 0; i < 3; i++) {
std::cout << i << "\n";
}
int n = 3;
while (n > 0) {
std::cout << n << "\n";
n--;
}
4. Массивы
Массивы хранят несколько элементов одного типа.
int numbers[3] = {10, 20, 30};
std::cout << numbers[1] << "\n";
5. Операции с массивами/векторами
Используйте std::vector для динамических массивов.
#include <vector>
std::vector nums = {1, 2, 3};
nums.push_back(4);
nums.pop_back();
for (int n : nums) {
std::cout << n << " ";
}
6. Ввод/вывод в консоль
Используйте std::cin для ввода и std::cout для вывода.
std::string name;
std::cout << "Введите ваше имя: ";
std::cin >> name;
std::cout << "Привет, " << name << "\n";
7. Функции
Функции объединяют переиспользуемую логику. Используйте параметры и возвращаемые типы.
int add(int a, int b) {
return a + b;
}
std::cout << add(3, 4);
8. Отображения (map)
std::map хранит пары ключ-значение, как словарь.
#include <map>
std::map ages;
ages["Alice"] = 30;
std::cout << ages["Alice"];
9. Обработка исключений
Используйте try и catch для обработки ошибок времени выполнения.
try {
throw std::runtime_error("Произошла ошибка");
} catch (const std::exception& e) {
std::cout << e.what();
}
10. Работа с файлами (I/O)
Используйте fstream для чтения и записи файлов.
#include <fstream>
std::ofstream out("file.txt");
out << "Привет, файл";
out.close();
std::ifstream in("file.txt");
std::string line;
getline(in, line);
std::cout << line;
in.close();
11. Работа со строками
Строки C++ поддерживают методы length(), substr() и find().
std::string text = "Привет, мир";
std::cout << text.length();
std::cout << text.substr(0, 5);
std::cout << text.find("мир");
12. Классы и объекты
C++ поддерживает объектно-ориентированное программирование с помощью классов.
class Person {
public:
std::string name;
Person(std::string n) : name(n) {}
void greet() { std::cout << "Привет, я " << name; }
};
Person p("Alice");
p.greet();
13. Указатели
Указатель хранит адрес памяти другой переменной. Используйте &, чтобы получить адрес,
и *, чтобы разыменовать (получить значение по адресу).
int x = 10;
int* ptr = &x;
std::cout << "Значение x: " << x << "\n";
std::cout << "Адрес x: " << ptr << "\n";
std::cout << "Значение по указателю: " << *ptr << "\n";
// Изменяем x через указатель
*ptr = 20;
std::cout << "Обновлённый x: " << x << "\n";
🐞 Как отлаживать код %{language} онлайн
Онлайн-отладчик %{language} помогает находить ошибки выполнения и логики без установки компилятора или IDE. Серверный режим компилирует с отладочными символами и запускает программу под GDB.
- Установите точки останова рядом с номерами строк.
- Выберите Debug, чтобы скомпилировать и остановиться в первой подходящей точке.
- Проверьте текущую строку, стек вызовов и переменные.
- Используйте Continue, Step Over, Step Into или Step Out.
- Выберите Stop, чтобы завершить сеанс.
Начните с небольшого воспроизводимого примера и поставьте точку останова перед неожиданным поведением.