Подскажите оптимальную функцию для выбора действия в 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;
Как лучше организовать процесс перехода от рандомных действий к выбору по максимальному весу?
В частности, в моем случае награды будут от нуля и выше. Какую можно использовать функцию для преобразования веса? Т.е. веса действий дополнительно преобразовывать, чтобы выбор производился по преобразованному весу. Чтобы это преобразование заменяло отсекающую функцию, и функция отсечения становилась приведением не угодных действий к вероятности близкой к нулю, а не жесткому отсечению.