python人工智能算法之差分進化算法的實現(xiàn)
遺傳算法: 純Python實現(xiàn)遺傳算法
DE基于GA,正如進化基于遺傳。和遺傳算法相比,差分進化引入了差分變異模式,相當于開辟了一條嶄新的進化路徑。
初始化
首先,初始種群隨機產(chǎn)生解空間(L,R)范圍的向量
(0)表示第0代。
變異
初始化后,進行變異操作,其第t tt代變異向量為
vi?(t)=xr1??(t)+rand⋅(xr2??(t)−xr3??(t))
其中r1?,r2?,r3?為隨機挑選出的與i ii互不相同的序號,相當于隨機抽選三個值進行基因突變。
交叉
接下來,開始種群繁衍,即種群交叉
其中,r為隨機數(shù),cr是預設的交叉概率因子;rj?為隨機生成的某個整數(shù),代表第rj?個分量必為突變分量。
選擇
最后,進行下一代的選擇,就是在目標個體和實驗個體中,選擇最優(yōu)秀的那個。
xi?(t+1)=argmin(ui?(t),xi?(t))
Python實現(xiàn)
首先,做一個DE算法的迭代函數(shù)
import numpy as np from random import sample, randint, random def evolve(xs,cr,func): # 變異 vs = [] N = len(xs[0]) for _ in range(len(xs)): x = xs.pop(0) r1, r2, r3 = sample(xs, 3) xs.append(x) vs.append(r1 + random()*(r2-r3)) # 交叉 us = [] for i in range(len(xs)): us.append(vs[i] if random() < cr else xs[i]) j = randint(0, N-1) us[i][j] = vs[i][j] # 選擇 xNext = [] for x,u in zip(xs, us): xNext.append(x if func(x)<func(u) else u) return xNext
其中,變異過程要求隨機則取三個不同的個體,并且這個個體不能是當前個體,所以采取的方案是先彈出當前個體,再從里面隨機挑選三個,最后再將當前個體放回去。
交叉過程通過兩個隨機數(shù),來決定下一代的成分。首先是通過浮點型隨機數(shù)來決定是用原有的解還是用新解;然后用一個整型隨機數(shù),來判定采取變異解的元素序號。
然后寫出主循環(huán)
# N為個體數(shù);nDim為解維度;nIter為迭代次數(shù) def de(N, nDim, xRange, cr, func, nIter): xs = [uniRand(*xRange, nDim) for _ in range(N)] for _ in range(nIter): xs = evolve(xs, cr, func) fs = [func(x) for x in xs] xBest = xs[np.argmin(fs)] msg = f"當前最優(yōu)結果為{np.min(fs)},參數(shù)為" msg += ", ".join([f"{x:.4f}" for x in xBest]) print(msg)
測試
最后寫個函數(shù)測試一下
def test(xs): _sum = 0.0 for i in range(len(xs)): _sum = _sum + np.cos((xs[i]*i)/5)*(i+1) return _sum ???????if __name__ == "__main__": de(20, 5, (-5,5), 0.5, test, 100)
最終效果為
>python de.py
當前最優(yōu)結果為-12.864706361994342,參數(shù)為6.2566, 15.7407, 148.7103, 193.4160, 3.9136
到此這篇關于python人工智能算法之差分進化算法的實現(xiàn)的文章就介紹到這了,更多相關python差分進化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
[項目布局配置]Nosql與PythonWeb-Flask框架組合
本文主要描述了怎樣使用輕量級NoSQL數(shù)據(jù)庫與PythonWeb-Flask框架組合來進行項目布局及應用配置,需要的同學可以參考下,希望可以對大家有所進益2021-08-08Python OpenCV 使用滑動條來調(diào)整函數(shù)參數(shù)的方法
這篇文章主要介紹了Python OpenCV 使用滑動條來調(diào)整函數(shù)參數(shù)的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-07-07