2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
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.
- 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设置为项目的负责人ID
- project.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());
- }
Tämä koodi toteuttaa opettajien ja tieteellisten tutkimusprojektien osoittamisen ja sen ydinalgoritmi-ideana on ahne algoritmi. Seuraavassa on analyysi koodissa käytetyistä algoritmeista:
1. Greedy Algorithm: Valittaessa vastuuhenkilöä jokaiseen tieteelliseen tutkimusprojektiin, algoritmi yrittää löytää jokaiseen projektiin opettajan, jolle ei ole vielä osoitettu projektia. Tämä on tyypillinen ahnealgoritmin sovellus, koska se tekee jokaisessa vaiheessa paikallisen optimaalisen valinnan (eli valitsee parhaan tällä hetkellä saatavilla olevan opettajan) toivoen, että tällainen paikallinen optimaalinen päätös voi johtaa globaaliin optimaaliseen tai likimääräiseen optimaaliseen purkamiseen.
2. Lajittelu: Koodi lajittelee ensin opettajat ja projektit.
Opettajat on lajiteltu laskevaan järjestykseen heidän asema- ja ammattinimiketunnuksensa mukaan, mikä tarkoittaa, että korkeammissa tehtävissä ja ammattinimikkeissä olevat opettajat sijoittuvat ensimmäiseksi.
Projektit lajitellaan budjetin mukaan laskevaan järjestykseen ja suuremman budjetin hankkeet huomioidaan ensin, jos budjetit ovat samat, ne lajitellaan alkamisajan mukaan nousevaan järjestykseen, eli ensin otetaan huomioon projektit, joilla on aikaisempi alkamisaika.
3. Suodata ja valitse: Käytä Java 8:n Stream APIa valitaksesi opettajat, joille ei ole vielä osoitettu projekteja suodatusehdon `.filter(teacher -> !teacherToProjectMap.containsKey(teacher.getTeacherID()))` kautta. Tämä on osa valintaalgoritmia, joka varmistaa, että jokaiselle opettajalle määrätään vain yksi projekti.
4. Kartoitussuhde: Käytä "teacherToProjectMap" -toimintoa tallentaaksesi opettajat, joille on määrätty projekteja, mikä auttaa välttämään toistuvia tehtäviä.
5. Poikkeusten käsittely: Käytä `try-catch` -rakennetta mahdollisten poikkeuksien käsittelyyn varmistaaksesi ohjelman kestävyyden.
6. Tietokannan toiminta: Päivitä "try"-lohkossa allokoinnin tulokset tietokantaan kutsumalla "projectDao.updateResearchProject(project)" -metodi. Tämä on viimeinen vaihe toiminnallisuuden käyttöönotossa, mikä säilyttää suositusten tulokset.
Tässä koodissa, vaikka termiä "ahne algoritmi" ei nimenomaisesti mainita, koodin logiikka itse asiassa heijastaa ajatusta ahneesta algoritmista. Ahne algoritmi on algoritmi, joka tekee jokaisessa vaiheessa parhaan tai optimaalisen (eli edullisimman) valinnan nykyisessä tilassa toivoen, että tulos on globaalisti paras tai optimaalinen.
Tarkemmin sanottuna koodin ahne strategia näkyy seuraavissa asioissa:
Opettajan toimeksiantostrategia : Kun projekteihin määrätään opettajia, koodi valitsee aina opettajan, jolla on korkein asema ja ammattinimike opettajista, joita ei ole tällä hetkellä osoitettu projektiin (eli ensimmäisen opettajan lajittelun jälkeen). Tämä on paikallinen optimaalinen valinta, jossa toivotaan globaalin optimaalisen saavuttamista (eli korkeissa tehtävissä ja ammattinimikkeissä olevien opettajien vastuussa projektista mahdollisimman paljon).
Projektin allokointistrategia : Projekteja määritettäessä koodi valitsee aina projektin, jolla on suurin budjetti ja aikaisin alkamisaika. Tämä on myös paikallinen optimaalinen valinta, jossa toivotaan globaalin optimaalisen saavuttamista (eli hankkeet, joilla on korkeat budjetit ja varhaiset alkamisajat, tulisi varata ensin mahdollisimman paljon).
Tämä koodi ilmentää ajatusta ahneesta algoritmista valitsemalla nykytilan parhaan valinnan (eli opettajan, jolla on korkein asema ja ammattinimike, projektin, jolla on suurin budjetti ja aikaisin aloitusaika) jokaisessa vaiheessa. valinta.