貪心算法-以高校科研管理系統為例

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.pswp.cn/web/41288.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/41288.shtml
英文地址,請注明出處:http://en.pswp.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;每個項目的需求不同…