贪心算法-以高校科研管理系统为例

1.贪心算法介绍 

1.算法思路

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

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

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

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

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

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

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

2.代码介绍

private static void assignTeachersToProjects(TeacherDao teacherDao, ResearchProjectDao projectDao) {// 从TeacherDao获取所有教师的列表List<Teacher> teachers = teacherDao.getAllTeachers();// 从ResearchProjectDao获取所有科研项目的列表List<ResearchProject> projects = projectDao.getAllResearchProjects();// 使用职务ID和职称ID对教师进行排序,职务和职称越高的教师排在前面// 这里reversed()表示降序排序Collections.sort(teachers, Comparator.comparing(Teacher::getPositionID).reversed().thenComparing(Teacher::getTitleID).reversed());// 使用预算和开始时间对项目进行排序,预算越高和开始时间越早的项目排在前面// 预算高的排在前面,如果预算相同,则开始时间早的排在前面Collections.sort(projects, Comparator.comparing(ResearchProject::getBudget).reversed().thenComparing(ResearchProject::getStartDate));// 创建一个映射,用于记录教师与项目之间的分配关系Map<Integer, Integer> teacherToProjectMap = new HashMap<>();try {// 遍历每个项目for (ResearchProject project : projects) {// 使用Stream API寻找尚未分配项目的教师// filter条件确保只考虑那些还没有分配项目的教师Teacher bestTeacher = teachers.stream().filter(teacher -> !teacherToProjectMap.containsKey(teacher.getTeacherID())).findFirst().orElse(null);// 如果找到了合适的教师if (bestTeacher != null) {// 将教师ID设置为项目的负责人IDproject.setTeacherInChargeID(bestTeacher.getTeacherID());// 将教师ID和项目ID添加到映射中,表示教师已被分配项目teacherToProjectMap.put(bestTeacher.getTeacherID(), project.getProjectID());// 打印推荐信息System.out.println("推荐项目 '" + project.getTitle() + "' 分配给教师 " + bestTeacher.getName());// 调用ResearchProjectDao的updateResearchProject方法更新数据库中的项目分配信息projectDao.updateResearchProject(project);} else {// 如果没有找到合适的教师,打印无法推荐的消息System.out.println("未找到未分配的教师,无法推荐项目 '" + project.getTitle() + "'");}}} catch (Exception e) {// 如果发生异常,打印错误信息并打印堆栈跟踪System.out.println("更新数据库时发生错误:" + e.getMessage());e.printStackTrace();}// 打印教师和项目的总数信息System.out.println("教师总数:" + teachers.size());System.out.println("项目总数:" + projects.size());}

3.使用贪心算法为教师分配较为合适的科研项目

这段代码实现了一个教师与科研项目分配的功能,其核心算法思想是贪心算法。以下是代码中使用的算法分析:

1. 贪心算法:在为每个科研项目选择负责人时,算法尝试为每个项目找到一个尚未分配项目的教师。这是贪心算法的一个典型应用,因为它在每一步都做出局部最优的选择(即选择当前可用的最佳教师),希望这样的局部最优决策能够导致全局的最优或近似最优解。

2. 排序:代码首先对教师和项目进行排序。
   教师根据职务ID和职称ID降序排序,意味着职务和职称较高的教师会被排在前面。
   项目根据预算降序排序,预算越高的项目越先被考虑;如果预算相同,则根据开始时间升序排序,即开始时间越早的项目越先被考虑。

3. 过滤和选择:使用Java 8的Stream API,通过过滤条件`.filter(teacher -> !teacherToProjectMap.containsKey(teacher.getTeacherID()))`选择尚未分配项目的教师。这是选择算法的一部分,确保每个教师只被分配一个项目。

4. 映射关系:使用`teacherToProjectMap`来记录已经分配项目的教师,有助于避免重复分配。

5. 异常处理:使用`try-catch`结构来处理可能发生的异常,确保程序的健壮性。

6. 数据库操作:在`try`块中,通过调用`projectDao.updateResearchProject(project)`方法将分配结果更新到数据库。这是实现功能的最后一步,将推荐结果持久化。

4.概括

在这段代码中,虽然没有明确提到“贪心算法”这个术语,但实际上代码的逻辑体现了贪心算法的思想。贪心算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法。

具体来说,代码中的贪心策略体现在以下几个方面:

  1. 教师分配策略:在分配教师到项目时,代码总是选择当前未分配项目的教师中职务和职称最高的教师(即排序后的第一个教师)。这是一种局部最优选择,希望以此来达到全局最优(即尽可能让职务和职称高的教师负责项目)。

  2. 项目分配策略:在分配项目时,代码总是选择预算最高且开始时间最早的项目。这也是一种局部最优选择,希望以此来达到全局最优(即尽可能让预算高且开始时间早的项目得到优先分配)。

这段代码通过在每一步选择中都采取当前状态下最优的选择(即职务和职称最高的教师、预算最高且开始时间最早的项目),体现了贪心算法的思想。

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

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

相关文章

JavaEE初阶-网络原理1

文章目录 前言一、UDP报头二、UDP校验和2.1 CRC2.2 md5 前言 学习一个网络协议&#xff0c;最主要就是学习的报文格式&#xff0c;对于UDP来说&#xff0c;应用层数据到达UDP之后&#xff0c;会给应用层数据报前面加上UDP报头。 UDP数据报UDP包头载荷 一、UDP报头 如上图UDP的…

Kubernetes(K8s) kubectl 常用命令

文章目录 一、常用命令1.1 kubectl describe 命令 二、kubectl 命令中的简写三、Helm3.1 常用命令&#xff1a;3.2 遇到的问题3.2.1 cannot re-use a name that is still in use 四、Containerd 一、常用命令 检查 k8s 各节点状态&#xff0c;确保k8s集群各节点状态正常&#x…

概率基础——矩阵正态分布matrix normal distribution

矩阵正态分布-matrix normal distribution 定义性质应用 最近碰到了这个概念&#xff0c;记录一下 矩阵正态分布是一种推广的正态分布&#xff0c;它应用于矩阵形式的数据。矩阵正态分布在多维数据分析、贝叶斯统计和机器学习中有广泛的应用。其定义和性质如下&#xff1a; 定…

Emacs之解决:java-mode占用C-c C-c问题(一百四十六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

【django项目使用easycython编译】Cannot convert Unicode string to ‘str‘ implicitly.

django项目编译遇到的问题 报错条件 需要编译的python源码里面的函数写了type hint&#xff0c;尤其是return的type hint&#xff0c; 当type hint是str时&#xff0c;但是变量确实f-string格式化后得到的&#xff0c;编译时会报错 报错原因 easycython会检查变量类型&…

软件开发中的原型开发与需求文档开发:哪个更优?

1. 引言 在软件开发过程中&#xff0c;选择合适的开发方法对于项目的成功至关重要。基于原型开发和基于需求文档开发是两种常见的开发方法&#xff0c;各自有其优点和缺点。在项目复杂性、客户需求和资源限制等因素的影响下&#xff0c;开发团队需要慎重选择适合的开发方法。 …

C++语言相关的常见面试题目(二)

1.vector底层实现原理 以下是 std::vector 的一般底层实现原理&#xff1a; 内存分配&#xff1a;当创建一个 std::vector 对象时&#xff0c;会分配一块初始大小的连续内存空间来存储元素。这个大小通常会随着 push_back() 操作而动态增加。 容量和大小&#xff1a;std::vec…

element-plus 的form表单组件之el-radio(单选按钮组件)

单选按钮组件适用于同一组类型的选项只能互斥选择的场景&#xff0c;就是支持单选。单选组件包含以下3个组件 组件名作用el-radio-group单选组组件&#xff0c;子元素可以是el-radio或el-radio-button&#xff0c;v-mode绑定单选组的响应式属性el-radio单选组件&#xff0c;la…

阶段三:项目开发---搭建项目前后端系统基础架构:任务9:导入空管基础数据

任务描述 本阶段任务是导入项目的基础数据&#xff0c;包括空管基础数据和离线的实时飞行数据&#xff08;已经脱敏&#xff09;。 任务指导 本阶段任务需要导入两种数据&#xff1a; 1、在MySQL中导入空管基础数据 kongguan.sql空管基础数据表说明&#xff1a; 1告警信息…

OpenCV直方图计算函数calcHist的使用

操作系统&#xff1a;ubuntu22.04OpenCV版本&#xff1a;OpenCV4.9IDE:Visual Studio Code编程语言&#xff1a;C11 功能描述 图像的直方图是一种统计表示方法&#xff0c;用于展示图像中不同像素强度&#xff08;通常是灰度值或色彩强度&#xff09;出现的频率分布。具体来说…

对MsgPack与JSON进行序列化的效率比较

序列化是将对象转换为字节流的过程&#xff0c;以便在内存或磁盘上存储。常见的序列化方法包括MsgPack和JSON。以下将详细探讨MsgPack和JSON在序列化效率方面的差异。 1. MsgPack的效率&#xff1a; 优点&#xff1a; 高压缩率&#xff1a; MsgPack采用高效的二进制编码格式&…

Embedding理解

一、概念 Embedding 可以理解为一种将概念、物体或信息转换为数字序列的数值表示方法。它是沟通两个不同世界或领域的桥梁,能够把各种类型的数据(如文本、图像、视频等)映射到一个向量空间中。 在这个向量空间里,相似的项目(例如语义上相近的单词、相似的图像或相关的视…

cs231n作业1——SVM

参考文章&#xff1a;cs231n assignment1——SVM SVM 训练阶段&#xff0c;我们的目的是为了得到合适的 &#x1d44a; 和 &#x1d44f; &#xff0c;为实现这一目的&#xff0c;我们需要引进损失函数&#xff0c;然后再通过梯度下降来训练模型。 def svm_loss_naive(W, …

【Qt】Qt概述

目录 一. 什么是Qt 二. Qt的优势 三. Qt的应用场景 四. Qt行业发展方向 一. 什么是Qt Qt是一个跨平台的C图形用户界面应用程序框架&#xff0c;为应用程序开发者提供了建立艺术级图形界面所需的所有功能。 Qt是完全面向对象的&#xff0c;很容易扩展&#xff0c;同时Qt为开发…

从打印到监测:纳米生物墨水助力3D生物打印与组织监测平台?

从打印到监测&#xff1a;纳米生物墨水助力3D生物打印与组织监测平台&#xff1f; 在 3D 组织工程中&#xff0c;纳米生物墨水是将纳米材料与 ECM 水凝胶结合&#xff0c;以提高其打印性和功能性的重要策略。纳米生物墨水可以增强水凝胶的机械性能、导电性、生物活性&#xff…

汽车报价资讯app小程序模板源码

蓝色实用的汽车报价&#xff0c;汽车新闻资讯&#xff0c;最新上市汽车资讯类小程序前端模板。包含&#xff1a;选车、资讯列表、榜单、我的主页、报价详情、资讯详情、询底价、登录、注册、车贷&#xff0c;油耗、意见反馈、关于我们等等。这是一款非常全的汽车报价小程序模板…

MNIST 数据集 ubyte 格式介绍

train-images-idx1-ubyte 文件是用于存储 MNIST 数据集中手写数字图像数据的文件。与标签文件类似&#xff0c;这个文件使用的是一种简单而紧凑的二进制格式。具体的文件格式如下&#xff1a; 文件头&#xff08;Header&#xff09;&#xff1a; 文件头部分包含了一些描述文件内…

Ubuntu 20版本安装Redis教程,以及登陆

第一步 切换到root用户&#xff0c;使用su命令&#xff0c;进行切换。 输入&#xff1a; su - 第二步 使用apt命令来搜索redis的软件包&#xff0c;输入命令&#xff1a;apt search redis 第三步 选择需要的redis版本进行安装&#xff0c;本次选择默认版本&#xff0c;redis5.…

Emacs 的优点及与 DE 的比较

一、引言 在编程领域&#xff0c;对于工具的选择一直是开发者们热议的话题。今天&#xff0c;我们来探讨一下 Emacs 及其所具有的优点&#xff0c;并思考使用 Emacs 写程序是否真的比使用集成开发环境&#xff08;IDE&#xff09;更方便。 二、Emacs 的优点 高度可定制性 可以…

mac如何安装nvm

​ vue项目开发&#xff0c;热更新&#xff0c;webpack&#xff0c;前辈造的轮子&#xff1a;各类的工具&#xff0c;库&#xff0c;像axios,qs,cookie等轮子在npm上可以拿来直接用&#xff0c;需要node作为环境支撑。 开发时同时有好几个项目&#xff0c;每个项目的需求不同…