Exemplo n.º 1
0
 public DataType SelectRandomItem(RandomSearchQuality quality)
 {
     if (values.First == null)
     {
         return(default(DataType));    // no elements
     }
     if (quality == RandomSearchQuality.Fast)
     {
         LinkedListNode <DataType> first = values.First;
         if (first.Value.Equals(lastSelected))
         {
             LinkedListNode <double> firstKey = keys.First;
             values.RemoveFirst();
             keys.RemoveFirst();
             values.AddLast(first);
             keys.AddLast(firstKey);
             first = values.First;
         }
         lastSelected = first.Value;
         return(first.Value);
     }
     else
     {
         LinkedListNode <DataType> node = values.First;
         for (int chosen = randgen.Next(values.Count); chosen > 0; chosen--)
         {
             node = node.Next;
         }
         return(node.Value);
     }
 }
 public DataType SelectSalientItem(RandomSearchQuality quality)
 {
     if (quality == RandomSearchQuality.Fast)
     {
         return(SelectSmartItem());
     }
     else
     {
         return(SelectExactItem());
     }
 }
Exemplo n.º 3
0
        public DataType SelectSalientItem(RandomSearchQuality quality)
        {
            if (values.First == null)
            {
                return(default(DataType));    // no elements
            }
            if (quality == RandomSearchQuality.Fast)
            {
                LinkedListNode <DataType> first = values.First;
                if (first.Value.Equals(lastSelected))
                {
                    // move it to the end
                    LinkedListNode <double> firstKey = keys.First;
                    values.RemoveFirst();
                    keys.RemoveFirst();
                    values.AddLast(first);
                    keys.AddLast(firstKey);
                    first = values.First;
                }
                lastSelected = first.Value;
                return(first.Value);
            }
            else
            {
                double target = randgen.NextDouble() * salienceSum;
                double sofar  = 0;

                LinkedListNode <double>   nodekey   = keys.First;
                LinkedListNode <DataType> nodevalue = values.First;
                while (nodekey != null && nodevalue != null)
                {
                    sofar += nodekey.Value;
                    if (sofar >= target)
                    {
                        return(nodevalue.Value);
                    }
                    nodekey   = nodekey.Next;
                    nodevalue = nodevalue.Next;
                }

                // Salience calculation failure!
                Console.WriteLine("WARNING: Salience miscalculation!  Max is " + sofar.ToString() + " not " + salienceSum.ToString());
                salienceSum = sofar;
                // Try again!
                return(SelectSalientItem(quality));
            }
        }
        public DataType SelectRandomItem(RandomSearchQuality quality)
        {
            if (quality == RandomSearchQuality.Fast)
            {
                double position;
                return(SelectWeightedItem(.5, out position).Data);
            }
            else
            {
                int chosen = randgen.Next(Count);
                RedBlackEnumerator <double, DataType> enumerator = GetNodeEnumerator();
                while (enumerator.HasMoreElements())
                {
                    RedBlackNode <double, DataType> node = enumerator.NextElement();
                    if (chosen-- == 0)
                    {
                        return(node.Data);
                    }
                }

                return(default(DataType));
            }
        }