基於遺傳演算法實現自動組卷

2022-03-30 12:04:26 字數 3053 閱讀 1680

** 

1  遺傳演算法介紹

1.1 遺傳演算法概要

遺傳演算法是模擬達爾文的遺傳選擇和自然淘汰的生物進化過程的計算模型,是一種通過模擬自然進化過程搜尋最優解的方法,它是用來解決多約束條件下的最優問題。

遺傳演算法是從代表問題可能潛在的解集的乙個種群開始的,而乙個種群則由經過基因編碼的一定數目的個體組成。每個個體實際上是染色體帶有特徵的實體。染色體作為遺傳物質的主要載體,即多個基因的集合,它決定了個體的形狀的外部表現。因此,在一開始需要實現從表現型到基因型的對映即編碼工作。由於仿照基因編碼的工作很複雜,往往進行簡化,如二進位制編碼,初始種群產生之後,按照適者生存和優勝劣汰的原理,逐代演化產生出越來越好的近似解,在每一代,根據問題域中個體的適應度大小挑選個體,並借助於自然遺傳學的遺傳運算元進行組合交叉和變異,產生出代表新的解集的種群。這個過程將導致種群像自然進化一樣的後生代種群比前代更加適應於環境,末代種群中的最優個體經過解碼,可以作為問題近似最優解。

遺傳演算法提供了一種求解複雜系統優化問題的通用框架。它不依賴於問題的具體領域,對問題的種類有很強的魯棒性,所以廣泛應用於很多學科。遺傳演算法的主要應用領域有:函式優化、組合優化、生產排程問題、自動控制、機械人自動控制、影象處理和模式識別、人工生命、遺傳程式設計、機器學習。

1.2 遺傳演算法的基本操作

遺傳演算法有三個基本操作:選擇、交叉、變異。這些操作又有不同的方法來實現。

(1)選擇。選擇是用來確定重組或交叉的個體,以及被選個體將產生多少子個體。首選計算適應度:按比例的適應度計算;基於排序的適應度計算。適應度計算之後是實際的選擇,按照適應度進行父代個體的選擇。可以挑選以下演算法:輪盤賭選擇、隨機遍歷抽樣、區域性選擇、截斷選擇、錦標賽選擇。

(2)交叉。基因重組是結合來自父代交配種群中的資訊產生新的個體。依據個體編碼表示方法的不同,可以有以下的演算法:實值重組;離散重組;中間重組;線性重組;擴充套件線性重組。二進位制交叉、單點交叉、多點交叉、均勻交叉、洗牌交叉、縮小**交叉。

(3)變異。交叉之後子代經歷的變異,實際上是子代基因按小概率擾動產生的變化。依據個體編碼表示方法的不同,可以有以下的演算法:實值變異、二進位制變異。

2  自動組卷的實現

自動組卷是根據使用者給定的約束條件(總時間、難度係數、考試時間、考試章節、題型比例等),搜尋試題庫中與特徵引數相匹配的試題,從而抽取最優的試題組合。由此可見,自動組卷問題是乙個具有多重約束的組合優化問題。

傳統的遺傳演算法存在搜尋後期效率低和易形成末成熟收斂的情況。根據具體情況和需求分析要求,對遺傳演算法進了稍微改進,表現為採用實數編碼、分段交叉、有條件生成初始種群。具體解決方案如下。

2.1 染色體編碼及初始群體的設計

用遺傳演算法求解問題, 首先要將問題的解空間對映成一組**串,即染色體的編碼問題。在傳統的遺傳演算法中採用二進位制編碼。用二進位制編碼時,題庫裡的每一道題都要出現在這個二進位制位串中,1表示該題選中,0表示該題未被選中。這樣的二進位制位串較長,且在進行交叉和變異遺傳運算元操作時,各種題型的題目數量不好控制。採用實數編碼方案,將乙份試卷對映為乙個染色體,組成該試卷的每道題的題號作為基因,基因的值直接用試題號表示,每種題型的題號放在一起,按題型分段,在隨後的遺傳運算元操作時也按段進行,保證了每種題型的題目總數不變。比如,要組乙份《c語言程式設計》試卷,其選擇題5道,填空題5道,簡答題3道,則染色體編碼是:

(10、76、23、52、101 | 52、36、67、11、123 | 99、85、45)

選擇題               填空題           簡答題

試卷初始種群不是採用完全隨機的方法產生,而是根據題型比例、總分、答題時間、知識點不重複、不考章節等要求隨機產生,使得初始種群一開始就滿足了題型、總分、答題時間和知識點等要求。這樣加快遺傳演算法的收斂並減少迭代次數,由於不同的題型是從不同的題型表中取出,有可能在同乙個基因串中會出現相同的試題編號,因它們屬於不同題型,故這種情況是正常的,不影響組卷。採用分組實數編碼,可以克服以往採用二進位制編碼搜尋空間過大和編碼長度過長的缺點,同時取消了個體的解碼時間,提高了求解速度。

2.2 適應度函式的設計

2.3 遺傳運算元的設計

(1)選擇運算元。選擇運算元的作用在於根據個體的優劣程度決定它在下一代是被淘汰還是被複製。通過選擇,將使適應度高的個體有較大的生存機會。本系統採用輪盤賭方法,它是目前遺傳演算法中最常用也是最經典的選擇方法。其具體實現為:規模為m的群體p= ,其被選擇概率為:   (2)交叉運算元。由於在編碼時採用的是分段實數編碼,所以在進行交叉時採用分段單點交叉(按題型分段來進行交叉),整個染色體就表現為多點交叉。交叉的實現過程:將群體中的染色體任意進行兩兩配對,對每對染色體產生乙個[0, 1 ]的隨機數r,若r≤pc(據經驗,pc值取0.6到0.8),則分段隨機產生乙個交叉點,然後分段進行互換以得到下一代。

交叉後生成的子代有可能因存在重複的題號而非法。出現這種情況要將出現的題號換成該段中沒有出現過的題號,這樣重新得到新子代。

(3)變異運算元。在遺傳演算法中,變異概率一般較小。這裡不分段進行變異,而是只對某段上的某個基因進行變異。對某個染色體,隨機生成乙個[0,1]範圍內的實數r,若r≤pm(據經驗,pm值取0.01到0.02),則對該染色體進行變異,否則不進行變異。變異的操作如下:在[1,n]範圍內隨機生成乙個段號f,設該段的段長為l,則在[1,l]範圍內隨機生成乙個變異位置p,以一定的原則從題庫中選擇乙個變異基因,變異基因的選擇原則為:與原基因題型相同的;滿足答題時間相同;考試章節相同等要求。

2.4 演算法的實現偽**及實施流程圖

確定引數:最大代數max,群體規模n, 交叉概率pc,變異概率pm, 輸入使用者的組卷要求。演算法實施流程如圖1所示。

圖1  演算法實施流程圖

2.5 介面設計與實現結果

系統試題庫是c 語言試題。試題庫中現有單選題、填空題、判斷題、程式設計題、簡答題等。群體規模設為20,演算法執行的最大迭代次數設為200, 交叉概率pc設為0.7,變異概率pm 設為0.015。

組卷的具體要求:試卷總分100,用時120min,試卷難度係數0.6,不考章節1.2。組卷結果表明,在進化到120代左右時即可生成乙份滿意的試卷且誤差比較小,改進的遺傳演算法降低了組卷問題的求解難度,組卷效率高、成功率高;且演算法對初值不敏感,具有較好的魯棒性。在初始試卷生成之後,對有必考題要求,可以在試卷生成介面新增必考題。3  結束語

另: 

遺傳演算法實現自動組卷 隨機抽題

對我幫助很大,同時我也聯絡了此博文的作者,希望能得到他的指點。沒想到下午就收到回信,說這篇文章只是純理論的研究。真正的專案早已找不到了。另外信中給了我幾篇關於遺傳演算法的資料,給了我最直接的幫助。廢話不多說,下面直接給 不難,我也不做解釋,請有興趣的童鞋自己研究 現在只是在測試階段,寫得很亂,將就著...

黃聰 遺傳演算法實現自動組卷 隨機抽題

using system using system.windows.forms using system.io namespace ga 題目分數 int nd 題目難度 public form1 private void button1 click object sender,eventargs ...

自適應遺傳演算法 基於遺傳演算法生成資料

首先,設定好了初始種群群大小。然後,我們定義了乙個函式,用它來區分好樣本和壞的樣本。再次,我們選擇出好的樣本,並讓他們繁殖自己的後代。最後,這些後代們從原來的樣本中替代了部分壞的樣本,並不斷重複這一過程。遺傳演算法實際上就是這樣工作的,也就是說,它基本上盡力地在某種程度上模擬進化的過程。關於遺傳演算...