贪心算法-以高校教师信息管理系统为例

1.贪心算法介绍

1.算法思路

贪心算法的基本思路是从问题的某一个初始解出发一步一步地进行,根据某个优化测度,每一 步都要确保能获得局部最优解。每一步只考虑一 个数据,其选取应该满足局部优化的条件。若下 一个数据和部分最优解连在一起不再是可行解时, 就不把该数据添加到部分解中,直到把所有数据枚举完,或者不能再添加算法停止。 

贪心算法一般按如下步骤进行: 

①建立数学模型来描述问题 。

②把求解的问题分成若干个子问题 。

③对每个子问题求解,得到子问题的局部最优解 。

④把子问题的解局部最优解合成原来解问题的一个解 。

贪心算法是一种对某些求最优解问题的更简单、更迅速的设计技术。贪心算法的特点是一步一步地进行,常以当前情况为基础根据某个优化测度作最优选择,而不考虑各种可能的整体情况,省去了为找最优解要穷尽所有可能而必须耗费的大量时间。贪心算法采用自顶向下,以迭代的方法做出相继的贪心选择,每做一次贪心选择,就将所求问题简化为一个规模更小的子问题,通过每一步贪心选择,可得到问题的一个最优解。虽然每一步上都要保证能获得局部最优解,但由此产生的全局解有时不一定是最优的,所以贪心算法不要回溯 [2]。

2.算法特性

2.代码介绍

// 定义一个静态方法,用于分配教学任务,需要TeacherService, TitleService, PositionService三个服务层对象private static void assignTeachingTasks(TeacherService teacherService, TitleService titleService, PositionService positionService) {// 从TeacherService获取所有教师的列表List<Teacher> teachers = teacherService.getAllTeachers();// 如果教师列表为空,打印消息并返回if (teachers == null || teachers.isEmpty()) {System.out.println("没有教师信息!");return;}// 创建一个优先队列,用于根据教师的职称和职务优先级排序PriorityQueue<Teacher> priorityQueue = new PriorityQueue<>((t1, t2) -> {// 通过TitleService获取教师1的职称Title title1 = titleService.getTitleById(t1.getTitleId());// 通过TitleService获取教师2的职称Title title2 = titleService.getTitleById(t2.getTitleId());// 通过PositionService获取教师1的职务Position position1 = positionService.getPositionById(t1.getPositionId());// 通过PositionService获取教师2的职务Position position2 = positionService.getPositionById(t2.getPositionId());// 获取教师1的职称优先级,如果职称对象为null,则默认优先级为0int titlePriority1 = title1 != null ? title1.getPriority() : 0;// 获取教师2的职称优先级,如果职称对象为null,则默认优先级为0int titlePriority2 = title2 != null ? title2.getPriority() : 0;// 获取教师1的职务优先级,如果职务对象为null,则默认优先级为0int positionPriority1 = position1 != null ? position1.getPriority() : 0;// 获取教师2的职务优先级,如果职务对象为null,则默认优先级为0int positionPriority2 = position2 != null ? position2.getPriority() : 0;// 比较两个教师的综合优先级,返回一个整数,表示t2相对于t1的优先级// 如果返回值小于0,t1会被认为优先级更高,会被排在前面// 如果返回值大于0,t2会被认为优先级更高,会被排在前面// 如果返回值等于0,t1和t2的优先级相同return (titlePriority2 + positionPriority2) - (titlePriority1 + positionPriority1);});// 将所有教师添加到优先队列中priorityQueue.addAll(teachers);// 初始化任务计数器int taskCount = 1;// 当优先队列不为空时,循环分配任务while (!priorityQueue.isEmpty()) {// 从优先队列中取出优先级最高的教师Teacher teacher = priorityQueue.poll();// 打印分配任务的消息System.out.println("根据任务重要情况依次分配教学任务 " + taskCount + " 给教师 " + teacher.getName());// 任务计数器递增taskCount++;}}

3.使用贪心算法来分配教学任务

assignTeachingTasks的静态方法,其目的是使用贪心算法的思想来根据教师的职称和职务的优先级分配教学任务

1. 方法参数:
   接收三个服务层对象:`TeacherService`、`TitleService` 和 `PositionService`,分别用于获取和管理教师、职称和职务信息。

2. 获取教师列表:
   通过 `teacherService.getAllTeachers()` 获取所有教师的列表。

3. 检查教师列表是否为空:
   如果教师列表为空,打印提示信息并返回。

4. 创建优先队列:
   使用 `PriorityQueue` 创建一个优先队列,根据教师的职称和职务的优先级进行排序。这是贪心算法的应用,因为它总是选择当前优先级最高的教师进行任务分配。

5. 自定义比较器逻辑:
   比较器通过服务层对象获取每个教师的职称和职务,并获取它们的优先级。如果职称或职务对象为 `null`,则默认优先级为 `0`。然后计算每个教师的综合优先级,并进行比较。

6. 添加教师到优先队列:
   将所有教师添加到优先队列中。

7. 初始化任务计数器:
   初始化一个计数器 `taskCount`,用于跟踪分配给教师的任务编号。

8. 分配任务循环:
   当优先队列不为空时,循环执行以下操作:
     使用 `poll` 方法从队列中取出优先级最高的教师。
     打印一条消息,显示分配给该教师的任务编号。
     递增任务计数器。

9. 贪心算法的应用:
   贪心算法在这里的应用体现在每次从优先队列中取出教师时,都是取出当前队列中优先级最高的教师。这符合贪心算法的局部最优选择原则,即在每一步选择中都采取当前状态下最好或最优的选择。

10. 简单高效:
    贪心算法通常简单且效率较高,因为它们只需要考虑当前的最优选择,而不需要考虑所有可能的全局情况。在这个方法中,通过优先队列实现的贪心选择快速定位到最高优先级的教师,从而快速进行任务分配。
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/41470.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PHP源码:美容护理按摩预约系统(附管理端+前台)

一. 前言 今天小编给大家带来了一款可学习&#xff0c;可商用的&#xff0c;预约系统 源码&#xff0c;支持二开&#xff0c;无加密。项目的内容可以是美容护理&#xff0c;按摩护理等&#xff0c;你也可以扩展。 预约下单大致流程&#xff1a; 客户登录下预约单&#xff0c…

电机驱动----L298N

一、介绍 L298N 是一种双H桥电机驱动芯片&#xff0c;其中每个H桥可以提供2A的电流&#xff0c;内含4路逻辑驱动电路&#xff0c;功率部分的供电电压范围是2.5-48v&#xff0c;逻辑部分5v供电&#xff0c;接受5vTTL电平。一般情况下&#xff0c;功率部分的电压应大于6V否则芯片…

实现Java应用的快速开发与迭代

实现Java应用的快速开发与迭代 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 1. 引言 随着软件开发周期的不断缩短和市场竞争的加剧&#xff0c;快速开发和…

Spring源码十一:事件驱动

上一篇Spring源码十&#xff1a;BeanPostProcess中&#xff0c;我们介绍了BeanPostProcessor是Spring框架提供的一个强大工具&#xff0c;它允许我们开发者在Bean的生命周期中的特定点进行自定义操作。通过实现BeanPostProcessor接口&#xff0c;开发者可以插入自己的逻辑&…

JAVA基础(8) 面向对象编程3

目录 一、关键字static 1.概念 2.static关键字 &#xff08;1&#xff09;使用范围&#xff1a; &#xff08;2&#xff09;被修饰后的成员具备以下特点&#xff1a; 3.静态变量 &#xff08;1&#xff09;语法格式 &#xff08;2&#xff09;静态变量的特点 &#xf…

k8s-第五节-StatefulSet

StatefulSet StatefulSet 是用来管理有状态的应用&#xff0c;例如数据库。 前面我们部署的应用&#xff0c;都是不需要存储数据&#xff0c;不需要记住状态的&#xff0c;可以随意扩充副本&#xff0c;每个副本都是一样的&#xff0c;可替代的。 而像**数据库、Redis **这类…

CPU是什么?

CPU&#xff0c;全称Central Processing Unit&#xff0c;中文名为中央处理器&#xff0c;是计算机系统的核心部件&#xff0c;负责执行程序指令、处理数据以及控制计算机内部的其他组件。简单来说&#xff0c;CPU就像是计算机的大脑&#xff0c;负责进行所有的思考和计算工作。…

在Linux/Debian/Ubuntu中出现“Could not get lock /var/lib/dpkg/lock-frontend”问题的解决办法

在Linux/Debian/Ubuntu中出现“Could not get lock /var/lib/dpkg/lock-frontend”问题的解决办法 在使用 apt 或 apt-get 进行软件包管理时&#xff0c;有时会遇到以下错误提示&#xff1a; Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporari…

CCM的作用及原理

CCM调试的理论依据_ccm矩阵sat调试-CSDN博客 CCM是在WB之后&#xff0c;就是当AWB将白色校正之后其他颜色也会跟着有明显变化&#xff0c;CCM的作用就是要保持白色不变&#xff0c;把其他色彩校正到非常精准的地步。 校正后的颜色(target值是一个固定的值)CCM矩阵*原始的颜色…

代码随想录Day73(Part09)

badijkstar(堆优化版) 题目&#xff1a;47. 参加科学大会&#xff08;第六期模拟笔试&#xff09; (kamacoder.com) 思路&#xff1a;直接看答案 答案 import java.util.*;class Edge {int to; // 邻接顶点int val; // 边的权重Edge(int to, int val) {this.to to;this.val …

昇腾910B部署Qwen2-7B-Instruct进行流式输出【pytorch框架】NPU推理

目录 前情提要torch_npu框架mindsport框架mindnlp框架 下载模型国外国内 环境设置代码适配&#xff08;非流式&#xff09;MainBranch结果展示 代码适配&#xff08;流式&#xff09; 前情提要 torch_npu框架 官方未适配 mindsport框架 官方未适配 mindnlp框架 官方适配…

力扣139 单词拆分 Java版本

文章目录 题目描述代码 题目描述 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。 注意&#xff1a;不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以重复使用。 示例 1&#xff1a…

HTTP与HTTPS的主要区别

HTTP&#xff08;超文本传输协议&#xff09;与HTTPS&#xff08;超文本传输安全协议&#xff09;的主要区别在于安全性、数据传输方式、默认使用的端口以及对网站的影响。 一、安全性&#xff1a; HTTP是一种无加密的协议&#xff0c;数据在传输过程中以明文形式发送&#x…

堆和栈的区别及应用场景

堆和栈的区别及应用场景 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在计算机科学和编程领域&#xff0c;堆&#xff08;Heap&#xff09;和栈&#xff08…

InfluxDB时序数据库基本使用介绍

1、概要介绍 1.1、时序数据库使用场景 所谓时序数据库就是按照一定规则的时间序列进行数据读写操作的数据库。它们常被用于以下业务场景&#xff1a; 物联网IOT场景&#xff1a;可用于IOT设备的指标、状态监控数据存取。IT建设场景&#xff1a;可用于服务器、虚拟机、容器的…

等保测评需要什么SSL证书

在进行信息安全等级保护&#xff08;简称“等保”&#xff09;测评时&#xff0c;选择合适的HTTPS证书对于确保网站的安全性和合规性至关重要。以下是在等保测评中选择HTTPS证书时应考虑的因素&#xff1a; 国产证书&#xff1a; 等保测评倾向于使用国产品牌的SSL证书&#x…

代码随想录Day76(图论Part11)

97.小明逛公园&#xff08;Floyd&#xff09; 题目&#xff1a;97. 小明逛公园 (kamacoder.com) 思路&#xff1a; 答案 import java.util.*;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int n scanner.nextInt();…

传统sql查询痛点及衍生的项目设计思路(设计一款可视化查询工具)

背景 最近三年&#xff0c;工作中很大一部分时间是写sql报表。业务很复杂&#xff0c;几十个表。常用的就有十几个。经常表连接达七八个。写得多了&#xff0c;我也很熟练了&#xff0c;但就是足够熟练了&#xff0c;我就越感觉有以下问题困扰我&#xff1a; 无法串联excel表…

上网行为管理系统是什么?有哪些好用的上网行为管理系统?

IT经理&#xff08;ITM&#xff09;: 大家好&#xff0c;今天我们聚在这里&#xff0c;是为了讨论一个对我们公司来说越来越重要的议题&#xff1a;上网行为管理系统&#xff08;WBS&#xff09;。我们知道&#xff0c;员工的网络使用已经不仅仅是个人行为&#xff0c;它直接影…

序列化Serializable

一、传输对象的方式 将对象从内存传输到磁盘进行保存&#xff0c;或者进行网络传输&#xff0c;有两种方式&#xff1a; 实现Serializable接口&#xff0c;直接传输对象转成json字符串后&#xff0c;进行字符串传输 二、直接传输对象 implements Serializable Data Equal…