`
Everyday都不同
  • 浏览: 723547 次
  • 性别: Icon_minigender_1
  • 来自: 宇宙
社区版块
存档分类
最新评论

一种按权重分配的Java算法

阅读更多

现有一需求,就是假设有若干任务执行者执行一定数目的任务,并且任务的分配需按一定的权重比来进行。任务的分配是随机的,分配完毕后需要为每条任务打上执行者的标签(即被谁执行。)分配算法不难,但是用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算法就写完了。感觉算法不难,写起来还是有点小困难的,哈哈。

分享到:
评论

相关推荐

    Ngnix权重选择算法Java实现

    在高并发场景下,Nginx的权重选择算法(Weighted Round Robin, WRR)是一种有效的分配请求策略,它可以根据各个后端服务器的处理能力动态分配请求。现在我们将深入探讨Nginx权重选择算法的原理以及如何在Java中实现...

    java算法全卷(包括基本算法和图算法)

    Java算法全卷涵盖了基本算法和图算法,是学习和提升编程技能的重要资源。这份资料主要针对使用Java语言进行算法实现的开发者,适用于那些对ANT、EJB、J2EE、JAVA和SPRING等技术栈有了解或兴趣的人群。下面我们将深入...

    各种排序算法比较(java实现)

    合并排序是一种基于分治策略的排序算法,它将大问题分解为小问题来解决。首先将数组分为两个相等或近乎相等的部分,然后对每一部分递归地进行排序,最后将结果合并。这种算法的时间复杂度为O(n log n),稳定性好,...

    BP.rar_BP_bp 神经网络 java 算法_bp 预测_java BP预测算法_预测算法java

    BP神经网络,全称为Backpropagation Neural Network,是一种在机器学习领域广泛应用的监督式学习算法,尤其在处理非线性问题和复杂模式识别时表现出色。这个“BP.rar”压缩包包含了一个用Java实现的BP神经网络算法,...

    Java算法大全(近100种算法打包)

    Java算法大全是一个全面涵盖近100种算法的资源包,专为Java程序员设计,旨在提升他们的编程技能和解决问题的能力。这个压缩包包含了各种类型的算法实现,覆盖了基础到高级的算法知识,对于学习和理解算法有着极大的...

    匈牙利算法java实现

    匈牙利算法,又称为Kuhn-Munkres算法或KM算法,是一种用于解决分配问题的图论算法。在计算机科学中,特别是在优化和匹配理论领域,它被广泛应用于解决二分图的最大匹配问题。二分图是图的一种特殊类型,其中的节点...

    TextRank算法提取关键词的Java实现.zip

    Java是一种高性能、跨平台的面向对象编程语言。它由Sun Microsystems(现在是Oracle Corporation)的James Gosling等人在1995年推出,被设计为一种简单、健壮、可移植、多线程、动态的语言。Java的主要特点和优势...

    java 泰森多边形算法 可实现渲染

    Java泰森多边形算法,也称为Voronoi图或Dirichlet分区,是一种在几何学和计算领域中广泛使用的工具。它将平面分割成多个区域,使得每个区域都包含一个“种子点”(或“站点”),并且该区域内任何点到其对应种子点的...

    Java算法大全

    Java算法大全是一个全面涵盖近100种算法的资源包,专为Java程序员设计,旨在提升他们的算法理解和实现能力。这个压缩包包含了丰富的算法实例、解释和代码,可以帮助开发者深入理解算法背后的逻辑,并能有效地应用到...

    Java实现按权重随机数

    Java实现按权重随机数是一种在编程中常见的需求,特别是在模拟、游戏开发或算法设计中,我们需要根据不同的权重来决定某个事件发生的概率。本篇将详细解释如何在Java中有效地实现这个功能。 首先,我们来看问题定义...

    贪心算法,JAVA语言

    贪心算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法。在解决复杂问题时,贪心算法并不考虑所有可能的情况,而是做出局部最优的选择,逐步构建...

    加权Gn算法的Java实现

    加权Gn算法是一种在计算机科学和数据处理中常见的优化策略,主要应用于决策制定和问题求解。在Java编程环境中,实现这样的算法可以为各种复杂问题提供解决方案。本篇文章将详细探讨加权Gn算法的基本原理,以及如何...

    java数据结构与算法.pdf

    约瑟夫问题是一种基于环形链表的经典算法问题。 2. **算法**: - **栈**:一种LIFO(后进先出)的数据结构,用于实现函数调用、括号匹配等操作。 - **后缀表达式(逆波兰表达式)**:没有括号的表达式,运算符...

    智能算法-遗传算法、蚁群算法、粒子群算法实现。实现版本Java,Python,MatLab多版本实现

    遗传算法、蚁群算法和粒子群优化算法是智能算法中的典型代表,这三种算法都受到自然界生物行为的启发,具有自适应、并行性和全局搜索能力。 遗传算法(Genetic Algorithm,GA)模拟了生物界的进化过程,通过选择、...

    Java算法大全(源码)

    Java算法大全是一份珍贵的学习资源,它包含了近100种常见的算法实现,用Java语言编写,对于希望提升自己在算法领域技能的开发者来说,这是一个不可多得的工具。这份资料可以帮助你深入理解各种算法的工作原理,提升...

    KrigingCore_java_克里金插值算法实现_克里金算法_

    克里金插值(Kriging Interpolation)是一种基于地质统计学的方法,广泛应用于地理信息系统、环境科学、地球科学等领域,用于估计空间变量在未知位置的值。此算法利用空间相关性来预测未知点的数据,确保估计具有...

    蜂群算法Java代码

    Java作为一种广泛使用的编程语言,是实现这种算法的理想选择,因为它的跨平台特性和丰富的库支持。 本压缩包中的Java源代码提供了实现蜂群算法的框架,可能包括以下关键组件: 1. **粒子(Particle)类**:每个...

    java实现弗洛伊德算法

    弗洛伊德算法,全称为弗洛伊德-沃普斯(Warshall-Floyd)算法,是一种用于查找图中所有顶点对之间的最短路径的算法。在Java中实现该算法,可以解决复杂的网络问题,如计算最经济的旅行路线、优化数据传输路径等。下面...

    粒子群算法 java

    粒子群算法是一种基于群体智能的优化算法,通过模拟粒子的运动来寻找最优解。下面将详细介绍粒子群算法的 Java 实现。 粒子类 在粒子群算法中,每个粒子都有其自己的位置、速度和适应度。这里的 Particle 类就是一...

    java算法大全源码包-java算法大全,有近100多种常见算法的源代码,是学习JAVA算法的难得资料

    - **BD**和**heap**目录可能分别对应于Baden-Dijkstra算法(一种路径寻找算法)和基于堆的数据结构相关算法。 此外,压缩包中还包含了一些其他资源的URL,如JAVA初学者实例源码和C++编程实例源码,这表明这个包不...

Global site tag (gtag.js) - Google Analytics