咱们总会面临这样的问题,须要给一组用户分配一些稀缺资源,站在资源分配者的角度,他们具备等价的权利获取资源,但实际上,一些用户可能获取较少的资源就可以知足须要,这样看来,他们对资源的获取又不是彻底等价的,彷佛不适合去平分资源,所以就有了最大最小公平算法。算法
最大最小公平算法定义以下(不带权):ide
一、资源按照需求递增的顺序进行分配;ui
二、不存在用户得到的资源超过自身的需求;;spa
三、对于未知足的用户,等价分享剩余资源;3d
算法实现逻辑(不带权):orm
首先假定用户集合有n个用户,1到n,他们对资源的需求已经排序完毕,知足s1<s2< .... <sn,资源总量为S。blog
一、将资源S/n分配给需求最小的1用户,这极可能已经超出了用户1的需求;排序
二、将超出的部分回收,再次将(S-s1)/(n-1)的资源分配给用户2,依次次重复上述过程,直到某一次分给该用户的资源不知足该用户的需求;资源
三、假定当分配到第k个用户时,分配到的资源不能达到该用户的需求,那么就将剩下的资源,平均分配给未得到资源的全部用户,至此,分配任务结束。get
【还有一种说法,是先将资源总体平分,再从小到大,将超出的资源平分给资源没有获得知足的用户,这两中作法的结果是一致的】
举个栗子:
有用户组G,该组中有4个用户,资源需求分别为2.4,3.6,4,5,资源总量为10。避免长篇大论,这里直接以图的形式给出。
上面提到的是最基本的分配原则,但实际上每每并非这么简单,每一个用户每每具备不一样的权重,所以就有了分配原则的扩展,带权重的最大最小分配原则。
最大最小公平算法定义以下(带权):
一、经过权重实现分配的标准化;
二、不存在用户获得的资源超过本身的需求;
三、未获得知足的用户,按照权重共享资源;
这里直接举例说明:
有用户组G,该组中有4个用户,资源需求分别为2,4,4,10,权重分别为4,2.5,1,0.5资源总量为16。
一、首先对权重进行标准化,将最小权重设置为1,则权重变为8,5,2,1,总和为16。将总资源分为16等分,四个用户分别获得8,5,2,1。
二、用户1多得到了6份资源,用户2多得到了1份资源,用户三、4资源不知足,所以,将多出来的7份资源再按照权重分配给用户三、4,用户3,4分别再得到7*(2/3)、7*(1/3)份资源;
三、目前为止,用户3得到6.666份资源,用户4得到3.333,将用户3多出的资源再分配给用户4,完成分配。
具体过程以下图所示:
--------muhuizz整理