随机选择一个空向量元素,当有可能事先知道哪些是满的
randomly choosing an empty vector element, when it is possible to know beforehand which are full
我最终确定这个函数是造成我的大部分瓶颈问题的原因。我认为这是因为大量过度的随机存取发生在大多数突触已经活跃的时候。基本上,正如标题所说,我需要以某种方式优化算法,这样我就不会随机检查大量的活动元素,然后降落到剩下的少数几个元素之一。
此外,我还包含了整个函数,以防发现其他缺陷。
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,但仍然不是您用例的最佳选择。
相关文章:
- 有可能在Armadillo中复制MATLAB circshift方法吗
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- 有可能使shared_ptr协变吗
- 有可能在信号处理程序中设置promise吗
- 是否有可能实现O(N)时间和O(1)空间解决方案,以实现C++中的字符串循环移位
- 是否有可能构建面向Linux和Windows的.Net Core C++ / CLI应用程序?
- 是否有可能使用debug_info获取ELF文件的源代码?
- C++,是否有可能/如何定义在.h和.cpp源文件中调用函数的类构造函数
- 有可能在C++中有类的查找表吗
- 是否有可能让 c++ dll 在后台运行 python 程序并让它填充向量图?如果是这样,如何?
- 向量的大小是否有可能为 1 但其中的元素数量为零?
- 是否有可能编写新的叮当声现代化规则?
- 是否有可能通过指向另一个未关联的子对象的指针来获取指向一个子对象的指针?
- 是否有可能通过演绎指南实现整个 std::make_tuple 功能?
- 是否有可能在没有复制的情况下传递 std::vector<int> 作为参数来获得 std::vector<std::array<int, 3>>?
- 是否有可能具有放入容器的移动操作的类型?
- 是否有可能通过溢出 C 中的第一个元素来写入数组第二个元素
- 声明是否有可能逃脱其封闭的名称空间
- git-是否有互联网上某处所有可能错误的列表
- 是否有可能有一个派生类继承最终函数但创建相同的函数(而不是重写)