0

配列インデックスによって識別されるいくつかのアクションの確率の配列があります(たとえば、ボルツマン分布など)

for(int i=0;i<N_ACTIONS;i++)
        {
            p[i]=exp(q_tab[state()][i]/T);

            if(isnan(p[i]))
            {
                p[i]=0;
            }

        }
        long double s=p.sum();
        for(int i=0;i<N_ACTIONS;i++)   
        {
            p[i]=p[i]/s; 
        }

確率p[i]で0とN_ACTIONS-1の間の乱数iを選択する必要があります。私はこれを作りましたが、うまく機能していないようです:

int ChoiceFromDist(valarray<long double> p)
{
    int                   index=0;
    valarray<long double> cumulativa(p.size());

    cumulativa[0]=p[0];

    for(int i=1; i < p.size(); i++)
        cumulativa[i]  =  cumulativa[i-1]+p[i];

    long double num= ( (long double)rand()/(long double)RAND_MAX ); 

    while(index<p.size() && cumulativa[index]<num )
        index++;
    return index;
}

発信者:

srand(time(0));
act=ChoiceFromDist(p);

常に同じ番号を選択しているようです(0から2までは2を選択します)....何か問題があるか、別のコードポイントでエラーが発生しますか?ありがとう

4

0 に答える 0