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

1.贪心算法介绍

1.算法思路

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

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

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

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

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

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

贪心算法是一种对某些求最优解问题的更简单、更迅速的设计技术。贪心算法的特点是一步一步地进行,常以当前情况为基础根据某个优化测度作最优选择,而不考虑各种可能的整体情况,省去了为找最优解要穷尽所有可能而必须耗费的大量时间。贪心算法采用自顶向下,以迭代的方法做出相继的贪心选择,每做一次贪心选择,就将所求问题简化为一个规模更小的子问题,通过每一步贪心选择,可得到问题的一个最优解。虽然每一步上都要保证能获得局部最优解,但由此产生的全局解有时不一定是最优的,所以贪心算法不要回溯 [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,则默认优先级为0
            int titlePriority1 = title1 != null ? title1.getPriority() : 0;
            // 获取教师2的职称优先级,如果职称对象为null,则默认优先级为0
            int titlePriority2 = title2 != null ? title2.getPriority() : 0;
            // 获取教师1的职务优先级,如果职务对象为null,则默认优先级为0
            int positionPriority1 = position1 != null ? position1.getPriority() : 0;
            // 获取教师2的职务优先级,如果职务对象为null,则默认优先级为0
            int 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.mfbz.cn/a/783750.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深度解析:当下流行的人工智能大模型生成逻辑

在过去的几年里&#xff0c;人工智能领域经历了前所未有的革新&#xff0c;其中最引人注目的就是大规模预训练模型的崛起。这些模型&#xff0c;如GPT系列、BERT、T5、DALLE和CLIP等&#xff0c;凭借其强大的语言理解和生成能力&#xff0c;已经在自然语言处理&#xff08;NLP&…

Springboot使用WebSocket发送消息

1. 创建springboot项目&#xff0c;引入spring-boot-starter-websocket依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>完整项目依赖 <?xml ver…

聊聊使用GROUP_CONCAT函数遇到的坑

问题现象 在工作中我们或多或少都会使用到函数group_concat&#xff0c;它可以合并多行的某列(或多列)数据为一行&#xff0c;默认以逗号分隔。 最近碰到了一个线上bug&#xff0c;查询DB时返回的结果信息mysql自动截取了&#xff0c;导致页面显示的时候只显示了前半段结果。 …

MATLAB环境下4种噪声生成

生成噪声包括: 1)粉红色(闪烁)噪声-功率谱密度斜率-3 dB/oct。&#xff0c; - 10db /dec 2)红色(布朗)噪声-功率谱密度斜率-6 dB/oct。&#xff0c; - 20db /dec 3)蓝色噪声-功率谱密度斜率3 dB/oct。&#xff0c; 10db /dec 4)紫色(紫色)噪声-功率谱密度斜率 6db /oct。&…

抖音商城自定义小程序源码系统 前后端分离 带完整的源代码包以及搭建教程

系统概述 在当今数字化时代&#xff0c;电商平台的便捷性和个性化体验成为了吸引用户的关键。随着短视频平台的兴起&#xff0c;抖音作为其中的佼佼者&#xff0c;其商城小程序成为了商家连接消费者的新阵地。为了帮助商家快速构建个性化、高效的小程序店铺&#xff0c;本文将…

Java线程的创建·启动和休眠

一.线程的创建和启动 Java中创建线程的两种方式 ◆继承java.lang.Thread类 ◆实现java.lang.Runnable接口 ◆使用线程的步骤 继承Thread类创建线程 ◆自定义线程类继承自Thread类 ◆重写run()方法&#xff0c;编写线程执行体 ◆创建线程对象&#xff0c;调用start()方法启动…

基于大数据的电商产品评论数据分析与可视化--Python

基于大数据的电商产品评论数据分析与可视化 1绪论 1.1研究背景与意义阐述 随着电子商务领域的迅猛扩张,电商平台累积了海量的用户评价信息。这些建议不只是包含了消费者对产品的评价和经验分享,更重要的是,它们包含了丰富且价值巨大的信息。深度分析在线用户反馈不仅揭示…

#数据结构 链表

单向链表 1. 概念 单向链表 单向循环链表 双向链表 双向循环链表 解决&#xff1a;长度固定的问题&#xff0c;插入和删除麻烦的问题 1、逻辑结构&#xff1a; 线性结构 2、存储结构&#xff1a; 链式存储 链表就是将 结点 用链串起来的线性表&#xff0c;链就是 结点 中的…

《C++20设计模式》命令模式思考

文章目录 一、前言二、分析 拆解1、经典命令模式2、撤销操作3、关于Invoker类 三、实现 一、前言 哎&#xff01;只要是书上写的和经典设计模式不同&#xff0c;我就会很伤脑筋。&#x1f629; 命令模式到底是干什么的&#xff1f; 答&#xff1a;命令的发送者和接收者完全解…

环境配置05——conda创建虚拟环境指定版本torch与python

版本选择&#xff1a; python版本3.11.8torch版本2.1.2 1.创建环境 conda create -n t212p311 python3.11.8 2.下载torch pytorch-wheels-cu121安装包下载_开源镜像站-阿里云 3. 安装torch 进入虚拟环境 activate t212p311 进入torch安装包所在目录&#xff0c;安装torc…

html+css+js随机验证码

随机画入字符、线条 源代码在图片后面 点赞❤️关注&#x1f60d;收藏⭐️ 互粉必回 图示 源代码 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"…

将QComboBox下拉项中的文本居中、居右

目录 1. 需求提出 2. 解决方法 1. 需求提出 QComboBox下拉项中的文本默认是居左的&#xff0c;如下&#xff1a; 有时需要将下拉项中的文本居中、居右。如何实现&#xff1f; 2. 解决方法 首先想到的是通过样式表来解决&#xff0c;但找遍Qt Assist和网络&#xff0c;都没这…

MySQL存储与优化 一、MySQL架构原理

1.MySQL体系架构 MySQL Server架构自顶向下大致可以分网络连接层、服务层、存储引擎层和系统文件层 (1)网络连接层 客户端连接器&#xff08;Client Connectors&#xff09;&#xff1a;提供与MySQL服务器建立的支持。目前几乎支持所有主流的服务端编程技术&#xff0c;例如常…

EE trade:市价建仓的优缺点是什么

在金融市场的复杂环境中&#xff0c;市价建仓策略作为一种常见的交易手段&#xff0c;其优缺点成为了投资者关注的焦点。通过深入分析&#xff0c;我们可以更全面地理解这一策略的利弊&#xff0c;从而在实际操作中做出更加明智的决策。 市价建仓优点分析 快速执行 市价建仓…

鸿蒙系统:未来智能生态的引领者

在当今这个日新月异的互联网领域&#xff0c;操作系统作为连接硬件与软件的桥梁&#xff0c;其重要性不言而喻。随着华为鸿蒙系统&#xff08;HarmonyOS&#xff09;的崛起&#xff0c;一场关于操作系统未来的讨论再次被推向高潮。 鸿蒙OS&#xff0c;华为的全新力作&#xff…

从nginx返回404来看http1.0和http1.1的区别

序言 什么样的人可以称之为有智慧的人呢&#xff1f;如果下一个定义&#xff0c;你会如何来定义&#xff1f; 所谓智慧&#xff0c;就是能区分自己能改变的部分&#xff0c;自己无法改变的部分&#xff0c;努力去做自己能改变的&#xff0c;而不要天天想着那些无法改变的东西&a…

2024年电脑监控软件排行榜(真实测评推荐七款电脑监控软件)

在信息化快速发展的今天&#xff0c;企业对员工电脑活动的监控变得尤为重要。有效的电脑监控软件不仅可以提升员工的工作效率&#xff0c;还能防止信息泄露&#xff0c;保障企业的数据安全。本文将介绍几款知名的电脑监控软件&#xff0c;并对其特点进行详细分析&#xff0c;帮…

JavaWeb系列二十三: web 应用常用功能(文件上传下载)

文章目录 5. 文件上传基本介绍5.1 文件上传-原理示意图5.2 文件上传页面5.3 走通Servlet5.4 表单项区别处理5.5 创建目录-保存文件5.6 中文编码问题5.7 文件上传注意事项和细节5.7.1 按照年月日目录存放5.7.2 文件覆盖问题5.7.3 封装一下 5.8 文件上传其他注意事项5.8.1 upload…

浅谈信息技术高效课堂管理:策略、技巧与实践

引言&#xff1a; 在信息化教育的浪潮中&#xff0c;信息技术课程正逐渐成为学校教育体系中的重要组成部分。然而&#xff0c;信息技术课堂的特殊性——高互动性、高度依赖电子设备&#xff0c;给课堂管理带来了前所未有的挑战。如何在保证教学效率的同时&#xff0c;维护良好…

go mod 依赖管理补充2

依赖包的版本问题&#xff0c;别的开发语言有没有类似的问题&#xff1f;是怎么解决的&#xff1f; 举例&#xff1a;java java的依赖包的版本问题&#xff0c;通过Maven模块来操作&#xff0c;可以指定依赖包版本号&#xff0c;如下&#xff1a; go.mod 文件 go.mod文件是G…