private int Contest(int b, int g, int r)
{
/* Finds closest neuron (minimum distance) and updates freq */
/* Finds best neuron (min dist-bias) and returns position */
/* For frequently chosen neurons, _freq[i] is high and _bias[i] is negative */
/* _bias[i] = gamma*((1/netsize)-_freq[i]) */
int bestD = ~(1 << 31); //Bitwise inverted.
int bestBiasD = bestD;
int bestPos = -1;
int bestBiasPos = bestPos;
for (int i = 0; i < Netsize; i++)
{
int dist = _network[i][0] - b;
if (dist < 0)
dist = -dist;
int a = _network[i][1] - g;
if (a < 0)
a = -a;
dist += a;
a = _network[i][2] - r;
if (a < 0)
a = -a;
dist += a;
if (dist < bestD)
{
bestD = dist;
bestPos = i;
}
int biasdist = dist - (_bias[i] >> (IntBiasShift - Netbiasshift));
if (biasdist < bestBiasD)
{
bestBiasD = biasdist;
bestBiasPos = i;
}
int betafreq = (_freq[i] >> BetaShift);
_freq[i] -= betafreq;
_bias[i] += (betafreq << GammaShift);
}
_freq[bestPos] += Beta;
_bias[bestPos] -= BetaGamma;
return bestBiasPos;
}
}