Exemplo n.º 1
0
        /// <summary>
        /// 如果已经收到了某个片断,则首先采用最小优先选择策略,然后才采用严格优先选择策略
        /// </summary>
        /// <param name="haveFunction">判断是否已经选择函数</param>
        /// <returns>返回选择片断的索引号</returns>
        private int GotAnySelect(WantDelegate haveFunction)
        {
            //如果所有的收到have信息数量最小为1的片断都已经被选择,则返回-1
            //所以best初始化为-1
            int best = -1;

            //保存最小的have信息数量
            int bestNumber = int.MaxValue;

            //严格优先选择策略
            foreach (int index in started)
            {
                if (haveFunction(index) && interestsNumber[index] < bestNumber)
                {
                    best       = index;
                    bestNumber = interestsNumber[index];
                }
            }

            //如果bestNumber > interests的数量,则bestNumber = interests.Count
            if (bestNumber > interests.Count)
            {
                bestNumber = interests.Count;
            }

            //最小优先选择策略
            List <int> randomPieces, interestPieces;

            for (int i = 1; i < bestNumber; i++)
            {
                randomPieces   = interests[i];
                interestPieces = new List <int>(randomPieces);
                randomPieces.Clear();

                //随机选择策略
                while (interestPieces.Count > 0)
                {
                    int k = ran.Next(interestPieces.Count);
                    randomPieces.Add(interestPieces[k]);
                    interestPieces.RemoveAt(k);
                }

                foreach (int index in randomPieces)
                {
                    //如果未被选择,则返回选择的片断索引号
                    if (haveFunction(index))
                    {
                        return(index);
                    }
                }
            }

            //如果不能够采用最小优先选择策略,则采用严格优先选择策略
            return(best);
        }
Exemplo n.º 2
0
        /// <summary>
        /// 计算下一个被选择的片断
        /// </summary>
        /// <param name="haveFunction">判断是否已经选择函数</param>
        /// <returns>返回选择片断的索引号</returns>
        public int Next(WantDelegate haveFunction)
        {
            if (gotAny)
            {
                return(GotAnySelect(haveFunction));
            }

            else
            {
                return(GotNothingSelect(haveFunction));
            }
        }
Exemplo n.º 3
0
        /// <summary>
        /// 如果没有收到了任何片断,则首先采用严格优先选择策略,然后才采用最小优先选择策略
        /// </summary>
        /// <param name="haveFunction">判断是否已经选择函数</param>
        /// <returns>返回选择片断的索引号</returns>
        private int GotNothingSelect(WantDelegate haveFunction)
        {
            int number;

            //严格优先选择策略
            foreach (int index in started)
            {
                //如果未被选择,则返回选择的片断索引号
                if (haveFunction(index))
                {
                    return(index);
                }
            }

            List <int> leastPieces = new List <int>();

            //最小优先选择策略,但是要保证收到的have信息最小为1
            for (number = 1; number < interests.Count; number++)
            {
                leastPieces.AddRange(interests[number]);
            }

            //排除已经选择的片断索引号
            leastPieces.Except(started);

            //用于保存随机选择的结果
            List <int> randomPieces = new List <int>();

            //随机选择策略
            while (leastPieces.Count > 0)
            {
                int k = ran.Next(leastPieces.Count);
                randomPieces.Add(leastPieces[k]);
                leastPieces.RemoveAt(k);
            }

            foreach (int index in randomPieces)
            {
                //如果未被选择,则返回选择的片断索引号
                if (haveFunction(index))
                {
                    return(index);
                }
            }

            //如果所有的收到have信息数量最小为1的片断都已经被选择,则返回-1
            return(-1);
        }
Exemplo n.º 4
0
 public int Next(WantDelegate haveFunction)
 {
     return(0);
 }