導航:首頁 > 源碼編譯 > 遺傳演算法實數編碼實例

遺傳演算法實數編碼實例

發布時間:2023-07-06 00:29:46

A. 實數編碼遺傳演算法是怎麼實現實數編碼的

又叫真實值編碼,個體的每個基因位用某一范圍內的一個浮點來表示,個體的編碼長度取決於決策量的個數

B. MATLAB中遺傳演算法編程中,二進制編碼如何處理實數變數

假如你想要編碼為x,設x的范圍是【min,max】,二進制編碼長度為10,那二進解碼方式是:x*(max-min)/1023,這個不用開始編碼,開始你可以用rand(n,10)產生n個樣本的隨機數,然後優化即可。
不是能把「數學模型中的目標函數和每一條約束函數分別編程Matlab里的M文件」,是你用遺傳演算法就必須要編進去,電腦怎麼知道往哪個方向優化是好的,要不把你郵箱留下,我給你發個尋求最大值的遺傳演算法。

C. 遺傳演算法在數學上的應用

應用遺傳演算法搜索邊坡最小安全系數的研究
陸峰 陳祖煜 李素梅
(中國水利水電科學研究院結構材料所)

提 要
本文簡要介紹了滑坡滑裂面搜索問題和遺傳演算法,並試用遺傳進化演算法從邊坡任意形狀滑裂面組合中搜索最有可能的滑裂面,也就是使安全系數最小的滑裂面。作為實例,分析了遺傳演算法在天生橋二級電站首部樞紐進水口右岸滑坡分析中的應用。

關鍵詞 邊坡;安全系數;遺傳演算法;EMU程序。

1.前言

在應用條分法進行邊坡穩定分析的過程中,從可能的滑裂面集合中確定相應最小安全系數的臨界滑裂面是很關鍵的一步。這是一個確定安全系數這個泛函對滑裂面形狀這個自變函數的極小值問題。由於實際情況的復雜性,求這一極小值的解析方法很難付諸實施。從實用角度出發,基於最優化原理發展起來的求邊坡最小安全系數的方法是比較有效而且便於應用。這些方法有"窮舉法"、"黃金分割法"、"鮑威爾法"等,但它們都只能應用於圓弧形滑裂面或圓弧-直線形(改良圓弧法)滑裂面的情形。對於比較符合岩質邊坡的具有多個自由度的折線形滑裂面情形,孫君實用復形法取得較好的效果;陳祖煜提出了單純形法,使最優化方法搜索邊坡最危險滑裂面更加有效,且不會漏掉可能的最小值。單純形法程序已在國內外多家工程、科研和教育單位得到應用,並不斷隨著應用工程案例數量的增加而不斷完善[1]。單純形法使最優化方法應用於岩質邊坡穩定性分析的研究和應用前進了一大步。同為最優化方法,遺傳演算法是最近發展起來的一種仿生尋優演算法。國內外已有一些學者試圖將遺傳演算法應用於搜索安全系數最小的邊坡滑裂面,以期獲得更優的結果。文獻[2]將此演算法應用於基於圓弧滑裂面假定的任意形狀坡面的非均質土坡情況,搜索的目標是使邊坡安全系數最小的圓弧滑裂面圓心和半徑。本文將在文獻[1]和文獻[2]的基礎上,應用遺傳演算法搜索邊坡安全系數最小的任意形狀滑裂面,根據工程實踐經驗,主要是折線組合的滑裂面。 2.遺傳演算法及其應用於岩土工程的基礎

如前所述,搜索邊坡最危險滑裂面問題是安全系數對滑裂面形狀的泛函極值問題。數值方法求解這一問題的主要手段是迭代運算。一般的迭代方法容易陷入局部極小的陷阱而出現"死循環"現象,使迭代無法進行。遺傳演算法很好地克服了這個缺點,是一種全局優化演算法。
生物在漫長的進化過程中,從低等生物一直發展到高等生物,可以說是一個絕妙的優化過程。這是自然環境選擇的結果。人們研究生物進化現象,總結出進化過程包括復制、雜交、變異、競爭和選擇。一些學者從生物遺傳、進化的過程得到啟發,提出了遺傳演算法(GA)。演算法中稱遺傳的生物體為個體(indivial),個體對環境的適應程度用適應值(fitness)表示。適應值取決於個體的染色體(chromosome),在演算法中染色體常用一串數字表示,數字串中的一位對應一個基因(gene)。一定數量的個體組成一個群體(population)。對所有個體進行選擇、交叉和變異等操作,生成新的群體,稱為新一代(new generation)。
遺傳演算法計算程序的流程可以表示如下[3]:
第一步 准備工作
(1)選擇合適的編碼方案,將變數(特徵)轉換為染色體(數字串,串長為m)。通常用二進制編碼。
(2)選擇合適的參數,包括群體大小(個體數M)、交叉概率PC和變異概率Pm。
(3)確定適應值函數f(x)。f(x)應為正值。
第二步 形成一個初始群體(含M個個體)。在邊坡滑裂面搜索問題中,取已分析的可能滑裂面組作為初始群體。
第三步 對每一染色體(串)計算其適應值fi,同時計算群體的總適應值 。
第四步 選擇
計算每一串的選擇概率Pi=fi/F及累計概率 。選擇一般通過模擬旋轉滾花輪(roulette,其上按Pi大小分成大小不等的扇形區)的演算法進行。旋轉M次即可選出M個串來。在計算機上實現的步驟是:產生[0,1]間隨機數r,若r<q1,則第一串v1入選,否則選v2,使滿足qi-1<r<qi(2≤i≤m)。可見適應值大的入選概率大。
第五步 交叉
(1) 對每串產生[0,1]間隨機數,若r>pc,則該串參加交叉操作,如此選出參加交叉的一組後,隨機配對。
(2) 對每一對,產生[1,m]間的隨機數以確定交叉的位置。
第六步 變異
如變異概率為Pm,則可能變異的位數的期望值為Pm ×m×M,每一位以等概率變異。具體為對每一串中的每一位產生[0,1]間的隨機數r,若r<Pm,則該位發生反轉,如對染色體二進制編碼為數字0變為1,1變為0。
如新個體數達到M個,則已形成一個新群體,轉向第三步;否則轉向第四步繼續遺傳操作。直到找到使適應值最大的個體或達到最大進化代數為止。
由於選擇概率是由適應值決定的,即適應值大的染色體入選概率也較大,使選擇起到"擇優汰劣"的作用。交叉使染色體交換信息,結合選擇規則,使優秀信息得以保存,不良信息被遺棄。變異是基因中得某一位發生突變,以達到產生確實有實質性差異的新品種。遺傳演算法雖是一種隨機演算法,但它是有導向的,它所使用的"按概率隨機選擇"方法是在有方向的搜索方法中的一種工具。正是這種獨特的搜索方法,使遺傳演算法自然地避開了其它最優化演算法常遇到的局部最小陷阱。遺傳演算法搜索最優結果的效果在數學上還沒有嚴格的證明,但它的有效性已在許多專業的應用的得到體現。對於岩質邊坡安全系數對滑裂面形狀這樣不可微的泛函極值問題,就目前的科學認識水平來講,遺傳演算法不失為一種可以信賴的方法。 3.用遺傳演算法搜索安全系數最小的邊坡任意形狀滑裂面

在邊坡(尤其是岩質邊坡)最危險滑裂面搜索問題中,滑裂面的實際形狀是很復雜的,起控製作用的是岩體的主要結構面和邊坡的體型。從以往實際工程經驗看,可以總結出岩質邊坡滑裂面在順滑方向上的剖面形狀為折線,由岩體結構面和局部岩土材料的剪切破壞面連接而成。這樣,搜索最危險滑裂面的問題就可以簡化為從折線滑裂面組合中尋優的問題。本文用遺傳進化演算法解決這個問題。
(1) 定義遺傳演算法的目標函數
目標函數定義為邊坡的安全系數,用安全系數的大小表示解的適應值。在邊坡最危險滑裂面搜索問題中,解的安全系數越小,適應性能越好。
(2) 初始群體的確定
根據邊坡的工程地質調查記錄,根據經驗初步擬定出一批滑裂面形狀。如圖1所示,滑裂面由點序列Ai(xi,yi)(i=1,?,N)表示。將點序列AI的坐標(xi,yi)依次排列成x1y1x2y2?xNyN的形式,經二進制編碼形成一條染色體。對於擬定的滑裂面形狀,其對應的安全系數用EMU程序[4]進行計算。
(3) 確定搜索范圍
根據經驗對每個點Ai,確定其坐標(xi,yi)的可能變化范圍。在此范圍內搜索導致最小安全系數的邊坡滑裂面形狀。
(4) 計算
將初始種群的所有擬定滑裂面形狀(染色體)交給遺傳演算法程序進行計算。具體過程參見前文。

4.算例分析[4]

圖1 天生橋二級電站首部樞紐進水口右岸滑坡示意圖

選用天生橋二級電站首部樞紐進水口右岸滑坡作為算例,圖1為其計算簡圖。滑坡高約30m,總方量為7000餘m3,主要為第四系沖坡積物和施工堆碴。物理力學參數見表1。

表1 各土層物理力學性能指標
土層 密度(g/cm3) 抗剪強度指標
內摩擦角 凝聚力(kPa)
① 施工棄碴 1.85 21.8° 19.6
② 坡積土 1.85 21.8° 0.0
③ 砂土 1.85 21.8° 29.4
④ 砂質淤泥 1.85 20.8° 34.3
⑤ 河卵石、礫石 1.90 24.2° 0.0

滑坡發生前,靠近坡腳處因修建擋土牆被開挖而削弱邊坡的整體穩定性,可以斷定滑坡的滑裂面將從此經過。本例題還將忽略實際工程中坡頂張裂縫的影響。選用5個點的折線來模擬滑裂面形狀,初步確定AiBiCiDiE(i=1~4)為可能的滑裂面。滑裂面上端點Ai的y坐標已受限制,下端點E的x、y坐標均已確定,故滑裂面只有7個自由度。按遺傳演算法的要求將滑裂面表示成如下形式:
xAxByBxCyCxDyD
四個模擬滑裂面的坐標和由EMU程序分析的安全系數列於表2。
表2 模擬滑裂面坐標及安全系數(坐標單位 m)
滑裂面 xA xB yB xC yC xD yD 安全系數
A1B1C1D1E 35.44 27.69 16.82 18.79 9.25 11.39 4.49 0.92
A2B2C2D2E 38.15 30.60 20.69 23.14 14.60 14.12 8.37 0.99
A3B3C3D3E 39.02 34.18 18.47 26.28 10.41 16.07 4.58 1.02
A3B3C4D4E 39.02 34.18 18.47 25.12 11.39 14.70 4.97 1. 03

限制搜索范圍為每個自由度可在2.0m范圍內變化。將4個排列好的數字串作為輸入數據交給遺傳演算法程序進行編碼、計算。經過大量運算,最後在最大種群代數(1000)群體中找到使安全系數最小的坐標數字串,經解碼形成如下坐標:
(36.89,30.07)(33.25,21.52)(21.71,9.34)(13.54,5.07)(0.0,0.0)
即為圖1中的ABCDE滑裂面。由遺傳演算法求出其相應的安全系數為0.90。滑裂面形式和安全系數都比較接近實際情況。

5.結語

遺傳演算法是一種高效的尋優演算法,而且能有效地解決局部最小問題、非線性映射關系的表示、非線性映射關系不可微等普通優化演算法常遇到的問題。算例的成果證明了這一特點。將遺傳演算法應用於滑坡滑裂面搜索問題,主要的工作是將工程問題簡化成遺傳演算法需要的形式,簡化時需詳細參考地質調查資料和工程經驗,務使簡化的形式接近實際情況。對於簡化的搜索樣本,其安全系數的計算必須可靠,為此可應用一些比較成熟的計算程序,如EMU等。充分考慮實際工程地質情況和選取切合實際的搜索樣本後,遺傳演算法程序必將能為滑坡搜索出最有可能的滑裂面。

參考文獻

1 陳祖煜,邵長明,最優化方法在確定邊坡最小安全系數方面的應用,岩土工程學報,Vol.10, No.4, 1998.7。
2 肖專文,張奇志,梁力,林韻梅,遺傳進化演算法在邊坡穩定性分析中的應用,岩土工程學報,Vol.20, No.1, 1998.1。
3 周明,孫樹棟,遺傳演算法原理及應用,國防工業出版社,1999.6。
4 陳祖煜,岩質高邊坡穩定分析程序EMU,1995.5。

Research on Searching Least Factor of Safety of Slopes with Genetic Algorithm

Lu Feng Chen Zuyu Li Sumei
(Department of Structure and Material, IWHR)

Abstract

The problem of searching least factor of safety of slopes and the theory of Genetic Algorithm have been introced in this paper. This theory has been employed to solve this problem to find the most possible slide of slopes. As an example, the application of genetic algorithm on the Tianshengqiao Power Station Right Bank Slide has been presented.

Keywords: Slope, Factor of Safety, Genetic Algorithm, EMU Program.

D. 我想請教一下遺傳演算法裡面的實數編碼是怎麼一回事,我在做一個多目標優化的問題,希望您能指點

說的是用函數crtrp產生初始種群吧,格式為chrom=crtrp(個體數,約束);
個體數即希望產生的初始種群數,
約束為矩陣,表示變數的取值范圍。如:[-10,-5,-3,-2;10,5,3,2]表示有四個變數,范圍分別是
[-10,10],[-5,5],[-3,3],[-2,2]。這樣就會產生一個初始種群有四列,是隨機取值。
希望有用,當然別忘了支持一下啊!互相學習。。。

E. 如何用遺傳演算法實現多變數的最優化問題

是不是像求函數最值那樣子?建議你了解一下遺傳演算法的實數編碼,這個對於求函數最值很方便,不用像二進制那樣需要轉換。

簡單介紹一下思路:
最重要的是確定適應度函數,只要確定這個函數就很容易了,就用你不會編程,直接調用matlab的工具箱就行了。

1st.設置種群規模,並初始化種群p,並計算各個個體的適應度。
例如,20個個體,每個個體包含5個變數,x1,x2,x3,x4,x5.
如果你用matlab來編程的話,這個可以很容易實現,會用到random('unif',a,b)這個函數吧。
例如x1的取值范圍是[0,1],那麼x1=random('unif',0,1).

2nd.採用輪盤賭選出可以產生後代的父本,p_parents。
額,輪盤賭的實質就是適應度大的被選出的概率大。這個不難,但說起來比較長,你可以自己去看一下。

3rd.雜交過程的思路隨機將p_parents中的個體隨機兩兩配對,然後隨機產生一個1到n的數(n為變數的個數),設為i,交換每對父本中i之後的變數值。交換以後的p_parents成為後代p_offspring.
這里變起來有點點復雜,不過只要耐心一點,編好配對過程和交換過程。

4th.變異過程,這個比較簡單,不過需要自己把握的較好。
基本的思路是設置一個概率,例如0.05,然後產生一個隨機數如果隨機數比0.05小那麼這個變數值就要產生微小的增加或減少。
這個變異過程要歷遍p_offspring所有的變數喔。

5th.將p和p_offspring合並起來,然後選出適應度大的,重新構成一個如原始種群規模相等的種群。

F. 用遺傳演算法變成,想用實數編碼,這個實數編碼長度怎麼計算

實數編碼沒有編碼長度的說法,實數編碼時染色體(控制變數)就是一個實數,大小介於該染色體(控制變數)的上下限區間內。

G. 求基於遺傳演算法的TPS的matlab程序,坐標手動輸入

1. 遺傳演算法實現過程

現實生活中很多問題都可以轉換為函數優化問題,所以本文將以函數優化問題作為背景,對GA的實現過程進行探討。大部分函數優化問題都可以寫成求最大值或者最小值的形式,為了不是一般性,我們可以將所有求最優值的情況都轉換成求最大值的形式,例如,求函數f(x)的最大值,

clip_image002

若是求函數f(x)的最小值,可以將其轉換成g(x)=-f(x),然後求g(x)的最大值,

clip_image004

這里x可以是一個變數,也可是是一個由k個變數組成的向量, x=(x1, x2, …, xk)。每個xi, i=1,2,…,k, 其定義域為Di,Di=[ai, bi]。

一般規定f(x)在其定義域內只取正值,若不滿足,可以將其轉換成以下形式,

clip_image006

其中C是一個正常數。

1.1 編碼與解碼

要實現遺傳演算法首先需要弄清楚如何對求解問題進行編碼和解碼。對於函數優化問題,一般來說,有兩種編碼方式,一是實數編碼,一是二進制編碼,兩者各有優缺點,二進制編碼具有穩定性高、種群多樣性大等優點,但是需要的存儲空間大,需要解碼過程並且難以理解;而實數編碼直接用實數表示基因,容易理解並且不要解碼過程,但是容易過早收斂,從而陷入局部最優。本文以最常用的二進制編碼為例,說明遺傳編碼的過程。

從遺傳演算法求解的過程來看,需要處理好兩個空間的問題,一個是編碼空間,另一個是解空間,如下圖所示

clip_image007

從解空間到編碼空間的映射過程成為編碼過程;從編碼空間到解空間的映射過程成為解碼過程。下面就以求解一個簡單的一維函數f(x) = -(x-1)^2+4, x的取值范圍為[-1,3]最大值為例,來說明編碼及解碼過程。

編碼:

在編碼之前需要確定求解的精度,在這里,我們設定求解的精度為小數點後四位,即1e-4。這樣可以將每個自變數xi的解空間劃分為clip_image011個等分。以上面這個函數為例,即可以將x的解空間劃分為(3-(-1))*1e+4=40000個等分。使ni滿足clip_image013,這里ni表示使上式成立的最小整數,即表示自變數xi的基因串的長度。因為215<40000<216 ,這里ni取16。例如0000110110000101就表示一個解空間中的基因串。表示所有自變數x=(x1, x2, …, xk)的二進制串的總長度稱為一個染色體(Chromosome)的長度或者一個個體(Indivial)的長度,clip_image015。編碼過程一般在實現遺傳演算法之前需要指定。

解碼:

解碼即將編碼空間中的基因串翻譯成解空間中的自變數的實際值的過程。對於二進制編碼而言,每個二進制基因串都可以這樣翻譯成一個十進制實數值,clip_image017。例如基因串0000110110000101,可以翻譯為clip_image019,這里二進制基因串轉變成十進制是從左至右進行的。

1.2 初始化種群

在開始遺傳演算法迭代過程之前,需要對種群進行初始化。設種群大小為pop_size,每個染色體或個體的長度為chromo_size,種群的大小決定了種群的多樣性,而染色體的長度則是由前述的編碼過程決定的。一般隨機生成初始種群,但是如果知道種群的實際分布,也可以按照此分布來生成初始種群。假設生成的初始種群為(v1, v2, …, vpop_size)。

1.3 選擇操作

選擇操作即從前代種群中選擇個體到下一代種群的過程。一般根據個體適應度的分布來選擇個體。以初始種群(v1, v2, …, vpop_size)為例,假設每個個體的適應度為(fitness(v1), fitness(v2),…, fitness(vpop_size)),一般適應度可以按照解碼的過程進行計算。以輪盤賭的方式選擇個體,如下圖

clip_image020

隨機轉動一下輪盤,當輪盤停止轉動時,若指針指向某個個體,則該個體被選中。很明顯,具有較高適應度的個體比具有較低適應度的個體更有機會被選中。但是這種選擇具有隨機性,在選擇的過程中可能會丟失掉比較好的個體,所以可以使用精英機制,將前代最優個體直接選到下一代中。

輪盤賭選擇具體演算法如下(這里假定種群中個體是按照適應度從小到大進行排列的,如果不是,可以按照某種排序演算法對種群個體進行重排):

Selection Algorithm
var pop, pop_new;/*pop為前代種群,pop_new為下一代種群*/
var fitness_value, fitness_table;/*fitness_value為種群的適應度,fitness_table為種群累積適應度*/
for i=1:pop_size
r = rand*fitness_table(pop_size);/*隨機生成一個隨機數,在0和總適應度之間,因為fitness_table(pop_size)為最後一個個體的累積適應度,即為總適應度*/
first = 1;
last = pop_size;
mid = round((last+first)/2);
idx = -1;
/*下面按照排中法選擇個體*/
while (first <= last) && (idx == -1)
if r > fitness_table(mid)
first = mid;
elseif r < fitness_table(mid)
last = mid;
else
idx = mid;
break;
end if
mid = round((last+first)/2);
if (last - first) == 1
idx = last;
break;
end if
end while

for j=1:chromo_size
pop_new(i,j)=pop(idx,j);
end for
end for
/*是否精英選擇*/
if elitism
p = pop_size-1;
else
p = pop_size;
end if
for i=1:p
for j=1:chromo_size
pop(i,j) = pop_new(i,j);/*若是精英選擇,則只將pop_new前pop_size-1個個體賦給pop,最後一個為前代最優個體保留*/
end for
end for
1.3 交叉操作

交叉操作是對任意兩個個體進行的(在這里我們實現的演算法是直接對相鄰的兩個個體進行的)。隨機選擇兩個個體,如下圖所示

clip_image001

然後隨機生成一個實數0<=r<=1, 如果r<cross_rate, 0<cross_rate<1為交叉概率,則對這兩個個體進行交叉,否則則不進行。如果需要進行交叉,再隨機選擇交叉位置(rand*chromo_size),如果等於0或者1,將不進行交叉。否則將交叉位置以後的二進制串進行對換(包括交叉位置)。(注意:有時候還可以進行多點交叉,但是這里只討論單點交叉的情況)

單點交叉具體演算法如下:

Crossover algorithm
for i=1:2:pop_size
if(rand < cross_rate)/*cross_rate為交叉概率*/
cross_pos = round(rand * chromo_size);/*交叉位置*/
if or (cross_pos == 0, cross_pos == 1)
continue;/*若交叉位置為0或1,則不進行交叉*/
end if
for j=cross_pos:chromo_size
pop(i,j)<->pop(i+1,j);/*交換*/
end for
end if
end for
1.4 變異操作

變異操作是對單個個體進行的。首先生成一個隨機實數0<=r<=1, 如果r<mutate_rate,則對此個體進行變異操作, 0<mutate_rate<1為變異概率,一般為一個比較小的實數。對每一個個體,進行變異操作,如下圖所示

clip_image001[4]

如個體需要進行變異操作,首先需要確定變異位置(rand*chromo_size),若為0則不進行變異,否則則對該位置的二進制數字進行變異:1變成0, 0變成1.(當然也可以選擇多點進行變異)

單點變異的具體演算法描述如下:

Mutation algorithm
for i=1:pop_size
if rand < mutate_rate/*mutate_rate為變異概率*/
mutate_pos = round(rand*chromo_size);/*變異位置*/
if mutate_pos == 0
continue;/*若變異位置為0,則不進行變異*/
end if
pop(i,mutate_pos) = 1 - pop(i, mutate_pos);/*將變異位置上的數字至反*/
end if
end for
1.5 遺傳演算法流程

遺傳演算法計算流程圖如下圖所示

clip_image001[6]

1.6 MATLAB程序實現

初始化:

%初始化種群
%pop_size: 種群大小
%chromo_size: 染色體長度

function initilize(pop_size, chromo_size)
global pop;
for i=1:pop_size
for j=1:chromo_size
pop(i,j) = round(rand);
end
end
clear i;
clear j;
計算適應度:(該函數應該根據具體問題進行修改,這里優化的函數是前述的一維函數)

%計算種群個體適應度,對不同的優化目標,此處需要改寫
%pop_size: 種群大小
%chromo_size: 染色體長度

function fitness(pop_size, chromo_size)
global fitness_value;
global pop;
global G;
for i=1:pop_size
fitness_value(i) = 0.;
end

for i=1:pop_size
for j=1:chromo_size
if pop(i,j) == 1
fitness_value(i) = fitness_value(i)+2^(j-1);
end
end
fitness_value(i) = -1+fitness_value(i)*(3.-(-1.))/(2^chromo_size-1);
fitness_value(i) = -(fitness_value(i)-1).^2+4;
end

clear i;
clear j;
對個體按照適應度大小進行排序:

%對個體按適應度大小進行排序,並且保存最佳個體
%pop_size: 種群大小
%chromo_size: 染色體長度

function rank(pop_size, chromo_size)
global fitness_value;
global fitness_table;
global fitness_avg;
global best_fitness;
global best_indivial;
global best_generation;
global pop;
global G;

for i=1:pop_size
fitness_table(i) = 0.;
end

min = 1;
temp = 1;
temp1(chromo_size)=0;
for i=1:pop_size
min = i;
for j = i+1:pop_size
if fitness_value(j)<fitness_value(min);
min = j;
end
end
if min~=i
temp = fitness_value(i);
fitness_value(i) = fitness_value(min);
fitness_value(min) = temp;
for k = 1:chromo_size
temp1(k) = pop(i,k);
pop(i,k) = pop(min,k);
pop(min,k) = temp1(k);
end
end

end

for i=1:pop_size
if i==1
fitness_table(i) = fitness_table(i) + fitness_value(i);
else
fitness_table(i) = fitness_table(i-1) + fitness_value(i);
end
end
fitness_table
fitness_avg(G) = fitness_table(pop_size)/pop_size;

if fitness_value(pop_size) > best_fitness
best_fitness = fitness_value(pop_size);
best_generation = G;
for j=1:chromo_size
best_indivial(j) = pop(pop_size,j);
end
end

clear i;
clear j;
clear k;
clear min;
clear temp;
clear temp1;

選擇操作:

%輪盤賭選擇操作
%pop_size: 種群大小
%chromo_size: 染色體長度
%cross_rate: 是否精英選擇

function selection(pop_size, chromo_size, elitism)
global pop;
global fitness_table;

for i=1:pop_size
r = rand * fitness_table(pop_size);
first = 1;
last = pop_size;
mid = round((last+first)/2);
idx = -1;
while (first <= last) && (idx == -1)
if r > fitness_table(mid)
first = mid;
elseif r < fitness_table(mid)
last = mid;
else
idx = mid;
break;
end
mid = round((last+first)/2);
if (last - first) == 1
idx = last;
break;
end
end

for j=1:chromo_size
pop_new(i,j)=pop(idx,j);
end
end
if elitism
p = pop_size-1;
else
p = pop_size;
end
for i=1:p
for j=1:chromo_size
pop(i,j) = pop_new(i,j);
end
end

clear i;
clear j;
clear pop_new;
clear first;
clear last;
clear idx;
clear mid;

交叉操作:

%單點交叉操作
%pop_size: 種群大小
%chromo_size: 染色體長度
%cross_rate: 交叉概率

function crossover(pop_size, chromo_size, cross_rate)
global pop;
for i=1:2:pop_size
if(rand < cross_rate)
cross_pos = round(rand * chromo_size);
if or (cross_pos == 0, cross_pos == 1)
continue;
end
for j=cross_pos:chromo_size
temp = pop(i,j);
pop(i,j) = pop(i+1,j);
pop(i+1,j) = temp;
end
end
end

clear i;
clear j;
clear temp;
clear cross_pos;

變異操作:

%單點變異操作
%pop_size: 種群大小
%chromo_size: 染色體長度
%cross_rate: 變異概率
function mutation(pop_size, chromo_size, mutate_rate)
global pop;

for i=1:pop_size
if rand < mutate_rate
mutate_pos = round(rand*chromo_size);
if mutate_pos == 0
continue;
end
pop(i,mutate_pos) = 1 - pop(i, mutate_pos);
end
end

clear i;
clear mutate_pos;
列印演算法迭代過程:

%列印演算法迭代過程
%generation_size: 迭代次數

function plotGA(generation_size)
global fitness_avg;
x = 1:1:generation_size;
y = fitness_avg;
plot(x,y)
演算法主函數:

%遺傳演算法主函數
%pop_size: 輸入種群大小
%chromo_size: 輸入染色體長度
%generation_size: 輸入迭代次數
%cross_rate: 輸入交叉概率
%cross_rate: 輸入變異概率
%elitism: 輸入是否精英選擇
%m: 輸出最佳個體
%n: 輸出最佳適應度
%p: 輸出最佳個體出現代
%q: 輸出最佳個體自變數值

function [m,n,p,q] = GeneticAlgorithm(pop_size, chromo_size, generation_size, cross_rate, mutate_rate, elitism)

global G ; %當前代
global fitness_value;%當前代適應度矩陣
global best_fitness;%歷代最佳適應值
global fitness_avg;%歷代平均適應值矩陣
global best_indivial;%歷代最佳個體
global best_generation;%最佳個體出現代

fitness_avg = zeros(generation_size,1);

disp "hhee"

fitness_value(pop_size) = 0.;
best_fitness = 0.;
best_generation = 0;
initilize(pop_size, chromo_size);%初始化
for G=1:generation_size
fitness(pop_size, chromo_size); %計算適應度
rank(pop_size, chromo_size); %對個體按適應度大小進行排序
selection(pop_size, chromo_size, elitism);%選擇操作
crossover(pop_size, chromo_size, cross_rate);%交叉操作
mutation(pop_size, chromo_size, mutate_rate);%變異操作
end
plotGA(generation_size);%列印演算法迭代過程
m = best_indivial;%獲得最佳個體
n = best_fitness;%獲得最佳適應度
p = best_generation;%獲得最佳個體出現代

%獲得最佳個體變數值,對不同的優化目標,此處需要改寫
q = 0.;
for j=1:chromo_size
if best_indivial(j) == 1
q = q+2^(j-1);
end
end
q = -1+q*(3.-(-1.))/(2^chromo_size-1);

clear i;
clear j;

2. 案例研究

對上一節中的函數進行優化,設置遺傳演算法相關參數,程序如下

function run_ga()
elitism = true;%選擇精英操作
pop_size = 20;%種群大小
chromo_size = 16;%染色體大小
generation_size = 200;%迭代次數
cross_rate = 0.6;%交叉概率
mutate_rate = 0.01;%變異概率

[m,n,p,q] = GeneticAlgorithm(pop_size, chromo_size, generation_size, cross_rate, mutate_rate,elitism);
disp "最優個體"
m
disp "最優適應度"
n
disp "最優個體對應自變數值"
q
disp "得到最優結果的代數"
p

clear;

結果如下:

"最優個體"

m =

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0

"最優適應度"

n =

4.0000

"最優個體對應自變數值"

q =

1.0000

"得到最優結果的代數"

p =

74

此結果非常准確。

H. 遺傳演算法的編碼方法有幾種

常用的編碼介紹
1、二進制編碼:
(1)定義:二進制編碼方法是使用二值符號集{0,1},它所構成的個體基因型是一個二進制編碼符號串。二進制編碼符號串的長度與問題所要求的求解精度有關。
(2)舉例:0≤x≤1023,精度為1,m表示二進制編碼的長度。則有建議性說法:使
2m-1≤1000(跟精度有關)≤2m-1。取m=10
則X:0010101111就可以表示一個個體,它所對應的問題空間的值是x=175。
(3)優缺點
優點:符合最小字元集原則,便於用模式定理分析;
缺點:連續函數離散化時的映射誤差。
2、格雷碼編碼
(1)定義:格雷碼編碼是其連續的兩個整數所對應的編碼之間只有一個碼位是不同的,其餘碼位完全相同。它是二進制編碼方法的一種變形。
十進制數0—15之間的二進制碼和相應的格雷碼分別編碼如下。
二進制編碼為:0000,0001,0010,001
1,0100。0101,0110,0111,
1000,1001,1010,1011,1100,1101,1110,1111;
格雷碼編碼為:0000,0001,0011,0010,0110,0111,0101,0100,
1100,1101,1111,1110,1010,1011,1001,1000。
(2)舉例:對於區間[0。1023]中兩個鄰近的整數X1=175和X2=176,若用長度為10位的二進制編碼,可表示為X11:0010101111和X12
0010110000,而使用同樣長度的格雷碼,它們可分別表示為X21:0010101111和X22:0010101000。
(3)優點:增強了遺傳演算法的局部搜索能力,便於連續函數的局部控制項搜索。
3、浮點數(實數)編碼
(1)定義:浮點數編碼是指個體的每個基因值用某一范圍內的一個浮點數來表示,而個體的編碼長度等於其決策變數的個數。因為這種編碼方法使用的決策變數的真實值,也稱之為真值編碼方法。
(2)舉例:
(3)優點:實數編碼是遺傳演算法中在解決連續參數優化問題時普遍使用的一種編碼方式,具有較高的精度,在表示連續漸變問題方面具有優勢。
4、排列編碼
排列編碼也叫序列編碼,是針對一些特殊問題的特定編碼方式。排序編碼使問題簡潔,易於理解。該編碼方式將有限集合內的元素進行排列。若集合內包含m個元素,則存在m!種排列方法,當m不大時,m!也不會太大,窮舉法就可以解決問題。當m比較大時,m!就會變得非常大,窮舉法失效,遺傳演算法在解決這類問題上具有優勢。如解決TSP問題時,用排列編碼自然、合理。
5、其它編碼方式
多參數級聯編碼等

閱讀全文

與遺傳演算法實數編碼實例相關的資料

熱點內容
男主是條龍女主是鳳凰 瀏覽:816
dy_new_offcial_ikkz7zdef 瀏覽:837
pythondataframe新加一列 瀏覽:775
韓國小孩子和大人電影 瀏覽:540
類似於情人的電影 瀏覽:307
韓劇女主在瑜伽房練瑜伽男主在身上看 瀏覽:1000
Yen演算法能做什麼 瀏覽:993
在公網如何訪問家裡伺服器 瀏覽:775
php發送https請求 瀏覽:484
找一本小說主角娶了李富真 瀏覽:415
台灣一類片 瀏覽:452
日本電影小伙重生 瀏覽:919
命令提示符文件夾 瀏覽:936
韓國電影愛情 瀏覽:900
任務管理器打開命令行 瀏覽:861
彼時曾相伴電影努努 瀏覽:534
主角重生民國參加黃埔 瀏覽:414
睿威仕無線攝像用什麼app 瀏覽:198
女兒父親鉤引電影 瀏覽:174
大香蕉手機 瀏覽:856