Я окончательно определил, что эта функция отвечает за большинство моих проблем с узкими местами. Я думаю, это из-за чрезмерно избыточного произвольного доступа, который происходит, когда большинство синапсов уже активно. По сути, как говорится в заголовке, мне нужно каким-то образом оптимизировать алгоритм, чтобы я случайно не проверял тонну активных элементов перед тем, как приземлиться на один из немногих оставшихся.
Кроме того, я включил всю функцию в случае других недостатков, которые могут быть обнаружены.
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++;
}