Teknologian jakaminen

Ahne algoritmeja ottava opiskelijastatuksen hallintajärjestelmä esimerkkinä

2024-07-12

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

1.ahne algoritmiesitellä

1. Algoritmi-idea

Ahneen algoritmin perusideana on edetä askel askeleelta alkaen ongelman alkuperäisestä ratkaisusta Optimointitoimenpiteen mukaan jokaisen vaiheen tulee varmistaa, että saadaan paikallinen optimaalinen ratkaisu. Kussakin vaiheessa otetaan huomioon vain yksi data, ja sen valinnan tulee täyttää paikallisen optimoinnin ehdot. Jos seuraava data ja osaoptimaalinen ratkaisu yhdistetään, eikä se ole enää käyttökelpoinen ratkaisu, dataa ei lisätä osaratkaisuun ennen kuin kaikki tiedot on lueteltu tai algoritmia ei voida enää lisätä ja algoritmi pysähtyy.

Ahne algoritmi etenee yleensä seuraavasti:

① Perustamatemaattinen mallikuvailemaan ongelmaa.

② Jaa ratkaistava ongelma useisiin osaongelmiin.

③ Ratkaise jokainen osatehtävä ja hanki alaongelman paikallinen optimaalinen ratkaisu.

④ Yhdistä osaongelman paikallinen optimaalinen ratkaisu alkuperäisen ongelman ratkaisuksi.

Ahne algoritmi on yksinkertaisempi ja nopeampi suunnittelutekniikka tiettyihin optimaalisiin ratkaisuongelmiin. Ahneelle algoritmille on ominaista, että se etenee askel askeleelta tehden usein optimaaliset valinnat vallitsevan tilanteen ja optimointitoimenpiteen perusteella ottamatta huomioon kaikkia mahdollisia kokonaistilanteita, jolloin ei tarvitse käyttää kaikkia mahdollisuuksia optimaalisen ratkaisun löytämiseksi. Paljon aikaa käytetty.Ahne algoritmi käyttääylhäältä alas , tehdä peräkkäisiä ahneita valintoja iteratiivisella menetelmällä. Joka kerta kun tehdään ahne valinta, haluttu ongelma yksinkertaistuu pienemmäksi ahneen valinnan vaiheen kautta ongelmaan optimaalinen ratkaisu. Vaikka on tarpeen varmistaa, että jokaisessa vaiheessa saadaan paikallinen optimaalinen ratkaisu, tuloksena oleva globaali ratkaisu ei joskus välttämättä ole optimaalinen, joten ahneet algoritmit eivät peräänny [2].

2. Koodin esittely

  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<Course> 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<Course> 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<Grade> 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. Suosittele tietylle opiskelijalle sopivinta kurssia ahneella algoritmilla

1. Menetelmän määritelmä:
- "recommendBestCourse" on staattinen menetelmä, joka vastaanottaa "Scanner"-objektin käyttäjän syötettä varten sekä "StudentService"- ja "CourseService"-palvelukerroksen objektit opiskelija- ja kurssitietojen hankkimiseksi.

2. Käyttäjän syötteiden käsittely:
- Ohjelma pyytää ensin käyttäjää syöttämään opiskelijatunnuksen ja sitten lukee tämän syötearvon käyttämällä "Skanneri"-objektia.

3. Opiskelijatietojen hankinta:
- Käytä menetelmää "studentService.getStudentById(studentID)" saadaksesi opiskelijatietoja opiskelijatunnuksen perusteella. Jos opiskelijaa ei ole olemassa, tulosta kehoteviesti ja lopeta menetelmän suoritus.

4. Hanki kurssiluettelo:
- Soita `courseService.listAllCourses()` saadaksesi luettelon kaikista saatavilla olevista kursseista. Jos kurssitietoja ei ole, myös kehotetiedot tulostetaan ja menetelmän suoritus päättyy.

5. Suosituslogiikka:
- Suosittele opiskelijoille sopivinta kurssia ahneella algoritmilla kutsumalla "findBestCourse" -menetelmää.

6. Ahneen algoritmin toteutus:
- FindBestCourse-menetelmä iteroi kaikki kurssit ja laskee kullekin kurssille pisteet calculateCourseScore-menetelmän avulla. Parhaaksi suositukseksi valitaan korkeimman pistemäärän saanut kurssi.

7. Pisteiden laskeminen:
- `calculateCourseScore` -menetelmä määrittää kurssipisteiden laskentalogiikan. Tässä esimerkissä pistemäärä perustuu kahteen tekijään: opintojakson opintopistemäärään ja siihen, onko opiskelija suorittanut kurssin. Mitä enemmän opintopisteitä, sitä korkeampi pistemäärä, ja lisäpisteitä saa, jos opiskelija ei ole suorittanut kurssia.

8. Suositeltu tulostulos:
- Jos paras kurssi löytyy, tulosta kurssin nimi, kurssitunnus ja luottotiedot. Jos sopivaa kurssia ei ole, tulosta vastaava kehoteviesti.