Вот пример реализации простого обучения с подкреплением на языке C, где агент учится выбирать между двумя действиями с разными вероятностями получения награды:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
srand(time(NULL)); // Инициализация генератора случайных чисел
// Параметры обучения
double Q[2] = {0.0, 0.0}; // Q-значения для двух действий
double alpha = 0.1; // Скорость обучения
double epsilon = 0.1; // Вероятность исследования
int episodes = 1000; // Количество эпизодов
int action_counts[2] = {0}; // Счетчик выбора действий
// Процесс обучения
for (int episode = 0; episode < episodes; episode++) {
int action;
// ε-жадный выбор действия
if ((double)rand() / RAND_MAX < epsilon) {
action = rand() % 2; // Случайное действие (исследование)
} else {
// Жадный выбор (использование)
action = (Q[0] > Q[1]) ? 0 : 1;
}
action_counts[action]++;
// Генерация награды
int reward;
if (action == 0) {
// Действие 0: 70% chance +1, 30% chance -1
reward = (rand() % 100 < 70) ? 1 : -1;
} else {
// Действие 1: 30% chance +1, 70% chance -1
reward = (rand() % 100 < 30) ? 1 : -1;
}
// Обновление Q-значения
Q[action] += alpha * (reward - Q[action]);
}
// Вывод результатов
printf("Обучение завершено!\n");
printf("Q-значения: [Действие 0: %.2f, Действие 1: %.2f]\n", Q[0], Q[1]);
printf("Выбор действий: [Действие 0: %d раз, Действие 1: %d раз]\n",
action_counts[0], action_counts[1]);
return 0;
}
```
Этот код демонстрирует:
1. **ε-жадную стратегию** выбора действий (10% случайные действия для исследования)
2. **Обновление Q-значений** по правилу:
`Q(a) ← Q(a) + α * (reward - Q(a))`
3. **Среду с разными вероятностями** наград:
- Действие 0: +1 (70%), -1 (30%)
- Действие 1: +1 (30%), -1 (70%)
После 1000 эпизодов агент должен:
- Показать более высокое Q-значение для действия 0
- Выбирать действие 0 значительно чаще
Пример вывода:
```
Обучение завершено!
Q-значения: [Действие 0: 0.42, Действие 1: -0.31]
Выбор действий: [Действие 0: 873 раз, Действие 1: 127 раз]
```
Это показывает, что агент успешно научился выбирать более выгодное действие (0), которое дает большую ожидаемую награду.
Комментариев нет:
Отправить комментарий