/// <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); }
/// <summary> /// 计算下一个被选择的片断 /// </summary> /// <param name="haveFunction">判断是否已经选择函数</param> /// <returns>返回选择片断的索引号</returns> public int Next(WantDelegate haveFunction) { if (gotAny) { return(GotAnySelect(haveFunction)); } else { return(GotNothingSelect(haveFunction)); } }
/// <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); }
public int Next(WantDelegate haveFunction) { return(0); }