python人工智能算法之差分進(jìn)化算法的實(shí)現(xiàn)
遺傳算法: 純Python實(shí)現(xiàn)遺傳算法
DE基于GA,正如進(jìn)化基于遺傳。和遺傳算法相比,差分進(jìn)化引入了差分變異模式,相當(dāng)于開辟了一條嶄新的進(jìn)化路徑。
初始化
首先,初始種群隨機(jī)產(chǎn)生解空間(L,R)范圍的向量

(0)表示第0代。
變異
初始化后,進(jìn)行變異操作,其第t tt代變異向量為
vi?(t)=xr1??(t)+rand⋅(xr2??(t)−xr3??(t))
其中r1?,r2?,r3?為隨機(jī)挑選出的與i ii互不相同的序號(hào),相當(dāng)于隨機(jī)抽選三個(gè)值進(jìn)行基因突變。
交叉
接下來,開始種群繁衍,即種群交叉

其中,r為隨機(jī)數(shù),cr是預(yù)設(shè)的交叉概率因子;rj?為隨機(jī)生成的某個(gè)整數(shù),代表第rj?個(gè)分量必為突變分量。
選擇
最后,進(jìn)行下一代的選擇,就是在目標(biāo)個(gè)體和實(shí)驗(yàn)個(gè)體中,選擇最優(yōu)秀的那個(gè)。
xi?(t+1)=argmin(ui?(t),xi?(t))
Python實(shí)現(xiàn)
首先,做一個(gè)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其中,變異過程要求隨機(jī)則取三個(gè)不同的個(gè)體,并且這個(gè)個(gè)體不能是當(dāng)前個(gè)體,所以采取的方案是先彈出當(dāng)前個(gè)體,再從里面隨機(jī)挑選三個(gè),最后再將當(dāng)前個(gè)體放回去。
交叉過程通過兩個(gè)隨機(jī)數(shù),來決定下一代的成分。首先是通過浮點(diǎn)型隨機(jī)數(shù)來決定是用原有的解還是用新解;然后用一個(gè)整型隨機(jī)數(shù),來判定采取變異解的元素序號(hào)。
然后寫出主循環(huán)
# N為個(gè)體數(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"當(dāng)前最優(yōu)結(jié)果為{np.min(fs)},參數(shù)為"
msg += ", ".join([f"{x:.4f}" for x in xBest])
print(msg)測(cè)試
最后寫個(gè)函數(shù)測(cè)試一下
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
當(dāng)前最優(yōu)結(jié)果為-12.864706361994342,參數(shù)為6.2566, 15.7407, 148.7103, 193.4160, 3.9136
到此這篇關(guān)于python人工智能算法之差分進(jìn)化算法的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)python差分進(jìn)化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python?requests實(shí)現(xiàn)上傳excel數(shù)據(jù)流
這篇文章主要介紹了python?requests實(shí)現(xiàn)上傳excel數(shù)據(jù)流,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
Python中unittest模塊做UT(單元測(cè)試)使用實(shí)例
這篇文章主要介紹了Python中unittest模塊做UT(單元測(cè)試)使用實(shí)例,本文直接給出待測(cè)試的類、測(cè)試類和測(cè)試結(jié)果以及測(cè)試總結(jié),需要的朋友可以參考下2015-06-06
Python3.9環(huán)境搭建RobotFramework的詳細(xì)過程
Robot Framework是一個(gè)基于Python的,可擴(kuò)展的關(guān)鍵字驅(qū)動(dòng)的測(cè)試自動(dòng)化框架,用于端到端驗(yàn)收測(cè)試和驗(yàn)收測(cè)試驅(qū)動(dòng)開發(fā)(ATDD),這篇文章主要介紹了Python3.9環(huán)境搭建RobotFramework的詳細(xì)過程,需要的朋友可以參考下2023-01-01
Python實(shí)現(xiàn)計(jì)算兩個(gè)時(shí)間之間相差天數(shù)的方法
這篇文章主要介紹了Python實(shí)現(xiàn)計(jì)算兩個(gè)時(shí)間之間相差天數(shù)的方法,涉及Python針對(duì)日期時(shí)間的相關(guān)運(yùn)算操作技巧,需要的朋友可以參考下2017-05-05
Python實(shí)現(xiàn)的個(gè)人所得稅計(jì)算器示例
這篇文章主要介紹了Python實(shí)現(xiàn)的個(gè)人所得稅計(jì)算器,涉及Python條件判斷與數(shù)值運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2018-06-06
解決python打開https出現(xiàn)certificate verify failed的問題
這篇文章主要介紹了解決python打開https出現(xiàn)certificate verify failed的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-09-09
Python3中zip()函數(shù)知識(shí)點(diǎn)小結(jié)
本文主要介紹了Python3中zip()函數(shù)知識(shí)點(diǎn)小結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02
Python 比較兩個(gè) CSV 文件的三種方法并打印出差異
這篇文章主要介紹了Python 比較兩個(gè) CSV 文件并打印出差異,本文將討論比較兩個(gè) CSV 文件的各種方法,我們將包括執(zhí)行此操作的最“Pythonic”方式和可幫助簡化此任務(wù)的外部 Python 模塊,需要的朋友可以參考下2023-06-06

