Mini-max算法是一种递归或回溯算法,用于决策和博弈论。它为资源分配提供了一个最佳的分配方式,最近在项目中将这种算法应用到了资源分配。当每个需求方的权重相等时,需求方对于资源都是公平的,应该按照先后顺序分配,直到资源分配完,或者全部满足即分配结束。
-
下面的代码为基础的无权分配方式,即所有权重都是一样的
最大最小公平算法定义如下(不带权):
1、资源按照需求递增的顺序进行分配;
2、不存在用户获得的资源超过自身的需求;
3、对于未满足的用户,等价分享剩余资源。
-
实现逻辑描述:首先假定用户集合有n个用户,1到n,他们对资源的需求已经排序完毕,满足s1<s2< .... <sn,资源总量为S。
-
将资源S/n分配给需求最小的1用户,这很可能已经超出了用户1的需求;
-
将超出的部分回收,再次将(S-s1)/(n-1)的资源分配给用户2,依次次重复上述过程,直到某一次分给该用户的资源不满足该用户的需求;
package com.yzf.task.decision.utils;
import java.util.*;
/**
* @Author PSY
* @Date 2022/3/24 21:34
* 最大最小公平算法分配,不带权
* @Desc
*/
public class MaxMinAllocate {
public static void main(String[] args) {
//总共资源数
int total = 137;
List<Integer> needList = new ArrayList<>(Arrays.asList(10, 22, 33, 45, 1, 2, 34, 12));
int n = needList.size();
//求出平均值
int average = total / n;
System.out.println("资源的平均数为:" + average);
//结果集
List<Integer> result = new ArrayList<>();
//剩余数目
int remain = 0;
//存入满足的坐标
Map<Integer, Boolean> okMap = new HashMap<>();
// 第一轮分配
for (int i = 0; i < n; i++) {
if (needList.get(i) >= average) {
result.add(i, average);
} else {
result.add(i, needList.get(i));
okMap.put(i, true);
remain += average - needList.get(i);
}
}
System.out.println("分配需求数据:" + needList);
System.out.println("第一次分配结果:" + result + ",剩下的结果:" + remain);

本文介绍Max-Min公平分配算法的基本概念及其实现逻辑,包括无权重和带权重两种情况,并提供了详细的Java代码实现。
最低0.47元/天 解锁文章
381

被折叠的 条评论
为什么被折叠?



