Javaウェイト割り当ての実装アルゴリズム
既存の要件は、複数のタスク実行者が一定数のタスクを実行し、タスクの割り当てが一定の重み比で行われると仮定することである.タスクの割り当てはランダムで、割り当てが完了した後、各タスクに実行者のラベル(つまり誰が実行するか)を付ける必要があります.割り当てアルゴリズムは難しくありませんが、javaで書くと巧みです.アルゴリズム設計:
1)合計タスク数が重みと整数で除算される場合、各人に割り当てられる数は、合計タスク数/重みと*重みです.
2)総タスク数が重みと割り切れない場合は,まず割り引いた数を1)として分け,その後,重みの小さい実行者に優先的に割り振る.
ここで、剰余assignRestを割り当てる方法は、次のとおりです.
これで、重みで割り当てられたjavaアルゴリズムが書き終わります.アルゴリズムは難しくないと思いますが、書くのはちょっと難しいですね.ははは.
1)合計タスク数が重みと整数で除算される場合、各人に割り当てられる数は、合計タスク数/重みと*重みです.
2)総タスク数が重みと割り切れない場合は,まず割り引いた数を1)として分け,その後,重みの小さい実行者に優先的に割り振る.
//
List dataList = pm1.getDataList();
int total = dataList.size();
//
List autoList = pmAuto.getDataList();
//
int totalWight = 0;
for(int i= 0;iget(i);
int weight = dto.getWeight();
totalWight += weight;
}
//
Integer maxInt = getMaxInt(totalWight, total);
int rest = total - maxInt;
//
List resultList = new ArrayList();
for(int i=0;iint 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; iget(i);
int weight = dto.getWeight();
Random random = new Random();
for(int j=0; jint 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アルゴリズムが書き終わります.アルゴリズムは難しくないと思いますが、書くのはちょっと難しいですね.ははは.