当前位置:   article > 正文

JAVA按权不重随机分配_一种按权重分配的Java算法

java根据权重占比发奖

现有一需求,就是假设有若干任务执行者执行一定数目的任务,并且任务的分配需按一定的权重比来进行。任务的分配是随机的,分配完毕后需要为每条任务打上执行者的标签(即被谁执行。)分配算法不难,但是用java写起来还是蛮巧妙的~ 觉得很有意思,遂记之。

算法设计:

1)总的任务数能被权重和整除,则每个人分配的数量就是:总任务数/权重和*权重

2)总的任务数不能被权重和整除,则先按整除的数按1)的方式分,然后余数再优先分给权重较小的执行者。

//总的任务

List dataList = pm1.getDataList();

int total = dataList.size();

//待分配人员

List autoList = pmAuto.getDataList();

//总权重

int totalWight = 0;

for(int i= 0;i

ExecutorDTO dto = autoList.get(i);

int weight = dto.getWeight();

totalWight += weight;

}

//获得能整除的最大数

Integer maxInt = getMaxInt(totalWight, total);

int rest = total - maxInt;

//要保存的结果集

List resultList = new ArrayList();

for(int i=0;i

int assignNum = maxInt/totalWight*(autoList.get(i).getWeight());

int count = 0;

while(count < assignNum){

if(dataList.size()>0){

Random random = new Random();

//根据对话记录总数产生随机数

int index =random.nextInt((int)dataList.size());

TaskDTO dto = dataList.get(index);

if(null != dto){ dto.setAssignOperator(autoList.get(i).getId());

resultList.add(dto);

count ++;

dataList.remove(index);//已分配的就从待分配的任务数中拿掉

}

}else{

break;

}

}

autoList.get(i).setTask(autoList.get(i).getTask() + count);//更新每个任务执行者的任务数

}

System.out.println("dataList大小:" + dataList.size() + ", 余数为:" + rest);

if(dataList.size() > 0) {

//按权重从小到大分余数~

Collections.sort(autoList, new Comparator() {

@Override

public int compare(ExecutorDTO o1,

ExecutorDTO o2) {

return o1.getWeight() - o2.getWeight();

}

});

List restResultList = this.assignRest(autoList, dataList);

resultList.addAll(restResultList);

}

其中分配余数assignRest的方法为:

private List assignRest(List autoList, List dataList) {

List resultList = new ArrayList();

Map map = new HashMap();

outter:

for(int i=0; i

ExecutorDTO dto = autoList.get(i);

int weight = dto.getWeight();

Random random = new Random();

for(int j=0; j

int index =random.nextInt((int)dataList.size());

TaskDTO chatDTO = dataList.get(index);

if(null != chatDTO){

chatDTO.setAssignOperator(dto.getOperPk());//分配人的id

dto.setTask(dto.getTask() + 1);//更新任务执行者所包含的任务数

resultList.add(chatDTO);

dataList.remove(index);

if(dataList.size() == 0)

break outter;

}

}

}

return resultList;

}

至此,按权重分配的一种java算法就写完了。感觉算法不难,写起来还是有点小困难的,哈哈。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/289235
推荐阅读
相关标签
  

闽ICP备14008679号