一個關於遺傳算法優化的簡單例子


在課程上學了一些關於遺傳算法的思想的,想用這個思想來寫一個簡單的小例子。

先來說遺傳算法的思想:遺傳算法是模擬生物的遺傳、變異、選擇、進化來對問題的解進行優化,可以理解為將一組初始解看成是“基因”,在求解的開始設置一個過濾器,對“基因”進行篩選,通過如果目前生成的“基因”暫不滿足上述條件,那么“基因”就要開始“變異”,在迭代過程中通過產生的隨機數,對“基因”進行更改,達到“變異”的目的,也就是”遺傳“給了下一代。而因為變異的隨機性,計算機能夠相當大的范圍內對問題的解進行搜索,直至隨着迭代的代數繼續增加而解幾乎不再變化為止。這時,我們可以說,我們的得到了進化后的最優解。

例:用遺傳算法思想對函數 f(x)=x^2+sin(x) 進行優化,找出該函數的極值。

(使用的Anaconda3的spyder編寫的)

 1 import random as R
 2 import math
 3 import matplotlib.pyplot as plt #通常遺傳算法會優圖像演示需求
 4 f=lambda x:x*x+math.sin(x) #定義lambda函數,即我們要求最優解得函數
 5 x1=x0=float(input('enter a value of x:'))
 6 y1=y0=f(x0)
 7 count=0 #記錄迭代代數
 8 delta=0.001 #每次變異,對x的修改量,可以使之盡量小,從而避免在遺傳變異中錯過最優值
 9 xi=[] #通過下x,y來記錄迭代的點坐標,方便畫圖
10 yi=[]
11 while(count<100000): #迭代代數,可以自己設置
12     sign=R.random()
13     if sign<=0.5:
14         x0+=delta
15         if abs(y0-f(x0))<1e-6: #進化完成條件,極值處的導數為0,此時,我們將精度定位1e-6
16             break
17         count+=1
18         if y0>f(x0):
19             y0=f(x0)
20     else:
21         x1-=delta
22         if abs(y0-f(x1)<1e-6):
23             break
24         count+=1
25         if y0>f(x1):
26             y0=f(x1)  
27     if count%25==0:
28         xi.append(count)
29         yi.append(y0)
30 plt.plot(xi,yi,'r-')
31 print('極值結果為:{:.6f},迭代代數為{}代'.format(y0,count))

以上便是關於遺傳算法的介紹以及一個Python小程序,雖然簡單,但整個算法的基本步驟基本都包含了,適合復習時瀏覽一下。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM