遺傳算法(Genetic Algorithm,簡稱GA)是一類借鑑生物界的進化規律(適者生存,優勝劣汰遺傳機制)演化而來的隨機化搜索方法,由美國的J.Holland教授1975年首先提出。遺傳算法是一種模擬達爾文的遺傳選擇和天然淘汰的生物進化過程的計算模型,經過模擬天然進化過程搜索最優解,它經常使用來解決多約束條件下的最優問題。html
遺傳算法是從表明問題可能潛在的解集的一個種羣開始的,而一個種羣則由通過基因編碼的必定數目的個體組成。每一個個體其實是染色體帶有特徵的實體。染色體做爲遺傳物質的主要載體,即多個基因的集合,它決定了個體的形狀的外部表現。所以,在一開始須要實現從表現型到基因型的映射即編碼工做。因爲仿照基因編碼的工做很複雜,每每進行簡化,如二進制編碼,初始種羣產生以後,按照適者生存和優勝劣汰的原理,逐代演化產生出愈來愈好的近似解,在每一代,根據問題域中個體的適應度大小挑選個體,並藉助於天然遺傳學的遺傳算子進行組合交叉和變異,產生出表明新的解集的種羣。這個過程將致使種羣像天然進化同樣的後生代種羣比前代更加適應於環境,末代種羣中的最優個體通過解碼,能夠做爲問題近似最優解。算法
遺傳算法提供了一種求解複雜系統優化問題的通用框架。它不依賴於問題的具體領域,對問題的種類有很強的魯棒性,因此普遍應用於不少學科。遺傳算法的主要應用領域有:函數優化、組合優化、生產調度問題、自動控制、機器人自動控制、圖像處理和模式識別、人工生命、遺傳程序設計、機器學習等。框架
(1)初始化。設置進化代數計數器,設置最大進化代數,隨機生成N個個體做爲初始種羣。機器學習
(2)計算機適應度。 計算初始種羣中每一個體的適應度。函數
(3)選擇。選擇是用來肯定重組或交叉的個體,以及被選個體將產生多少子個體。按照上面得出的適應度進行父代個體的選擇。能夠挑選如下算法:輪盤賭選擇、隨機遍歷抽樣、局部選擇、截斷選擇、錦標賽選擇。學習
(4)交叉。基因重組是結合來自父代交配種羣中的信息產生新的個體。依據個體編碼表示方法的不一樣,能夠有如下的算法:實值重組;離散重組;中間重組;線性重組;擴展線性重組。二進制交叉、單點交叉、多點交叉、均勻交叉、洗牌交叉、縮小代理交叉。優化
(5)變異。交叉以後子代經歷的變異,其實是子代基因按小几率擾動產生的變化。依據個體編碼表示方法的不一樣,能夠有如下的算法:實值變異、二進制變異。編碼
(1)遺傳算法從問題解的串集開始嫂索,而不是從單個解開始。這是遺傳算法與傳統優化算法的極大區別。傳統優化算法是從單個初始值迭代求最優解的;容易誤入局部最優解。遺傳算法從串集開始搜索,覆蓋面大,利於全局擇優。 spa
(2)許多傳統搜索算法都是單點搜索算法,容易陷入局部的最優解。遺傳算法同時處理羣體中的多個個體,即對搜索空間中的多個解進行評估,減小了陷入局部最優解的風險,同時算法自己易於實現並行化。 .net
(3)遺傳算法基本上不用搜索空間的知識或其它輔助信息,而僅用適應度函數值來評估個體,在此基礎上進行遺傳操做。適應度函數不只不受連續可微的約束,並且其定義域能夠任意設定。這一特色使得遺傳算法的應用範圍大大擴展。
(4)遺傳算法不是採用肯定性規則,而是採用機率的變遷規則來指導他的搜索方向。
(5)具備自組織、自適應和自學習性。遺傳算法利用進化過程得到的信息自行組織搜索時,適應度大的個體具備較高的生存機率,並得到更適應環境的基因結構。
一、 在選擇的過程當中,選擇多少次,會不會形成種羣的減小,選到重複的怎麼辦?
答:選擇次數沒有限制,即然是選擇確定就會有沒選上的,所以會形成種羣數量減小,選到重複的個體捨棄從新選擇。建議選擇的次數少於種羣數量,由於不重複,所以當次數爲種羣數量時即所有選擇了,這樣就失去了選擇的意義。捨棄重複的是由於重複的個體對種羣的差別化沒有幫忙(試想極端狀況下全是重複個體,那麼交叉後全是同樣的,沒有意義)。
二、 即然計算出了種羣中每一個個體的適應度,爲何不直接選擇適應度高的,捨棄適應度低的,而要用其餘算法來選擇?
答:適應度低的個體也可能存在優質基因。現實生活中的例子:一對傻子生了個聰明兒子。
三、交叉的過程是隨機交叉仍是兩兩交叉,交叉多少次合適?
答:隨機或兩兩交叉均可以,交叉次數大於或等於初始種羣中個體數量/2。由於交叉一次產生兩個新個體,而第3步的變異不產生新個體,所以爲保證種羣中個體的數量不致於愈來愈少(人口負增加), 交叉次數大於或等於初始種羣中個體數量/2。
自動組卷是根據出卷者給定的約束條件(目前考慮試題總數量、總分、知識點分佈、難度係數、題型比例等因素),搜索試題庫中與特徵參數相匹配的試題,從而抽取最優的試題組合。因而可知,自動組卷問題是一個具備多重約束的組合優化問題。
傳統的遺傳算法存在搜索後期效率低和易造成末成熟收斂的狀況。根據具體狀況和需求分析要求,對遺傳算法進了稍微改進,表現爲採用實數編碼、分段交叉、有條件生成初始種羣,選擇交叉後增長適應度檢查。具體解決方案以下。
用遺傳算法求解問題, 首先要將問題的解空間映射成一組代碼串,即染色體的編碼問題。在傳統的遺傳算法中採用二進制編碼。用二進制編碼時,題庫裏的每一道題都要出如今這個二進制位串中,1表示該題選中,0表示該題未被選中。這樣的二進制位串較長,且在進行交叉和變異遺傳算子操做時,各類題型的題目數量很差控制。採用實數編碼方案,將一份試卷映射爲一個染色體,組成該試卷的每道題的題號做爲基因,基因的值直接用試題號表示,每種題型的題號放在一塊兒,按題型分段,在隨後的遺傳算子操做時也按段進行,保證了每種題型的題目總數不變。好比,要組一份《C語言程序設計》試卷,其單選題6道,多選題4道,判斷題5道,填空題5道,問答題3道,則染色體編碼是:
(一、六、1三、十二、十、4 | 1八、2二、2五、28 | 5二、3六、6七、十一、123 | 3一、3五、3二、4七、44 | 9九、8五、45)
單選題 多選題 判斷題 填空題 問答題
試卷初始種羣不是採用徹底隨機的方法產生,而是根據總題數、題型比例、總分等要求隨機產生,使得初始種羣一開始就知足了題數、總分等要求。這樣加快遺傳算法的收斂並減小迭代次數。採用分組實數編碼,能夠克服以往採用二進制編碼搜索空間過大和編碼長度過長的缺點,同時取消了個體的解碼時間,提升了求解速度。
適應度函數是用來評判試卷羣體中個體的優劣程度的指標,遺傳算法利用適應度值這一信息來指導搜索方向,而不須要適應度函數連續或可導以及其它輔助信息。由於題數,總分等要求在初始化種羣時已經考慮,這裏只剩下知識點分佈跟難度係數要考慮的了。因此適應度函數跟試卷難度係數和知識點分佈有關。試卷難度係數公式:P=∑Di×Si/∑Si;其中i=1,2,....N,N是試卷所含的題目數,Di,Si分別是第i題的難度係數和分數。知識點分佈用一個個體知識點的覆蓋率來衡量,例如指望本試卷包含N個知識點,而一個個體中全部題目知識點的並集中包含M個(M<=N),則知識點的覆蓋率爲M/N。用戶的指望難度係數EP與試卷難度係數P之差越小越好,知識點覆蓋率越大越好,所以適應度函數以下:
f=1-(1-M/N)*f1-|EP-P|*f2
其中f1爲知識點分佈的權重,f2爲難度係數所佔權重。當f1=0時退化爲只限制試題難度係數,當f2=0時退化爲只限制知識點分佈。
(1)選擇算子。選擇算子的做用在於根據個體的優劣程度決定它在下一代是被淘汰仍是被複制。經過選擇,將使適應度高的個體有較大的生存機會。本系統採用輪盤賭方法,它是目前遺傳算法中最經常使用也是最經典的選擇方法。其具體實現爲:規模爲M的羣體P中各個個體的適應度爲P={A一、A二、… Am} ,其被選擇機率爲: Ai/∑Ai(i從0到m)。
(2)交叉算子。因爲在編碼時採用的是分段實數編碼,因此在進行交叉時採用分段單點交叉(按題型分段來進行交叉),整個染色體就表現爲多點交叉。交叉的實現過程:將羣體中的染色體任意進行兩兩配對,對每對染色體產生一個[0, N-2 ]的隨機數r,r即爲分段點,將r後的兩道題目互換(保證分值相加同樣)獲得下一代。交叉後生成的子代有可能因存在重複的題號而非法。出現這種狀況要將出現的題號換成該段中沒有出現過的題號,這樣從新獲得新子代。
(3)變異算子。在遺傳算法中,變異機率通常較小。這裏不分段進行變異,而是隻對某段上的某個基因進行變異。變異的操做以下:在[1,n]範圍內隨機生成一個變異位置P,以必定的原則從題庫中選擇一個變異基因,變異基因的選擇原則爲:與原基因題型相同的,分數相同,與至少包含原題目一個有效知識點(指望試卷中也有此知識點)。
算法實施流程如圖所示:
圖1 算法實施流程圖
程序設計請看下篇:實例講解遺傳算法——基於遺傳算法的自動組卷系統【實踐篇】
浪了N年:基於遺傳算法自動組卷的實現
百度百科:遺傳算法