Обмен технологиями

Жадный алгоритм на примере университетской системы управления научными исследованиями

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

1.жадный алгоритмпредставлять

1. Идея алгоритма

Основная идея жадного алгоритма состоит в том, чтобы действовать шаг за шагом, начиная с начального решения проблемы. Согласно мере оптимизации, каждый шаг должен гарантировать возможность получения локального оптимального решения. На каждом шаге рассматривается только одна информация, и ее выбор должен соответствовать условиям локальной оптимизации. Если следующие данные и частичное оптимальное решение связаны вместе и оно больше не является допустимым решением, данные не будут добавлены к частичному решению до тех пор, пока все данные не будут перечислены или алгоритм больше не может быть добавлен и алгоритм не остановится.

Жадный алгоритм обычно работает следующим образом:

①Установитьматематическая модельчтобы описать проблему.

② Разделите проблему, которую необходимо решить, на несколько подзадач.

③ Решить каждую подзадачу и получить локально оптимальное решение подзадачи.

④ Объединить локальное оптимальное решение подзадачи с решением исходной задачи.

Жадный алгоритм — это более простой и быстрый метод проектирования определенных задач оптимального решения. Характерной чертой жадного алгоритма является то, что он действует шаг за шагом, часто делая оптимальный выбор на основе текущей ситуации и меры оптимизации, без рассмотрения всех возможных общих ситуаций, что устраняет необходимость исчерпать все возможности для поиска оптимального решения. Много времени потрачено.Жадный алгоритм используетсверху вниз , сделайте последовательный жадный выбор итеративным методом. Каждый раз, когда делается жадный выбор, желаемая проблема упрощается до меньшей подзадачи. На каждом этапе жадного выбора можно получить оптимальное решение проблемы. Хотя необходимо гарантировать, что локальное оптимальное решение может быть получено на каждом этапе, результирующее глобальное решение иногда не обязательно является оптимальным, поэтому жадные алгоритмы не возвращаются назад.

2. Введение в код

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

3. Используйте жадный алгоритм, чтобы выделить учителям более подходящие научно-исследовательские проекты.

Этот код реализует функцию назначения преподавателей и научно-исследовательских проектов, а его основная идея алгоритма — жадный алгоритм. Ниже приводится анализ алгоритмов, используемых в коде:

1. Жадный алгоритм: при выборе ответственного за каждый научно-исследовательский проект алгоритм пытается найти для каждого проекта преподавателя, которому еще не назначен проект. Это типичное применение жадного алгоритма, поскольку он делает локальный оптимальный выбор на каждом шаге (то есть выбирает лучшего учителя, доступного в данный момент), надеясь, что такое локальное оптимальное решение может привести к глобальному оптимальному или приближенному оптимальному развязке.

2. Сортировка. Сначала код сортирует учителей и проекты.
Учителя сортируются в порядке убывания в соответствии с идентификатором их должности и идентификатором профессионального звания, что означает, что учителя с более высокими должностями и профессиональными званиями будут ранжироваться первыми.
Проекты сортируются по убыванию бюджета, причем в первую очередь рассматриваются проекты с более высоким бюджетом, если бюджеты одинаковые, они сортируются по возрастанию времени начала, то есть в первую очередь рассматриваются проекты с более ранним временем начала;

3. Фильтрация и выбор. Используйте Stream API Java 8 для выбора учителей, которым еще не назначены проекты, с помощью условия фильтра `.filter(teacher -&gt; !teacherToProjectMap.containsKey(teacher.getTeacherID()))`. Это часть алгоритма отбора, который гарантирует, что каждому учителю назначается только один проект.

4. Сопоставление отношений. Используйте «teacherToProjectMap» для записи учителей, которым были назначены проекты, что помогает избежать повторных назначений.

5. Обработка исключений. Используйте структуру try-catch для обработки возможных исключений и обеспечения надежности программы.

6. Работа с базой данных: в блоке «try» обновите результаты выделения в базе данных, вызвав метод «projectDao.updateResearchProject(project)». Это последний шаг по реализации функциональности, сохраняющий результаты рекомендаций.

4. Обобщайте

В этом коде, хотя термин «жадный алгоритм» явно не упоминается, логика кода фактически отражает идею жадного алгоритма. Жадный алгоритм — это алгоритм, который на каждом шаге выбирает лучший или оптимальный (т. е. наиболее выгодный) выбор в текущем состоянии, надеясь, что результат будет лучшим или оптимальным в глобальном масштабе.

В частности, жадная стратегия в коде отражена в следующих аспектах:

  1. Стратегия назначения учителей : При назначении преподавателей на проекты код всегда выбирает преподавателя с наивысшей должностью и профессиональным званием среди преподавателей, в данный момент не закрепленных за проектом (т.е. первого учителя после сортировки). Это локальный оптимальный выбор, в надежде достичь глобального оптимума (то есть позволить учителям с высокими должностями и профессиональными званиями нести максимальную ответственность за проект).

  2. Стратегия распределения проектов : при назначении проектов код всегда выбирает проект с наибольшим бюджетом и самым ранним временем начала. Это также локальный оптимальный выбор, позволяющий достичь глобальной оптимальности (т. е. проекты с высокими бюджетами и ранними сроками начала следует выделять в первую очередь, насколько это возможно).

Этот код воплощает идею жадного алгоритма, беря лучший выбор в текущем состоянии (то есть преподаватель с самой высокой должностью и профессиональным званием, проект с самым высоким бюджетом и самым ранним временем начала) на каждом этапе выбор.