版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 生物信息學課程設計報告</p><p><b> ?。ㄋ惴ň幊虒崿F(xiàn)類)</b></p><p> 副題:生物信息遺傳算法編程實現(xiàn)</p><p> 院 系 部 門: </p><p> 學 生 學 號: </p><p> 學 生 姓 名
2、: </p><p> 指 導 教 師: </p><p><b> 2013年12月</b></p><p><b> 目錄</b></p><p> 第一部分 遺傳算法研究背景、特點與發(fā)展1</p><p> 1.1 遺傳算法研
3、究背景1</p><p> 1.2 遺傳算法特點2</p><p> 1.3 遺傳算法發(fā)展2</p><p> 1.4 本算法編程實現(xiàn)內容和方案2</p><p> 第二部分 算法分析與程序流程圖設計3</p><p> 2.1 基于問題的描述3</p><p>
4、 2.2 基于問題的知識表示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 基于問題的java算法分析4</p><p> 2.4 算法流程圖5</p><p> 第
5、三部分 實現(xiàn)設計語言選擇與算法編程實現(xiàn)5</p><p> 3.1 java實現(xiàn)算法5</p><p> 第四部分 程序測試與結果分析15</p><p> 4.1 測試結果15</p><p> 4.1.1 用戶界面15</p><p> 4.1.2 輸入數(shù)據(jù)15</p>&l
6、t;p> 4.1.3 輸出結果15</p><p> 4.2結果分析16</p><p> 第五部分 總結與心得體會16</p><p> 第六部分 參考文獻17</p><p> 第一部分 遺傳算法研究背景、特點與發(fā)展</p><p> 1.1 遺傳算法研究背景</p>
7、<p> 眾所周知,在人工智能領域中,有不少問題需要在復雜而龐大的搜索空間中尋找最優(yōu)解或準優(yōu)解。像貨朗擔問題和規(guī)劃問題等組合優(yōu)化問題就是典型的例子。在求解此類問題時,若不能利用問題的固有知識來縮小搜索空間則會產(chǎn)生搜索的組合爆炸。因此,研究能在搜索過程中自動獲得和積累有關搜索空間的知識,并能自適應地控制搜索過程,從而得到最優(yōu)解或準有解的通用搜索算法一直是令人矚目的課題。遺傳算法就是在這種背景下產(chǎn)生并經(jīng)實踐證明特別有效的算法。
8、</p><p> 1.2 遺傳算法特點</p><p> 遺傳算法具有以下幾方面的特點:</p><p> (1)遺傳算法從問題解的串集開始搜索,而不是從單個解開始。這是遺傳算法與傳統(tǒng)優(yōu)化算法的極大區(qū)別。傳統(tǒng)優(yōu)化算法是從單個初始值迭代求最優(yōu)解的;容易誤入局部最優(yōu)解。遺傳算法從串集開始搜索,覆蓋面大,利于全局擇優(yōu)。</p><p>
9、 (2)遺傳算法同時處理群體中的多個個體,即對搜索空間中的多個解進行評估,減少了陷入局部最優(yōu)解的風險,同時算法本身易于實現(xiàn)并行化。</p><p> (3)遺傳算法基本上不用搜索空間的知識或其它輔助信息,而僅用適應度函數(shù)值來評估個體,在此基礎上進行遺傳操作。適應度函數(shù)不僅不受連續(xù)可微的約束,而且其定義域可以任意設定。這一特點使得遺傳算法的應用范圍大大擴展。</p><p> (4)遺傳
10、算法不是采用確定性規(guī)則,而是采用概率的變遷規(guī)則來指導他的搜索方向。</p><p> (5)具有自組織、自適應和自學習性。遺傳算法利用進化過程獲得的信息自行組織搜索時,適應度大的個體具有較高的生存概率,并獲得更適應環(huán)境的基因結構。</p><p> 1.3 遺傳算法發(fā)展</p><p> 1967年,Holland的學生J.D.Bagley在博士論文中首次提
11、出“遺傳(Genet -ic Algorithms)”一詞。此后,Holland指導學生完成了多篇有關遺傳算法研究的論文。1971年,R.B.Hollstien在他的博士論文中首次把遺傳算法用于函數(shù)優(yōu)化。1975年是遺傳算法研究歷史上十分重要的一年。這一年Holland出版了他的著名專著《自然系統(tǒng)和人工系統(tǒng)的自適應》(Adaptation in Natural and Artificial Systems),這是第一本系統(tǒng)論述遺傳算法
12、的專著,因此有人把1975年作為遺傳算法的誕生年。</p><p> 進入90年代,遺傳算法迎來了興盛發(fā)展時期,無論是理論研究還是應用研究都成了十分熱門的課題。尤其是遺傳算法的應用研究顯得格外活躍,不但它的應用領域擴大,而且利用遺傳算法進行優(yōu)化和規(guī)則學習的能力也顯著提高,同時產(chǎn)業(yè)應用方面的研究也在摸索之中。此外一些新的理論和方法在應用研究中亦得到了迅速的發(fā)展,這些無疑均給遺傳算法增添了新的活力。遺傳算法的應用研
13、究已從初期的組合優(yōu)化求解擴展到了許多更新、更工程化的應用方面。</p><p> 1.4 本算法編程實現(xiàn)內容和方案</p><p> 本算法的實現(xiàn)內容為背包問題,具體方案見第二部分。</p><p> 第二部分 算法分析與程序流程圖設計</p><p> 2.1 基于問題的描述</p><p> 給定n種
14、物品和容量為C的背包。物品i的重量是wi,其價值為vi。問應如何選擇裝入背包的物品,使得裝入背包中物品的總價值最大?</p><p> 2.2 基于問題的知識表示</p><p> 2.2.1 狀態(tài)表示</p><p> 1、個體或染色體:問題的一個解,表示為n個比特的字符串,比特值為0表示不選該物品,比特值為1表示選擇該物品。</p><
15、p> 2、基因:染色體的每一個比特。</p><p> 3、種群:解的集合。</p><p> 4、適應度:衡量個體優(yōu)劣的函數(shù)值。</p><p> 2.2.2 控制參數(shù)</p><p> 1、種群規(guī)模:解的個數(shù)。</p><p><b> 2、最大遺傳的代數(shù)</b></p
16、><p> 3、交叉率:參加交叉運算的染色體個數(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、個適應度函數(shù)f(x),給定種群規(guī)模N,交叉率Pc和變異率Pm,代數(shù)T;</p><p> 2、隨機產(chǎn)生U中的N個個體s1, s2, …, sN,組成初始種群S={s1, s2, …, sN},置代數(shù)計數(shù)器t=1;</p><p> 3、計算S中每個個體的適應度f() ;</p><p> 4、若終止條件滿足,則取S中適應度最大的個體作為所求結果,算法結束。&l
18、t;/p><p> 5、按選擇概率P(xi)所決定的選中機會,每次從S中隨機選定1個個體并將其染色體復制,共做N次,然后將復制所得的N個染色體組成群體S1;</p><p> 6、按交叉率Pc所決定的參加交叉的染色體數(shù)c,從S1中隨機確定c個染色體,配對進行交叉操作,并用產(chǎn)生的新染色體代替原染色體,得群體S2;</p><p> 7、按變異率Pm所決定的變異次數(shù)m
19、,從S2中隨機確定m個染色體,分別進行變異操作,并用產(chǎn)生的新染色體代替原染色體,得群體S3;</p><p> 8、將群體S3作為新一代種群,即用S3代替S,t = t+1,轉步3。</p><p> 2.3 基于問題的java算法分析</p><p> 產(chǎn)生初始群體在java中用Math.random()方法產(chǎn)生一個隨機數(shù),并以次為標準產(chǎn)生一個初始群體來實現(xiàn)
20、,把數(shù)據(jù)保存到generatePopu[ ][ ]數(shù)組中。隨后分析群體中每個個體的適應度,在此問題中以每個個體的總價值來評估個體的適應度,在java中用自定義的方法get_singleValue(int[] single)來實現(xiàn),該方法可以用一個for循環(huán)來實現(xiàn)。若判斷為真取群體中適應度最大的個體作為所求結果,算法停止。否則繼續(xù)進行以下步驟。這時用最大遺傳代數(shù)來作為判斷條件。</p><p> 自定義字符串復制
21、方法doubleArrayCopy(int[][] source)與singleArrayCopy(int[] source)來進行基因與染色體的復制,這兩個方法通過一個簡單的for循環(huán)就可以實現(xiàn)。</p><p> 復制過后就是選擇與變異,變異又分為交叉和突變,與選擇概率,交叉概率和突變概率分別進行選擇與變異操作得到新個體來組成新的群體。這只需要對上一個群體進行遍歷操作,并與選擇概率,交叉概率和突變概率作為條
22、件操作。再對新群體的個體進行評估,得到最優(yōu)解,如此循環(huán)直到滿足終止條件。</p><p><b> 2.4 算法流程圖</b></p><p> 第三部分 實現(xiàn)設計語言選擇與算法編程實現(xiàn)</p><p> 3.1 java實現(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背包問題</p><p> public class PackageByGA {</p><p> private int package_capacity = 0;//背包的容量</p><p> pr
26、ivate int goods_num = 0;//物品的個數(shù),對應遺傳學中個體的基因個數(shù)</p><p> private int[] goods_weight = null;//物品的重量</p><p> private double[] goods_value = null;//物品的價值 </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();//文件選擇對話框</p><p> fc.setCurrentDirectory(new File("."));//從當前目錄選擇文件</p><p> //獲取輸入源,輸入源為選取的文件</p&g
29、t;<p> fc.addPropertyChangeListener(new PropertyChangeListener() {//注冊監(jiān)聽器</p><p> public void propertyChange(PropertyChangeEvent arg0) {//屬性改變事件</p><p> if (arg0.getPropertyName() <
30、/p><p> == JFileChooser.SELECTED_FILE_CHANGED_PROPERTY) {//選擇單個文件**/y</p><p><b> try {</b></p><p> File file = (File) arg0.getNewValue();//獲取屬性的新值,轉換為文件對象</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ù),物品的價值</p><p> str_line = br.readLine();</p><p> goods_value = strArr_to_doubleArr(str_line.split(" "));</p><p><b> //物品的個數(shù)</b></p><p>
35、goods_num = goods_value.length;</p><p><b> //關閉輸入流</b></p><p> fi.close();</p><p> ir.close();</p><p> br.close();</p><p> } catch (Except
36、ion ep) {//如果文件的內容不是全為數(shù)字,則彈出對話框</p><p> JOptionPane.showMessageDialog(null,</p><p> "文件讀取異常,檢查文件內容是否全為數(shù)字!");</p><p><b> }</b></p><p><b>
37、 }</b></p><p><b> }</b></p><p><b> });</b></p><p> fc.showOpenDialog(null);//彈出"打開文件"對話框</p><p><b> }</b></p&
38、gt;<p> //字符串數(shù)組轉換為整數(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()這個函數(shù)把字符串轉換為整型變量。</p><p><b> }</b></p><p
40、> return int_arr;</p><p><b> }</b></p><p> //字符串數(shù)組轉換為浮點數(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> //為什么要把字符串數(shù)組——》整數(shù)數(shù)組——》浮點型數(shù)組???</p><p><b> //一維數(shù)組復制</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ù)組復制</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> //以上兩個復制為染色體的復制</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> //計算個體的總重量</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> //計算個體的總價值</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、; //獲取總價值最大的個體</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> //計算每個個體的適應度</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> //計算每個個體的選擇概率</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> //計算每個個體的累積概率</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)生隨機數(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);//參與交換的個體數(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、參與變異的基因個數(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;//總群的代數(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){//沒有
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);//下一代總群</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> //物品的價值</b></p><p> pw.wr
97、ite("物品的價值:");</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> //總價值</b></p><
99、p> pw.print("物品的總價值:");</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> //最大價值的個體</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> 第四部分 程序測試與結果分析</p><p><b> 4.1 測試結果</b></p><p> 4.1.1 用戶界面</p><p> 4.1.2 輸入數(shù)據(jù)</p><p> 第一行:背包容量,第二行:物品重量,第三行:物品價值:與第二行
106、對應</p><p> 4.1.3 輸出結果</p><p> 1、種群規(guī)模為4,最大遺傳代數(shù)為8時連續(xù)運行四次的結果:</p><p> 種群規(guī)模為8,最大遺傳代數(shù)為20時連續(xù)運行四次的結果:</p><p><b> 4.2結果分析</b></p><p> 可以看出在保持其他條件不
107、變的條件下增大種群規(guī)模和最大遺傳代數(shù)結果越精確。</p><p> 第五部分 總結與心得體會</p><p> 該算法具有遺傳算法的所有不足之處:</p><p> (1)編碼不規(guī)范及編碼存在表示的不準確性。</p><p> (2)單一的遺傳算法編碼不能全面地將優(yōu)化問題的約束表示出來??紤]約束的一個方法就是對不可行解采用閾值,這樣
108、,計算的時間必然增加。</p><p> (3)遺傳算法通常的效率比其他傳統(tǒng)的優(yōu)化方法低。</p><p> (4)遺傳算法容易過早收斂。</p><p> (5)遺傳算法對算法的精度、可行度、計算復雜性等方面,還沒有有效的定量分析方法</p><p> 而且這個算法實現(xiàn)得比較簡單,還有很多未知錯誤沒有進行優(yōu)化,容易出現(xiàn)異常。<
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論