我是靠谱客的博主 欢喜曲奇,最近开发中收集的这篇文章主要介绍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算法就寫完了。感覺算法不難,寫起來還是有點小困難的,哈哈。

最后

以上就是欢喜曲奇为你收集整理的java分配算法_一種按權重分配的Java算法的全部内容,希望文章能够帮你解决java分配算法_一種按權重分配的Java算法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部