• 贪心算法-以学籍管理系统为例


    1.贪心算法介绍 

    1.算法思路

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

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

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

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

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

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

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

    2.代码介绍

    1. /**
    2. * 为指定学生推荐最合适的课程。
    3. * @param scanner 用于接收用户输入的Scanner对象。
    4. * @param studentService 用于获取学生信息的服务。
    5. * @param courseService 用于获取课程列表的服务。
    6. */
    7. public static void recommendBestCourse(Scanner scanner, StudentService studentService, CourseService courseService) {
    8. // 提示用户输入学生ID并接收输入
    9. System.out.print("输入学生ID:");
    10. int studentID = scanner.nextInt();
    11. scanner.nextLine(); // 消耗换行符
    12. // 根据学生ID获取学生信息,如果学生不存在则返回
    13. Student student = studentService.getStudentById(studentID);
    14. if (student == null) {
    15. System.out.println("未找到该学生。");
    16. return;
    17. }
    18. // 获取所有课程的列表,如果没有课程信息则返回
    19. List courses = courseService.listAllCourses();
    20. if (courses.isEmpty()) {
    21. System.out.println("当前没有课程信息。");
    22. return;
    23. }
    24. // 使用贪心算法推荐最合适的课程
    25. Course bestCourse = findBestCourse(student, courses);
    26. if (bestCourse != null) {
    27. // 如果找到最佳课程,打印课程信息
    28. System.out.println("推荐的最合适课程是:" + bestCourse.getCourseName());
    29. System.out.println("课程ID: " + bestCourse.getCourseID());
    30. System.out.println("学分: " + bestCourse.getCreditHours());
    31. } else {
    32. System.out.println("没有找到合适的课程。");
    33. }
    34. }
    35. /**
    36. * 使用贪心算法找到最合适的课程。
    37. * @param student 需要推荐课程的学生。
    38. * @param courses 可供选择的所有课程列表。
    39. * @return 最佳课程对象。
    40. */
    41. private static Course findBestCourse(Student student, List courses) {
    42. Course bestCourse = null; // 用于存储当前找到的最佳课程
    43. int maxScore = Integer.MIN_VALUE; // 用于存储当前最高分数
    44. // 遍历所有课程
    45. for (Course course : courses) {
    46. // 计算每个课程的得分
    47. int score = calculateCourseScore(student, course);
    48. // 如果当前课程的得分高于已知最高分数,则更新最佳课程和最高分数
    49. if (score > maxScore) {
    50. maxScore = score;
    51. bestCourse = course;
    52. }
    53. }
    54. // 返回得分最高的课程作为最佳课程推荐
    55. return bestCourse;
    56. }
    57. /**
    58. * 计算单个课程的得分,用于评估课程的适宜性。
    59. * @param student 学生对象。
    60. * @param course 课程对象。
    61. * @return 计算得到的课程得分。
    62. */
    63. private static int calculateCourseScore(Student student, Course course) {
    64. int score = 0; // 初始化得分
    65. // 学分越高,得分越高,这里假设每1学分得10分
    66. score += course.getCreditHours() * 10;
    67. // 如果学生未修过该课程,额外加分,这里假设额外加50分
    68. List grades = student.getGrades(new GradeService()); // 获取学生已修课程的列表
    69. boolean isTaken = grades.stream().anyMatch(grade -> grade.getCourseID() == course.getCourseID());
    70. if (!isTaken) {
    71. score += 50;
    72. }
    73. // 返回计算得到的得分
    74. return score;
    75. }

    3.使用贪心算法为一个特定的学生推荐最合适的课程

    1. 方法定义:
       - `recommendBestCourse` 是一个静态方法,它接收一个 `Scanner` 对象用于用户输入,以及 `StudentService` 和 `CourseService` 服务层对象,用于获取学生和课程信息。

    2. 用户输入处理:
       - 程序首先提示用户输入一个学生ID,然后使用 `Scanner` 对象读取这个输入值。

    3. 学生信息获取:
       - 使用 `studentService.getStudentById(studentID)` 方法根据学生ID获取学生信息。如果学生不存在,打印提示信息并结束方法执行。

    4. 课程列表获取:
       - 调用 `courseService.listAllCourses()` 获取所有可用的课程列表。如果没有课程信息,同样打印提示信息并结束方法执行。

    5. 推荐逻辑:
       - 通过调用 `findBestCourse` 方法使用贪心算法为学生推荐最合适的课程。

    6. 贪心算法实现:
       - `findBestCourse` 方法遍历所有课程,并通过 `calculateCourseScore` 方法为每个课程计算一个得分。选择得分最高的课程作为最佳推荐。

    7. 得分计算:
       - `calculateCourseScore` 方法定义了课程得分的计算逻辑。在这个例子中,得分基于两个因素:课程的学分和学生是否已修过该课程。学分越高得分越高,如果学生未修过该课程则额外加分。

    8. 推荐结果输出:
       - 如果找到最佳课程,打印出课程名称、课程ID和学分信息。如果没有合适的课程,打印相应的提示信息。

  • 相关阅读:
    C# 13(.Net 9) 中的新特性 - 扩展类型
    电离层简介及短波在电离层中的传播特性
    零钱兑换问题
    python+pytest接口自动化之token关联登录
    centos编译升级cmake,痛苦的Linux小白
    React 类组件转换为函数式
    Go中原生http服务的实现方式
    多肽RGD修饰乳清白蛋白/肌白蛋白/豆清白蛋白/蓖麻蛋白/豌豆白蛋白1b ( PA1b)纳米粒(实验原理)
    轻松学会汉诺塔
    使用RestTemplate 进行远程接口调用工具类
  • 原文地址:https://blog.csdn.net/weixin_64922330/article/details/140237136