概述
現有一需求,就是假設有若干任務執行者執行一定數目的任務,並且任務的分配需按一定的權重比來進行。任務的分配是隨機的,分配完畢后需要為每條任務打上執行者的標簽(即被誰執行。)分配算法不難,但是用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算法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复