0

我最终确定这个功能是我的大部分瓶颈问题的原因。我认为这是因为当大多数突触已经处于活动状态时会发生大量过度的随机访问。基本上,正如标题所说,我需要以某种方式优化算法,这样我就不会随机检查大量活动元素,然后再登陆剩下的少数几个元素之一。

此外,我还包括了整个功能,以防出现其他可以发现的缺陷。

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

由于您已经在遍历整个列表Age_Increment,请更新该函数以返回非活动突触的索引列表。

然后,您可以直接从该列表中选择一个随机项目。

于 2011-11-26T12:52:15.580 回答
3

k在 的范围内[0, size-n_syns)传递一个随机数 , Age_Increment。已Age_Increment返回第一个k空插槽。

于 2011-11-26T12:59:02.610 回答
2

这类似于在内存管理中寻找空闲块的问题,所以我会看一下该域中使用的算法,特别是free lists,它是一个空闲位置的列表。(这些通常实现为链表,以便能够有效地从一端弹出元素。链表中的随机访问仍然是 O(n) - 具有较小的 n,但仍然不是您的用例的最佳选择。)

于 2011-11-26T12:53:38.513 回答