protected int contest(int b, int g, int r) {

            /* finds closest neuron (min dist) 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 i, dist, a, biasdist, betafreq;
            int bestpos, bestbiaspos, bestd, bestbiasd;
            int[] n;

            bestd = ~(((int) 1) << 31);
            bestbiasd = bestd;
            bestpos = -1;
            bestbiaspos = bestpos;

            for (i = 0; i < netsize; i++) {
                    n = network[i];
                    dist = n[0] - b;
                    if (dist < 0)
                            dist = -dist;
                    a = n[1] - g;
                    if (a < 0)
                            a = -a;
                    dist += a;
                    a = n[2] - r;
                    if (a < 0)
                            a = -a;
                    dist += a;
                    if (dist < bestd) {
                            bestd = dist;
                            bestpos = i;
                    }
                    biasdist = dist - ((bias[i]) >> (intbiasshift - netbiasshift));
                    if (biasdist < bestbiasd) {
                            bestbiasd = biasdist;
                            bestbiaspos = i;
                    }
                    betafreq = (freq[i] >> betashift);
                    freq[i] -= betafreq;
                    bias[i] += (betafreq << gammashift);
            }
            freq[bestpos] += beta;
            bias[bestpos] -= betagamma;
            return (bestbiaspos);
    }