版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 生物信息學(xué)課程設(shè)計(jì)報(bào)告</p><p><b> (算法編程實(shí)現(xiàn)類)</b></p><p> 副題:生物信息遺傳算法編程實(shí)現(xiàn)</p><p> 院 系 部 門: </p><p> 學(xué) 生 學(xué) 號(hào): </p><p> 學(xué) 生 姓 名
2、: </p><p> 指 導(dǎo) 教 師: </p><p><b> 2013年12月</b></p><p><b> 目錄</b></p><p> 第一部分 遺傳算法研究背景、特點(diǎn)與發(fā)展1</p><p> 1.1 遺傳算法研
3、究背景1</p><p> 1.2 遺傳算法特點(diǎn)2</p><p> 1.3 遺傳算法發(fā)展2</p><p> 1.4 本算法編程實(shí)現(xiàn)內(nèi)容和方案2</p><p> 第二部分 算法分析與程序流程圖設(shè)計(jì)3</p><p> 2.1 基于問(wèn)題的描述3</p><p>
4、 2.2 基于問(wèn)題的知識(shí)表示3</p><p> 2.2.1 狀態(tài)表示3</p><p> 2.2.2 控制參數(shù)3</p><p> 2.2.3算法描述3</p><p> 2.3 基于問(wèn)題的java算法分析4</p><p> 2.4 算法流程圖5</p><p> 第
5、三部分 實(shí)現(xiàn)設(shè)計(jì)語(yǔ)言選擇與算法編程實(shí)現(xiàn)5</p><p> 3.1 java實(shí)現(xiàn)算法5</p><p> 第四部分 程序測(cè)試與結(jié)果分析15</p><p> 4.1 測(cè)試結(jié)果15</p><p> 4.1.1 用戶界面15</p><p> 4.1.2 輸入數(shù)據(jù)15</p>&l
6、t;p> 4.1.3 輸出結(jié)果15</p><p> 4.2結(jié)果分析16</p><p> 第五部分 總結(jié)與心得體會(huì)16</p><p> 第六部分 參考文獻(xiàn)17</p><p> 第一部分 遺傳算法研究背景、特點(diǎn)與發(fā)展</p><p> 1.1 遺傳算法研究背景</p>
7、<p> 眾所周知,在人工智能領(lǐng)域中,有不少問(wèn)題需要在復(fù)雜而龐大的搜索空間中尋找最優(yōu)解或準(zhǔn)優(yōu)解。像貨朗擔(dān)問(wèn)題和規(guī)劃問(wèn)題等組合優(yōu)化問(wèn)題就是典型的例子。在求解此類問(wèn)題時(shí),若不能利用問(wèn)題的固有知識(shí)來(lái)縮小搜索空間則會(huì)產(chǎn)生搜索的組合爆炸。因此,研究能在搜索過(guò)程中自動(dòng)獲得和積累有關(guān)搜索空間的知識(shí),并能自適應(yīng)地控制搜索過(guò)程,從而得到最優(yōu)解或準(zhǔn)有解的通用搜索算法一直是令人矚目的課題。遺傳算法就是在這種背景下產(chǎn)生并經(jīng)實(shí)踐證明特別有效的算法。
8、</p><p> 1.2 遺傳算法特點(diǎn)</p><p> 遺傳算法具有以下幾方面的特點(diǎn):</p><p> (1)遺傳算法從問(wèn)題解的串集開(kāi)始搜索,而不是從單個(gè)解開(kāi)始。這是遺傳算法與傳統(tǒng)優(yōu)化算法的極大區(qū)別。傳統(tǒng)優(yōu)化算法是從單個(gè)初始值迭代求最優(yōu)解的;容易誤入局部最優(yōu)解。遺傳算法從串集開(kāi)始搜索,覆蓋面大,利于全局擇優(yōu)。</p><p>
9、 (2)遺傳算法同時(shí)處理群體中的多個(gè)個(gè)體,即對(duì)搜索空間中的多個(gè)解進(jìn)行評(píng)估,減少了陷入局部最優(yōu)解的風(fēng)險(xiǎn),同時(shí)算法本身易于實(shí)現(xiàn)并行化。</p><p> (3)遺傳算法基本上不用搜索空間的知識(shí)或其它輔助信息,而僅用適應(yīng)度函數(shù)值來(lái)評(píng)估個(gè)體,在此基礎(chǔ)上進(jìn)行遺傳操作。適應(yīng)度函數(shù)不僅不受連續(xù)可微的約束,而且其定義域可以任意設(shè)定。這一特點(diǎn)使得遺傳算法的應(yīng)用范圍大大擴(kuò)展。</p><p> (4)遺傳
10、算法不是采用確定性規(guī)則,而是采用概率的變遷規(guī)則來(lái)指導(dǎo)他的搜索方向。</p><p> (5)具有自組織、自適應(yīng)和自學(xué)習(xí)性。遺傳算法利用進(jìn)化過(guò)程獲得的信息自行組織搜索時(shí),適應(yīng)度大的個(gè)體具有較高的生存概率,并獲得更適應(yīng)環(huán)境的基因結(jié)構(gòu)。</p><p> 1.3 遺傳算法發(fā)展</p><p> 1967年,Holland的學(xué)生J.D.Bagley在博士論文中首次提
11、出“遺傳(Genet -ic Algorithms)”一詞。此后,Holland指導(dǎo)學(xué)生完成了多篇有關(guān)遺傳算法研究的論文。1971年,R.B.Hollstien在他的博士論文中首次把遺傳算法用于函數(shù)優(yōu)化。1975年是遺傳算法研究歷史上十分重要的一年。這一年Holland出版了他的著名專著《自然系統(tǒng)和人工系統(tǒng)的自適應(yīng)》(Adaptation in Natural and Artificial Systems),這是第一本系統(tǒng)論述遺傳算法
12、的專著,因此有人把1975年作為遺傳算法的誕生年。</p><p> 進(jìn)入90年代,遺傳算法迎來(lái)了興盛發(fā)展時(shí)期,無(wú)論是理論研究還是應(yīng)用研究都成了十分熱門的課題。尤其是遺傳算法的應(yīng)用研究顯得格外活躍,不但它的應(yīng)用領(lǐng)域擴(kuò)大,而且利用遺傳算法進(jìn)行優(yōu)化和規(guī)則學(xué)習(xí)的能力也顯著提高,同時(shí)產(chǎn)業(yè)應(yīng)用方面的研究也在摸索之中。此外一些新的理論和方法在應(yīng)用研究中亦得到了迅速的發(fā)展,這些無(wú)疑均給遺傳算法增添了新的活力。遺傳算法的應(yīng)用研
13、究已從初期的組合優(yōu)化求解擴(kuò)展到了許多更新、更工程化的應(yīng)用方面。</p><p> 1.4 本算法編程實(shí)現(xiàn)內(nèi)容和方案</p><p> 本算法的實(shí)現(xiàn)內(nèi)容為背包問(wèn)題,具體方案見(jiàn)第二部分。</p><p> 第二部分 算法分析與程序流程圖設(shè)計(jì)</p><p> 2.1 基于問(wèn)題的描述</p><p> 給定n種
14、物品和容量為C的背包。物品i的重量是wi,其價(jià)值為vi。問(wèn)應(yīng)如何選擇裝入背包的物品,使得裝入背包中物品的總價(jià)值最大?</p><p> 2.2 基于問(wèn)題的知識(shí)表示</p><p> 2.2.1 狀態(tài)表示</p><p> 1、個(gè)體或染色體:?jiǎn)栴}的一個(gè)解,表示為n個(gè)比特的字符串,比特值為0表示不選該物品,比特值為1表示選擇該物品。</p><
15、p> 2、基因:染色體的每一個(gè)比特。</p><p> 3、種群:解的集合。</p><p> 4、適應(yīng)度:衡量個(gè)體優(yōu)劣的函數(shù)值。</p><p> 2.2.2 控制參數(shù)</p><p> 1、種群規(guī)模:解的個(gè)數(shù)。</p><p><b> 2、最大遺傳的代數(shù)</b></p
16、><p> 3、交叉率:參加交叉運(yùn)算的染色體個(gè)數(shù)占全體染色體的比例,取值范圍一般為0.4~0.99。</p><p> 4、變異率:發(fā)生變異的基因位數(shù)所占全體染色體的基因總位數(shù)的比例,取值范圍一般為0.0001~0.1。</p><p><b> 2.2.3算法描述</b></p><p> 1、在搜索空間U上定義一
17、個(gè)適應(yīng)度函數(shù)f(x),給定種群規(guī)模N,交叉率Pc和變異率Pm,代數(shù)T;</p><p> 2、隨機(jī)產(chǎn)生U中的N個(gè)個(gè)體s1, s2, …, sN,組成初始種群S={s1, s2, …, sN},置代數(shù)計(jì)數(shù)器t=1;</p><p> 3、計(jì)算S中每個(gè)個(gè)體的適應(yīng)度f(wàn)() ;</p><p> 4、若終止條件滿足,則取S中適應(yīng)度最大的個(gè)體作為所求結(jié)果,算法結(jié)束。&l
18、t;/p><p> 5、按選擇概率P(xi)所決定的選中機(jī)會(huì),每次從S中隨機(jī)選定1個(gè)個(gè)體并將其染色體復(fù)制,共做N次,然后將復(fù)制所得的N個(gè)染色體組成群體S1;</p><p> 6、按交叉率Pc所決定的參加交叉的染色體數(shù)c,從S1中隨機(jī)確定c個(gè)染色體,配對(duì)進(jìn)行交叉操作,并用產(chǎn)生的新染色體代替原染色體,得群體S2;</p><p> 7、按變異率Pm所決定的變異次數(shù)m
19、,從S2中隨機(jī)確定m個(gè)染色體,分別進(jìn)行變異操作,并用產(chǎn)生的新染色體代替原染色體,得群體S3;</p><p> 8、將群體S3作為新一代種群,即用S3代替S,t = t+1,轉(zhuǎn)步3。</p><p> 2.3 基于問(wèn)題的java算法分析</p><p> 產(chǎn)生初始群體在java中用Math.random()方法產(chǎn)生一個(gè)隨機(jī)數(shù),并以次為標(biāo)準(zhǔn)產(chǎn)生一個(gè)初始群體來(lái)實(shí)現(xiàn)
20、,把數(shù)據(jù)保存到generatePopu[ ][ ]數(shù)組中。隨后分析群體中每個(gè)個(gè)體的適應(yīng)度,在此問(wèn)題中以每個(gè)個(gè)體的總價(jià)值來(lái)評(píng)估個(gè)體的適應(yīng)度,在java中用自定義的方法get_singleValue(int[] single)來(lái)實(shí)現(xiàn),該方法可以用一個(gè)for循環(huán)來(lái)實(shí)現(xiàn)。若判斷為真取群體中適應(yīng)度最大的個(gè)體作為所求結(jié)果,算法停止。否則繼續(xù)進(jìn)行以下步驟。這時(shí)用最大遺傳代數(shù)來(lái)作為判斷條件。</p><p> 自定義字符串復(fù)制
21、方法doubleArrayCopy(int[][] source)與singleArrayCopy(int[] source)來(lái)進(jìn)行基因與染色體的復(fù)制,這兩個(gè)方法通過(guò)一個(gè)簡(jiǎn)單的for循環(huán)就可以實(shí)現(xiàn)。</p><p> 復(fù)制過(guò)后就是選擇與變異,變異又分為交叉和突變,與選擇概率,交叉概率和突變概率分別進(jìn)行選擇與變異操作得到新個(gè)體來(lái)組成新的群體。這只需要對(duì)上一個(gè)群體進(jìn)行遍歷操作,并與選擇概率,交叉概率和突變概率作為條
22、件操作。再對(duì)新群體的個(gè)體進(jìn)行評(píng)估,得到最優(yōu)解,如此循環(huán)直到滿足終止條件。</p><p><b> 2.4 算法流程圖</b></p><p> 第三部分 實(shí)現(xiàn)設(shè)計(jì)語(yǔ)言選擇與算法編程實(shí)現(xiàn)</p><p> 3.1 java實(shí)現(xiàn)算法</p><p> import java.beans.PropertyChang
23、eEvent;</p><p> import java.beans.PropertyChangeListener;</p><p> import java.io.BufferedReader;</p><p> import java.io.File;</p><p> import java.io.FileInputStream
24、;</p><p> import java.io.FileWriter;</p><p> import java.io.InputStreamReader;</p><p> import java.io.PrintWriter;</p><p> import javax.swing.JFileChooser;</p>
25、;<p> import javax.swing.JOptionPane;</p><p> //遺傳算法解決0-1背包問(wèn)題</p><p> public class PackageByGA {</p><p> private int package_capacity = 0;//背包的容量</p><p> pr
26、ivate int goods_num = 0;//物品的個(gè)數(shù),對(duì)應(yīng)遺傳學(xué)中個(gè)體的基因個(gè)數(shù)</p><p> private int[] goods_weight = null;//物品的重量</p><p> private double[] goods_value = null;//物品的價(jià)值 </p><p> private int[][] popu
27、 = null;//種群</p><p> public PackageByGA(){</p><p><b> input();</b></p><p><b> }</b></p><p><b> //輸入</b></p><p> pr
28、ivate void input(){</p><p> /*JFileChooser fc = new JFileChooser();//文件選擇對(duì)話框</p><p> fc.setCurrentDirectory(new File("."));//從當(dāng)前目錄選擇文件</p><p> //獲取輸入源,輸入源為選取的文件</p&g
29、t;<p> fc.addPropertyChangeListener(new PropertyChangeListener() {//注冊(cè)監(jiān)聽(tīng)器</p><p> public void propertyChange(PropertyChangeEvent arg0) {//屬性改變事件</p><p> if (arg0.getPropertyName() <
30、/p><p> == JFileChooser.SELECTED_FILE_CHANGED_PROPERTY) {//選擇單個(gè)文件**/y</p><p><b> try {</b></p><p> File file = (File) arg0.getNewValue();//獲取屬性的新值,轉(zhuǎn)換為文件對(duì)象</p><
31、;p><b> //創(chuàng)建輸入流</b></p><p> FileInputStream fi = new FileInputStream(file);</p><p> InputStreamReader ir = new InputStreamReader(fi);</p><p> BufferedReader br = n
32、ew BufferedReader(ir);</p><p> //獲取第一行數(shù)據(jù),背包的容量</p><p> package_capacity = Integer.parseInt(br.readLine().trim());</p><p> //------------------------------</p><p> S
33、tring str_line = null;</p><p> //獲取第二行數(shù)據(jù),物品的重量</p><p> str_line = br.readLine();</p><p> goods_weight = strArr_to_intArr(str_line.split(" "));</p><p> //獲
34、取第三行數(shù)據(jù),物品的價(jià)值</p><p> str_line = br.readLine();</p><p> goods_value = strArr_to_doubleArr(str_line.split(" "));</p><p><b> //物品的個(gè)數(shù)</b></p><p>
35、goods_num = goods_value.length;</p><p><b> //關(guān)閉輸入流</b></p><p> fi.close();</p><p> ir.close();</p><p> br.close();</p><p> } catch (Except
36、ion ep) {//如果文件的內(nèi)容不是全為數(shù)字,則彈出對(duì)話框</p><p> JOptionPane.showMessageDialog(null,</p><p> "文件讀取異常,檢查文件內(nèi)容是否全為數(shù)字!");</p><p><b> }</b></p><p><b>
37、 }</b></p><p><b> }</b></p><p><b> });</b></p><p> fc.showOpenDialog(null);//彈出"打開(kāi)文件"對(duì)話框</p><p><b> }</b></p&
38、gt;<p> //字符串?dāng)?shù)組轉(zhuǎn)換為整數(shù)數(shù)組</p><p> private int[] strArr_to_intArr(String[] strArr){</p><p> int size = strArr.length;</p><p> int[] int_arr = new int[size];</p><p&
39、gt; for(int i = 0; i < size; i ++){</p><p> int_arr[i] = Integer.valueOf(strArr[i]);</p><p> //Integer.valueOf()這個(gè)函數(shù)把字符串轉(zhuǎn)換為整型變量。</p><p><b> }</b></p><p
40、> return int_arr;</p><p><b> }</b></p><p> //字符串?dāng)?shù)組轉(zhuǎn)換為浮點(diǎn)數(shù)數(shù)組</p><p> private double[] strArr_to_doubleArr(String[] strArr){</p><p> int size = strArr.
41、length;</p><p> double[] double_arr = new double[size];</p><p> for(int i = 0; i < size; i ++){</p><p> double_arr[i] = Double.valueOf(strArr[i]);</p><p><b>
42、; }</b></p><p> return double_arr;</p><p><b> }</b></p><p> //為什么要把字符串?dāng)?shù)組——》整數(shù)數(shù)組——》浮點(diǎn)型數(shù)組???</p><p><b> //一維數(shù)組復(fù)制</b></p><p&g
43、t; private int[] singleArrayCopy(int[] source){</p><p> int size = source.length;</p><p> int[] des = new int[size];</p><p> for(int i = 0; i < size; i ++){</p><p&
44、gt; des[i] = source[i];</p><p><b> }</b></p><p> return des;</p><p><b> }</b></p><p><b> //二維數(shù)組復(fù)制</b></p><p> pri
45、vate int[][] doubleArrayCopy(int[][] source){</p><p> int row_num = source.length;</p><p> int col_num = source[0].length;</p><p> int[][] des = new int[row_num][col_num];</p&
46、gt;<p> for(int i = 0; i < row_num; i ++){</p><p> for(int j = 0; j < col_num; j ++){</p><p> des[i][j] = source[i][j];</p><p><b> }</b></p><
47、p><b> }</b></p><p> return des;</p><p><b> }</b></p><p> //以上兩個(gè)復(fù)制為染色體的復(fù)制</p><p><b> //產(chǎn)生初始種群</b></p><p> publi
48、c int[][] generatePopu(){</p><p> popu = new int[Global.POPU_NUM][goods_num];</p><p> for(int i = 0; i < Global.POPU_NUM; i ++){</p><p> for(int j = 0; j < goods_num; j ++)
49、{</p><p> double d = Math.random()*10;//[0,10)之間的double型數(shù)值</p><p> popu[i][j] = ((int)Math.round(d))%2;//1表示選擇該物品,0表示不選擇該物品</p><p><b> }</b></p><p> if(
50、get_singleWeight(popu[i]) > package_capacity){//超出背包容量</p><p><b> i --;</b></p><p><b> }</b></p><p><b> }</b></p><p> return
51、popu;</p><p><b> }</b></p><p> //計(jì)算個(gè)體的總重量</p><p> private int get_singleWeight(int[] single){</p><p> int total_weight = 0;</p><p> int si
52、ze = single.length;</p><p> for(int i = 0; i < size; i ++){</p><p> if(single[i] == 1){</p><p> total_weight += goods_weight[i];</p><p><b> }</b><
53、/p><p><b> }</b></p><p> return total_weight;</p><p><b> }</b></p><p> //計(jì)算個(gè)體的總價(jià)值</p><p> private double get_singleValue(int[] si
54、ngle){</p><p> int total_value = 0;</p><p> int size = single.length;</p><p> for(int i = 0; i < size; i ++){</p><p> if(single[i] == 1){</p><p> t
55、otal_value += goods_value[i];</p><p><b> }</b></p><p><b> }</b></p><p> return total_value;</p><p><b> }</b></p><p>
56、; //獲取總價(jià)值最大的個(gè)體</p><p> public void get_maxValue_single(int[][] popu){</p><p> int size = popu.length;</p><p> double[] fitness = new double[size];</p><p> for(int
57、i = 0; i < size; i ++){</p><p> fitness[i] = get_singleValue(popu[i]);</p><p><b> }</b></p><p> int id = 0;</p><p> double max_value = fitness[0];<
58、;/p><p> for(int j = 1; j < size; j ++){</p><p> if(fitness[j] > max_value){</p><p> max_value = fitness[j];</p><p><b> id = j;</b></p><p&
59、gt;<b> }</b></p><p><b> }</b></p><p> if(max_value > Max_value_single.max_value){</p><p> Max_value_single.max_value = max_value;</p><p>
60、 int[] max_value_single = new int[goods_num];</p><p> for(int i = 0; i < goods_num; i ++){</p><p> max_value_single[i] = popu[id][i];</p><p><b> }</b></p>
61、<p> Max_value_single.max_value_single = max_value_single;</p><p><b> }</b></p><p><b> }</b></p><p> //計(jì)算每個(gè)個(gè)體的適應(yīng)度</p><p> public doubl
62、e[] getFitness(int[][] popu){</p><p> int size = popu.length;</p><p> double[] fitness = new double[size];</p><p> for(int i = 0; i < size; i ++){</p><p> fitnes
63、s[i] = get_singleValue(popu[i]);</p><p><b> }</b></p><p> return fitness;</p><p><b> }</b></p><p> //計(jì)算每個(gè)個(gè)體的選擇概率</p><p> priva
64、te double[] get_selectRate(double[] fitness){</p><p> double sum = 0;</p><p> int size = fitness.length;</p><p> double[] select_rate = new double[size];</p><p> fo
65、r(int i = 0; i < size; i ++){</p><p> sum += fitness[i];</p><p><b> }</b></p><p> for(int j = 0; j < size; j ++){</p><p> select_rate[j] = fitness
66、[j]/sum;</p><p><b> }</b></p><p> return select_rate;</p><p><b> }</b></p><p> //計(jì)算每個(gè)個(gè)體的累積概率</p><p> private double[] get_accu
67、Rate(double[] select_rate){</p><p> int i = 0;</p><p> int size = select_rate.length;</p><p> double[] accu_rate = new double[size];</p><p> for(i = 0; i < size;
68、 i ++){</p><p> accu_rate[i] = select_rate[i]; </p><p><b> }</b></p><p> for(i = 1; i < size; i ++){</p><p> accu_rate[i] += accu_rate[i-1]; </p&g
69、t;<p><b> }</b></p><p> return accu_rate;</p><p><b> }</b></p><p><b> //選擇</b></p><p> public int[][] select(double[] ac
70、cu_rate, int[][] popu){</p><p> double random_rate;</p><p> int size = accu_rate.length;</p><p> int[][] select_popu = new int[Global.POPU_NUM][goods_num];</p><p>
71、select_popu = doubleArrayCopy(popu);</p><p> for(int i = 0; i < size; i ++){</p><p> random_rate = Math.random();//產(chǎn)生隨機(jī)數(shù)</p><p> for(int j = 0; j < size; j ++){</p>
72、<p> if(random_rate <= accu_rate[j]){</p><p> select_popu[i] = singleArrayCopy(select_popu[j]);</p><p><b> }</b></p><p><b> }</b></p><
73、p><b> }</b></p><p> return select_popu;</p><p><b> }</b></p><p><b> //交叉</b></p><p> public int[][] crossover(int[][] select
74、_popu){</p><p> int i = 0;</p><p> int random_pos = 0, temp = 0;//交換基因的位置</p><p> int cross_num = (int)(Global.CROSS_RATE * Global.POPU_NUM);//參與交換的個(gè)體數(shù)</p><p> //Sy
75、stem.out.println(cross_num);</p><p> int[][] cross_popu = new int[Global.POPU_NUM][goods_num];</p><p> cross_popu = doubleArrayCopy(select_popu);</p><p> for(i = 1; i < cross_
76、num; i += 2){</p><p> random_pos = (int)Math.round(Math.random())%goods_num;</p><p> temp = cross_popu[i][random_pos];</p><p> cross_popu[i][random_pos]= cross_popu[i-1][random_p
77、os];</p><p> cross_popu[i-1][random_pos] = temp;</p><p> if(get_singleWeight(cross_popu[i]) > package_capacity || get_singleWeight(cross_popu[i-1]) > package_capacity){</p><p&
78、gt; temp = cross_popu[i][random_pos];</p><p> cross_popu[i][random_pos]= cross_popu[i-1][random_pos];</p><p> cross_popu[i-1][random_pos] = temp;</p><p><b> }</b><
79、;/p><p><b> }</b></p><p> return cross_popu;</p><p><b> }</b></p><p><b> //變異</b></p><p> public int[][] mutate(int[]
80、[] cross_popu){</p><p> int i = 0;</p><p> int row_id = 0;</p><p> int col_id = 0;</p><p> int mutate_num = (int)(Global.MUTA_RATE * Global.POPU_NUM * goods_num);//
81、參與變異的基因個(gè)數(shù)</p><p> //System.out.println(mutate_num);</p><p> int[][] mutate_popu = new int[Global.POPU_NUM][goods_num];</p><p> mutate_popu = doubleArrayCopy(cross_popu);</p>
82、;<p> for(i = 0; i < mutate_num; i ++){</p><p> row_id = (int)Math.round(Math.random()*10)%Global.POPU_NUM;</p><p> col_id = (int)Math.round(Math.random()*10)%goods_num;</p>
83、<p> mutate_popu[row_id][col_id] = 1 - mutate_popu[row_id][col_id];</p><p> if(get_singleWeight(mutate_popu[row_id]) > package_capacity){</p><p> mutate_popu[row_id][col_id] = 1 - mut
84、ate_popu[row_id][col_id];</p><p><b> }</b></p><p><b> }</b></p><p> return mutate_popu;</p><p><b> }</b></p><p>&l
85、t;b> //遺傳算法</b></p><p> public int[][] packetByGA(){</p><p> int popu_id = 1;//總?cè)旱拇鷶?shù)</p><p> double[] fitness = null;</p><p> double[] select_rate = null
86、;</p><p> double[] accu_rate = null;</p><p> int[][] select_popu = null;</p><p> int[][] cross_popu = null;</p><p> int[][] popu = generatePopu();</p><p&
87、gt; get_maxValue_single(popu);</p><p> /*System.out.println("第" + popu_id + "代種群的最大值:" + Max_value_single.max_value);*/</p><p> while(popu_id < Global.MAX_GEN_NUM){//沒(méi)有
88、終止</p><p> fitness = getFitness(popu);</p><p> select_rate = get_selectRate(fitness);</p><p> accu_rate = get_accuRate(select_rate);</p><p> select_popu = select(ac
89、cu_rate, popu);</p><p> cross_popu = crossover(select_popu);</p><p> popu = mutate(cross_popu);//下一代總?cè)?lt;/p><p> popu_id ++;</p><p> get_maxValue_single(popu);</p&
90、gt;<p> /*System.out.println("第" + popu_id + "代種群的最大值:" + Max_value_single.max_value);*/</p><p><b> }</b></p><p> return popu;</p><p><b
91、> }</b></p><p><b> //輸出</b></p><p> public void output(int[][] popu){</p><p> //-----------------------</p><p> File f = null;</p><
92、p> FileWriter fw = null;</p><p> PrintWriter pw = null;</p><p> //------------------------</p><p><b> try {</b></p><p> f = new File("./package
93、ByGA.txt");</p><p> fw = new FileWriter(f);</p><p> pw = new PrintWriter(fw);</p><p><b> //背包的容量</b></p><p> pw.write("背包的容量:");</p>
94、;<p> pw.write("" + package_capacity);</p><p> pw.println();</p><p> pw.println();</p><p><b> //物品的重量</b></p><p> pw.write("物品的重量
95、:");</p><p> for(int j = 0; j < goods_num; j ++){</p><p> if(Max_value_single.max_value_single[j] == 1){</p><p> pw.write(goods_weight[j] + " ");</p><
96、;p><b> }</b></p><p><b> }</b></p><p> pw.println();</p><p> pw.println();</p><p><b> //物品的價(jià)值</b></p><p> pw.wr
97、ite("物品的價(jià)值:");</p><p> for(int j = 0; j < goods_num; j ++){</p><p> if(Max_value_single.max_value_single[j] == 1){</p><p> pw.write(goods_value[j] + " ");&
98、lt;/p><p><b> }</b></p><p><b> }</b></p><p> pw.println();</p><p> pw.println();</p><p><b> //總價(jià)值</b></p><
99、p> pw.print("物品的總價(jià)值:");</p><p> pw.print(Max_value_single.max_value);</p><p> //-------------------------</p><p> pw.close();</p><p> fw.close();</
100、p><p> } catch (Exception e) {</p><p> e.printStackTrace();</p><p><b> }</b></p><p><b> }</b></p><p> public static void main(Str
101、ing[] args){</p><p> PackageByGA ga = new PackageByGA();</p><p> int[][] popu = ga.packetByGA();</p><p> ga.output(popu);</p><p><b> }</b></p>&l
102、t;p><b> }</b></p><p><b> //最大價(jià)值的個(gè)體</b></p><p> public class Max_value_single{</p><p> public static int[] max_value_single = null;</p><p>
103、; public static double max_value = 0;</p><p><b> }</b></p><p> public class Global {</p><p> public final static int POPU_NUM = 4;//種群的規(guī)模</p><p> publ
104、ic final static int MAX_GEN_NUM = 8;//遺傳的最大代數(shù)</p><p> public final static double CROSS_RATE = 1;//交叉率</p><p> public final static double MUTA_RATE = 0.1;//變異率</p><p><b>
105、 }</b></p><p> 第四部分 程序測(cè)試與結(jié)果分析</p><p><b> 4.1 測(cè)試結(jié)果</b></p><p> 4.1.1 用戶界面</p><p> 4.1.2 輸入數(shù)據(jù)</p><p> 第一行:背包容量,第二行:物品重量,第三行:物品價(jià)值:與第二行
106、對(duì)應(yīng)</p><p> 4.1.3 輸出結(jié)果</p><p> 1、種群規(guī)模為4,最大遺傳代數(shù)為8時(shí)連續(xù)運(yùn)行四次的結(jié)果:</p><p> 種群規(guī)模為8,最大遺傳代數(shù)為20時(shí)連續(xù)運(yùn)行四次的結(jié)果:</p><p><b> 4.2結(jié)果分析</b></p><p> 可以看出在保持其他條件不
107、變的條件下增大種群規(guī)模和最大遺傳代數(shù)結(jié)果越精確。</p><p> 第五部分 總結(jié)與心得體會(huì)</p><p> 該算法具有遺傳算法的所有不足之處:</p><p> (1)編碼不規(guī)范及編碼存在表示的不準(zhǔn)確性。</p><p> (2)單一的遺傳算法編碼不能全面地將優(yōu)化問(wèn)題的約束表示出來(lái)??紤]約束的一個(gè)方法就是對(duì)不可行解采用閾值,這樣
108、,計(jì)算的時(shí)間必然增加。</p><p> (3)遺傳算法通常的效率比其他傳統(tǒng)的優(yōu)化方法低。</p><p> (4)遺傳算法容易過(guò)早收斂。</p><p> (5)遺傳算法對(duì)算法的精度、可行度、計(jì)算復(fù)雜性等方面,還沒(méi)有有效的定量分析方法</p><p> 而且這個(gè)算法實(shí)現(xiàn)得比較簡(jiǎn)單,還有很多未知錯(cuò)誤沒(méi)有進(jìn)行優(yōu)化,容易出現(xiàn)異常。<
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 生物信息學(xué)課程設(shè)計(jì)-- 貝葉斯算法編程實(shí)現(xiàn)
- 生物信息學(xué)課程信息
- 生物信息學(xué)
- 生物信息學(xué)教案
- 生物信息學(xué)課件
- 生物信息學(xué)導(dǎo)論
- 生物信息學(xué)概論
- 生物信息學(xué)中的算法問(wèn)題
- 基于遺傳算法的數(shù)據(jù)挖掘及其在生物信息學(xué)中的應(yīng)用.pdf
- 生物信息學(xué)序列分析
- 生物信息學(xué)考試大綱
- 生物信息學(xué)作業(yè)實(shí)驗(yàn)
- 生物信息學(xué) 期末復(fù)習(xí)
- 生物信息學(xué)選擇題
- 生物信息學(xué)多序列比對(duì)算法研究.pdf
- 生物信息學(xué)復(fù)習(xí)題
- 生物信息學(xué)及其發(fā)展歷史
- 生物信息學(xué) 復(fù)習(xí)題
- 生物信息學(xué)實(shí)驗(yàn)報(bào)告
- 生物信息學(xué)作業(yè)實(shí)驗(yàn)6
評(píng)論
0/150
提交評(píng)論