Подскажите оптимальную функцию для выбора действия в q-learning алгоритме

Допустим есть некий q-learning подобный алгоритм. Для выбираемых действий у него накапливаются веса. По началу действия выбираются рандомно. А затем по тихоньку поднимают минимальную планку веса, с которым выбирается действие. Выбор производится согласно распределению весов из оставшихся действий.

Наиболее наивный способ выбора действия согласно весам выглядит наверное примерно так:

vector<double> weights = {...};
const double minWeight = ...;

double sumWeights = 0.;
for (double w: weights)
   if (w > minWeight)
      sumWeights += w - minWeight;

double selection = sumWeights * rand() / RAND_MAX;
for (int iAction = 0; iAction < weights.size(); ++iAction) {
   double w = weights.at(ii) - minWeight;
   if (w > 0.)
      if ( (selection -= w) <= 0. )
         return iAction;
}

return weights.size()-1;

Как лучше организовать процесс перехода от рандомных действий к выбору по максимальному весу?

В частности, в моем случае награды будут от нуля и выше. Какую можно использовать функцию для преобразования веса? Т.е. веса действий дополнительно преобразовывать, чтобы выбор производился по преобразованному весу. Чтобы это преобразование заменяло отсекающую функцию, и функция отсечения становилась приведением не угодных действий к вероятности близкой к нулю, а не жесткому отсечению.


Ответы (0 шт):