import tensorflow as tf
import numpy as np
# Параметры модели и обучения
num_actions = 3 # Пример: 3 возможных действия
gamma = 0.99 # Коэффициент дисконтирования
# Определение модели Q-сети
model = tf.keras.Sequential([
tf.keras.layers.Dense(64, activation='relu', input_shape=(3,)), # Ваше состояние описывается 3-мерным вектором
tf.keras.layers.Dense(64, activation='relu'),
tf.keras.layers.Dense(num_actions) # Выходной слой с количеством нейронов, равным количеству действий
])
# Оптимизатор
optimizer = tf.keras.optimizers.Adam()
# Функция потерь для DQN
def dqn_loss(states, actions, rewards, next_states, dones):
# Прогноз текущих Q-значений
q_values = model(states)
q_values = tf.reduce_sum(q_values * tf.one_hot(actions, num_actions), axis=1)
# Прогноз Q-значений для следующего состояния
next_q_values = model(next_states)
max_next_q_values = tf.reduce_max(next_q_values, axis=1)
# Вычисление целевых Q-значений
target_q_values = rewards + (1 - dones) * gamma * max_next_q_values
# Функция потерь: среднеквадратичная ошибка
loss = tf.reduce_mean(tf.square(q_values - target_q_values))
return loss
# Обучение модели
def train_step(states, actions, rewards, next_states, dones):
with tf.GradientTape() as tape:
loss = dqn_loss(states, actions, rewards, next_states, dones)
grads = tape.gradient(loss, model.trainable_variables)
optimizer.apply_gradients(zip(grads, model.trainable_variables))
return loss
# Пример данных (замените на ваши реальные данные)
batch_size = 32
states = np.random.random((batch_size, 3)) # Пример 3-мерных состояний
actions = np.random.randint(0, num_actions, size=(batch_size,))
rewards = np.random.random((batch_size,))
next_states = np.random.random((batch_size, 3))
dones = np.random.randint(0, 2, size=(batch_size,)).astype(np.float32)
# Обучение модели на одном шаге
loss = train_step(states, actions, rewards, next_states, dones)
print(f"Loss: {loss.numpy()}")