理论
交叉轮询权重算法
第一交取权重最大的值,然后将权重减去总权重值
第二交各自加上原始权重,取权重最大的值,然后将权重减去总权重值
算法推演
Iphone12s
|
手机壳
|
鼠标垫
|
鼠标
|
|
中奖概率(初始总权重26)
|
2
|
8
|
10
|
6
|
第一次
|
2
|
8
|
10 —>中奖 ,权重改为 10-26 = -16
|
6
|
第二次(各自加上初始权重)
|
4
|
16 —> 中奖,权重改为 16-26 = -10
|
-6
|
12
|
第三次(各自加上初始权重)
|
6
|
-2
|
4
|
18 —> 中奖,权重改为 18-26 = -8
|
第四次(各自加上初始权重)
|
8
|
6
|
14—>中奖 ,权重改为 14-26 = -12
|
-2
|
第五次(各自加上初始权重)
|
10
|
14—>中奖 ,权重改为 14-26 = -12
|
-2
|
4
|
第六次(各自加上初始权重)
|
12—>中奖 ,权重改为 12-26 = -14
|
-4
|
8
|
10
|
第七次(各自加上初始权重)
|
-12
|
4
|
18—>中奖 ,权重改为 18-26 = -8
|
16
|
第八次(各自加上初始权重)
|
-10
|
12
|
-2
|
22—>中奖 ,权重改为 22-26 = -4
|
第九次(各自加上初始权重)
|
-8
|
20—>中奖 ,权重改为 20-26 = -6
|
8
|
2
|
第十次(各自加上初始权重)
|
-6
|
2
|
18—>中奖 ,权重改为 18-26 = -8
|
8
|
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace LoadBalancingAlgorithm { public class LoadBalancing { private List<ToDealObj> _toDealObjs { get; set; } private int _sumWeight; public LoadBalancing(List<ToDealObj> objs) { _toDealObjs = objs; _sumWeight = _toDealObjs.Sum(t => t.SrcWeight); } public string GetToDealObj() { // 交叉轮询权重算法 // 第一次取权重最大的值,然后将权重减去原始总权重 // 第二次各自加上原始权重,取权重最大的值,然后将权重减去原始总权重 ToDealObj obj = _toDealObjs.OrderByDescending(t => t.Weight).First(); obj.Weight -= _sumWeight; _toDealObjs.ForEach(p => p.Weight += p.SrcWeight); return obj.Obj; } } public class ToDealObj { public string Obj { get; set; } public int SrcWeight { get; set; } public int Weight { get; set; } } } |
测试代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
using System; using System.Collections.Generic; namespace LoadBalancingAlgorithm { class Program { static void Main(string[] args) { //Console.WriteLine("Hello World!"); List<ToDealObj> objs = new List<ToDealObj>(); ToDealObj obj = new ToDealObj() { Obj = "Iphone12s", SrcWeight = 2,Weight = 2, }; objs.Add(obj) ; ToDealObj obj2 = new ToDealObj() { Obj = "手机壳", SrcWeight = 8, Weight = 8, }; objs.Add(obj2); ToDealObj obj3 = new ToDealObj() { Obj = "鼠标垫", SrcWeight = 10, Weight = 10, }; objs.Add(obj3); ToDealObj obj4 = new ToDealObj() { Obj = "鼠标", SrcWeight = 6, Weight = 6, }; objs.Add(obj4); LoadBalancing load = new LoadBalancing(objs); for (int i = 0; i < 10; i++) { Console.WriteLine($"第{i + 1}次中奖的是:{load.GetToDealObj()}"); } } } } |