资源调度之最大最小分配算法java实现

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

    Mini-max算法是一种递归或回溯算法,用于决策和博弈论。它为资源分配提供了一个最佳的分配方式,最近在项目中将这种算法应用到了资源分配。当每个需求方的权重相等时,需求方对于资源都是公平的,应该按照先后顺序分配,直到资源分配完,或者全部满足即分配结束。


  1. 下面的代码为基础的无权分配方式,即所有权重都是一样的

    最大最小公平算法定义如下(不带权):

         1、资源按照需求递增的顺序进行分配;

         2、不存在用户获得的资源超过自身的需求;

         3、对于未满足的用户,等价分享剩余资源。​​​​​​​

  2.  实现逻辑描述:首先假定用户集合有n个用户,1到n,他们对资源的需求已经排序完毕,满足s1<s2< .... <sn,资源总量为S。   

  3. 将资源S/n分配给需求最小的1用户,这很可能已经超出了用户1的需求; 

  4. 将超出的部分回收,再次将(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);
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值