2011-11-26 49 views
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++; 
} 

回答

3

通过一个随机数k,范围从[0, size-n_syns)Age_Increment。有Age_Increment返回k的空插槽。

3

既然你已经遍历Age_Increment整个列表,更新该函数返回非激活突触的索引列表。

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

2

这类似于找到在内存管理上的空白块的问题,所以我想看看在该领域使用的算法,具体free lists,这是免费的位置的列表。 (这些通常以链表的形式实现,以便能够有效地从元素的末尾弹出元素,链表中的随机访问仍然是O(n) - 具有较小的n,但仍不是用例的最佳选择。)

相关问题