0

最終的に、ボトルネックの問題の大部分はこの機能に原因があると判断しました。ほとんどのシナプスがすでにアクティブになっているときに発生する、非常に過剰なランダム アクセスが原因だと思います。基本的に、タイトルが示すように、残っている数少ない要素の 1 つに到達する前に大量のアクティブな要素をランダムにチェックしないように、何らかの方法でアルゴリズムを最適化する必要があります。

また、発見できる他の欠陥がある場合に備えて、関数全体を含めました。

void NetClass::Explore(vector <synapse> & synapses, int & n_syns)   //add new synapses
{
    int size = synapses.size();
    assert(n_syns <= size );

    //Increase the age of each active synapse by 1
    Age_Increment(synapses);

    //make sure there is at least one inactive vector left
    if(n_syns == size)
        return;

        //stochastically decide whether a new connection is added
        if((rand_r(seedp) %1000) < ( x / (1 +(n_syns * ( y / 100)))))  
        {
            n_syns++; //a new synapse has been created

            //main inefficiency here
            while(1)
            {
                int syn = rand_r(seedp) % (size);
                if (!synapses[syn].active)
                {
                    synapses[syn].active = true;
                    synapses[syn].weight = .04 + (float (rand_r(seedp) % 17) / 100);     
                    break;
                }
            }
        }  
}

void NetClass::Age_Increment(vector <synapse> & synapses)  
{
    for(int q=0, int size = synapses.size(); q < size; q++)
        if(synapses[q].active)
            synapses[q].age++;
}
4

3 に答える 3

3

から までkの範囲の乱数 を渡します。番目の空きスロットを返しました。[0, size-n_syns)Age_IncrementAge_Incrementk

于 2011-11-26T12:59:02.610 に答える
3

で既にリスト全体をトラバースしているのでAge_Increment、その関数を更新して、非アクティブなシナプスのインデックスのリストを返します。

次に、そのリストからランダムなアイテムを直接選択できます。

于 2011-11-26T12:52:15.580 に答える
2

これは、メモリ管理で空きブロックを見つける問題に似ているため、そのドメインで使用されているアルゴリズム、特に空き位置のリストであるfree listsを調べます。(これらは通常、端から要素を効率的にポップできるように連結リストとして実装されます。連結リストでのランダム アクセスは、依然として O(n) であり、n は小さくなりますが、ユース ケースには最適な選択ではありません。)

于 2011-11-26T12:53:38.513 に答える