在課程上學了一些關於遺傳算法的思想的,想用這個思想來寫一個簡單的小例子。
先來說遺傳算法的思想:遺傳算法是模擬生物的遺傳、變異、選擇、進化來對問題的解進行優化,可以理解為將一組初始解看成是“基因”,在求解的開始設置一個過濾器,對“基因”進行篩選,通過如果目前生成的“基因”暫不滿足上述條件,那么“基因”就要開始“變異”,在迭代過程中通過產生的隨機數,對“基因”進行更改,達到“變異”的目的,也就是”遺傳“給了下一代。而因為變異的隨機性,計算機能夠相當大的范圍內對問題的解進行搜索,直至隨着迭代的代數繼續增加而解幾乎不再變化為止。這時,我們可以說,我們的得到了進化后的最優解。
例:用遺傳算法思想對函數 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小程序,雖然簡單,但整個算法的基本步驟基本都包含了,適合復習時瀏覽一下。