现有的需求是以多个任务执行者执行一定数量的任务,且任务的分配按一定的权重比进行为前提的。 任务的分配是随机的,分配完成后,必须为每个任务标记执行者。 )分配算法并不难,但用java写相当巧妙。 我觉得很有趣,我记得。
算法设计:
1 )如果能将总任务数除以权重的话,每个人分配的数量就是总任务数/权重和*权重
2 )总任务数无法整除权重时,首先用整除后的数如1 )所示进行划分,将剩下的数优先分配给权重较小的执行者。
//总任务
List dataList=pm1.getDataList (;
int total=dataList.size (;
//待分配人员
list autolist=pm auto.get datalist (;
//总权重
int totalWight=0;
for(intI=0; I
executordtodto=autolist.get(I;
int weight=dto.getWeight (;
totalWight =weight;
}
//得到能被整除的最大数量
integer maxint=get maxint (total wight,total );
int rest=total - maxInt;
//要保存的结果集
List resultList=new ArrayList (;
for(intI=0; I
intassignnum=maxint/total wight * (autolist.get (I ).getWeight ) );
int count=0;
wile(countassignnum ) {
if(datalist.size) ) ) ) ) ) ) )。
Random random=new Random (;
//根据对话日志的总数产生随机数
intindex=random.nextint((int ) dataList.size ) );
taskDTODTO=datalist.get(index );
if (空!=dto () dto.setassignoperator (autolist.get (I ).getId ) );
resultlist.add(DTO;
出局;
datalist.remove (索引; //被分配的任务从被分配的任务数中排除
}
}else{
黑;
}
}
autoList.get(i(I ).getTask ) autoList.get(i(I ).getTask ) ) count; //更新每个任务执行者的任务数
}
system.out.println(datalist大小) dataList.size ),剩余为) rest );
if(datalist.size) ) ) ) ) ) ) )。
//权重从小到大剩余~
collections.sort(autolist,new Comparator ) )。
@Override
公共公司(executordtoo 1,
ExecutorDTO o2 ) {
return o1.getWeight ()- o2.getWeight );
}
);
listrestresultlist=this.assign rest (autolist,dataList );
result list.addall (rest result list;
}
其中,分配盈馀assignRest的方法如下:
权限列表任务列表(list autolist,List dataList ) {
List resultList=new ArrayList (;
映射图=new hashmap (;
出局:
for(intI=0; I
executordtodto=autolist.get(I;
int weight=dto.getWeight (;
Random random=new Random (;
for(intj=0; j
intindex=random.nextint((int ) dataList.size ) );
taskdtochatdto=datalist.get (index );
if (空!=chatDTO ) {
chatdto.setassignoperator (dto.getoperpk ) ); //被分配人的id
dto.settask(dto.gettask ) ) 1; //更新任务执行者包含的任务数
resultlist.add(chatdto;
datalist.remove (索引;
if(datalist.size ()==0) ) ) )。
自信的害羞
}
}
}
返回结果列表;
}
至此,完成了按权重分配的java算法之一。 感觉算法并不难,但写起来还是有点难啊。