现有一需求,就是假设有若干任务执行者执行一定数目的任务,并且任务的分配需按一定的权重比来进行。任务的分配是随机的,分配完毕后需要为每条任务打上执行者的标签(即被谁执行。)分配算法不难,但是用java写起来还是蛮巧妙的~ 觉得很有意思,遂记之。
算法设计:
1)总的任务数能被权重和整除,则每个人分配的数量就是:总任务数/权重和*权重
2)总的任务数不能被权重和整除,则先按整除的数按1)的方式分,然后余数再优先分给权重较小的执行者。
//总的任务 List<TaskDTO> dataList = pm1.getDataList(); int total = dataList.size(); //待分配人员 List<ExecutorDTO> autoList = pmAuto.getDataList(); //总权重 int totalWight = 0; for(int i= 0;i<autoList.size();i++){ ExecutorDTO dto = autoList.get(i); int weight = dto.getWeight(); totalWight += weight; } //获得能整除的最大数 Integer maxInt = getMaxInt(totalWight, total); int rest = total - maxInt; //要保存的结果集 List<TaskDTO> resultList = new ArrayList<TaskDTO>(); for(int i=0;i<autoList.size();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<ExecutorDTO>() { @Override public int compare(ExecutorDTO o1, ExecutorDTO o2) { return o1.getWeight() - o2.getWeight(); } }); List<TaskDTO> restResultList = this.assignRest(autoList, dataList); resultList.addAll(restResultList); }
其中分配余数assignRest的方法为:
private List<TaskDTO> assignRest(List<ExecutorDTO> autoList, List<TaskDTO> dataList) { List<TaskDTO> resultList = new ArrayList<TaskDTO>(); Map<String, Integer> map = new HashMap(); outter: for(int i=0; i<autoList.size(); i++) { ExecutorDTO dto = autoList.get(i); int weight = dto.getWeight(); Random random = new Random(); for(int j=0; j<weight; 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算法就写完了。感觉算法不难,写起来还是有点小困难的,哈哈。
相关推荐
在高并发场景下,Nginx的权重选择算法(Weighted Round Robin, WRR)是一种有效的分配请求策略,它可以根据各个后端服务器的处理能力动态分配请求。现在我们将深入探讨Nginx权重选择算法的原理以及如何在Java中实现...
Java算法全卷涵盖了基本算法和图算法,是学习和提升编程技能的重要资源。这份资料主要针对使用Java语言进行算法实现的开发者,适用于那些对ANT、EJB、J2EE、JAVA和SPRING等技术栈有了解或兴趣的人群。下面我们将深入...
合并排序是一种基于分治策略的排序算法,它将大问题分解为小问题来解决。首先将数组分为两个相等或近乎相等的部分,然后对每一部分递归地进行排序,最后将结果合并。这种算法的时间复杂度为O(n log n),稳定性好,...
BP神经网络,全称为Backpropagation Neural Network,是一种在机器学习领域广泛应用的监督式学习算法,尤其在处理非线性问题和复杂模式识别时表现出色。这个“BP.rar”压缩包包含了一个用Java实现的BP神经网络算法,...
Java算法大全是一个全面涵盖近100种算法的资源包,专为Java程序员设计,旨在提升他们的编程技能和解决问题的能力。这个压缩包包含了各种类型的算法实现,覆盖了基础到高级的算法知识,对于学习和理解算法有着极大的...
匈牙利算法,又称为Kuhn-Munkres算法或KM算法,是一种用于解决分配问题的图论算法。在计算机科学中,特别是在优化和匹配理论领域,它被广泛应用于解决二分图的最大匹配问题。二分图是图的一种特殊类型,其中的节点...
Java是一种高性能、跨平台的面向对象编程语言。它由Sun Microsystems(现在是Oracle Corporation)的James Gosling等人在1995年推出,被设计为一种简单、健壮、可移植、多线程、动态的语言。Java的主要特点和优势...
Java泰森多边形算法,也称为Voronoi图或Dirichlet分区,是一种在几何学和计算领域中广泛使用的工具。它将平面分割成多个区域,使得每个区域都包含一个“种子点”(或“站点”),并且该区域内任何点到其对应种子点的...
Java算法大全是一个全面涵盖近100种算法的资源包,专为Java程序员设计,旨在提升他们的算法理解和实现能力。这个压缩包包含了丰富的算法实例、解释和代码,可以帮助开发者深入理解算法背后的逻辑,并能有效地应用到...
Java实现按权重随机数是一种在编程中常见的需求,特别是在模拟、游戏开发或算法设计中,我们需要根据不同的权重来决定某个事件发生的概率。本篇将详细解释如何在Java中有效地实现这个功能。 首先,我们来看问题定义...
贪心算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法。在解决复杂问题时,贪心算法并不考虑所有可能的情况,而是做出局部最优的选择,逐步构建...
加权Gn算法是一种在计算机科学和数据处理中常见的优化策略,主要应用于决策制定和问题求解。在Java编程环境中,实现这样的算法可以为各种复杂问题提供解决方案。本篇文章将详细探讨加权Gn算法的基本原理,以及如何...
约瑟夫问题是一种基于环形链表的经典算法问题。 2. **算法**: - **栈**:一种LIFO(后进先出)的数据结构,用于实现函数调用、括号匹配等操作。 - **后缀表达式(逆波兰表达式)**:没有括号的表达式,运算符...
遗传算法、蚁群算法和粒子群优化算法是智能算法中的典型代表,这三种算法都受到自然界生物行为的启发,具有自适应、并行性和全局搜索能力。 遗传算法(Genetic Algorithm,GA)模拟了生物界的进化过程,通过选择、...
Java算法大全是一份珍贵的学习资源,它包含了近100种常见的算法实现,用Java语言编写,对于希望提升自己在算法领域技能的开发者来说,这是一个不可多得的工具。这份资料可以帮助你深入理解各种算法的工作原理,提升...
克里金插值(Kriging Interpolation)是一种基于地质统计学的方法,广泛应用于地理信息系统、环境科学、地球科学等领域,用于估计空间变量在未知位置的值。此算法利用空间相关性来预测未知点的数据,确保估计具有...
Java作为一种广泛使用的编程语言,是实现这种算法的理想选择,因为它的跨平台特性和丰富的库支持。 本压缩包中的Java源代码提供了实现蜂群算法的框架,可能包括以下关键组件: 1. **粒子(Particle)类**:每个...
弗洛伊德算法,全称为弗洛伊德-沃普斯(Warshall-Floyd)算法,是一种用于查找图中所有顶点对之间的最短路径的算法。在Java中实现该算法,可以解决复杂的网络问题,如计算最经济的旅行路线、优化数据传输路径等。下面...
粒子群算法是一种基于群体智能的优化算法,通过模拟粒子的运动来寻找最优解。下面将详细介绍粒子群算法的 Java 实现。 粒子类 在粒子群算法中,每个粒子都有其自己的位置、速度和适应度。这里的 Particle 类就是一...
- **BD**和**heap**目录可能分别对应于Baden-Dijkstra算法(一种路径寻找算法)和基于堆的数据结构相关算法。 此外,压缩包中还包含了一些其他资源的URL,如JAVA初学者实例源码和C++编程实例源码,这表明这个包不...