随机选择一个空向量元素,当有可能事先知道哪些是满的

randomly choosing an empty vector element, when it is possible to know beforehand which are full

本文关键字:先知 有可能 选择 一个 元素 向量 随机      更新时间:2023-10-16

我最终确定这个函数是造成我的大部分瓶颈问题的原因。我认为这是因为大量过度的随机存取发生在大多数突触已经活跃的时候。基本上,正如标题所说,我需要以某种方式优化算法,这样我就不会随机检查大量的活动元素,然后降落到剩下的少数几个元素之一。

此外,我还包含了整个函数,以防发现其他缺陷。

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++;
}

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

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

你可以直接从列表中随机选择一个项目

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