摘要:遺傳算法回顧核心算子其中代表第個(gè)粒子的速度,代表慣性權(quán)值和表示學(xué)習(xí)參數(shù),表示在之間的隨機(jī)數(shù)代表第個(gè)粒子搜索到的歷史最優(yōu)值代表整個(gè)集群搜索到的最優(yōu)值代表第個(gè)粒子的當(dāng)前位置。
導(dǎo)言
粒子群PSO算法相比遺傳算法實(shí)現(xiàn)會(huì)簡(jiǎn)單一點(diǎn),核心就是根據(jù)算子更新個(gè)體歷史最優(yōu)和全局最優(yōu)。粒子群用的不多,給我的感覺(jué)是收斂很快的一種算法。這種算法較為容易陷入局部最優(yōu),若問(wèn)題具有欺騙性(具有多個(gè)假峰,且優(yōu)化資源集中在其中一個(gè)峰上)就不容易找到全局最優(yōu)。學(xué)院有個(gè)學(xué)長(zhǎng)改進(jìn)PSO發(fā)了篇論文,好像是將(全局最優(yōu)-個(gè)體最優(yōu))加入到算子當(dāng)中,這會(huì)一定程度上跳出局部最優(yōu)。
遺傳算法回顧
核心算子:
v[i] = w * v[i] + c1 * rand() * (pbest[i] - present[i]) + c2 * rand() * (gbest - present[i]) present[i] = present[i] + v[i]
其中v[i]代表第i個(gè)粒子的速度,w代表慣性權(quán)值,c1和c2表示學(xué)習(xí)參數(shù),rand()表示在0-1之間的隨機(jī)數(shù),pbest[i]代表第i個(gè)粒子搜索到的歷史最優(yōu)值,gbest代表整個(gè)集群搜索到的最優(yōu)值,present[i]代表第i個(gè)粒子的當(dāng)前位置。
算法思想模擬一群鳥(niǎo)尋找食物的過(guò)程,每個(gè)鳥(niǎo)就是PSO中的粒子,也就是我們需要求解問(wèn)題的可能解,這些鳥(niǎo)在尋找食物的過(guò)程中,會(huì)不停改變地自己在空中飛行的位置與速度。改變的方向會(huì)根據(jù)個(gè)體的歷史最優(yōu)p_best和全局最優(yōu)g_best來(lái)做出改變,也就是上面的核心算子。可以比喻為每只鳥(niǎo)會(huì)一定程度上追隨每次迭代中找食物最厲害的那只鳥(niǎo),這里的找食物最厲害就是能最大可能解出目標(biāo)函數(shù)。
算法過(guò)程:還是解決遺傳算法當(dāng)中的簡(jiǎn)單單目標(biāo)問(wèn)題,求解函數(shù)f的最大值
max f (x1, x2) = 21.5 + x1·sin(4 pi x1) + x2·sin(20 pi x2) s. t. -3.0 <= x1 <= 12.1 4.1 <= x2 <= 5.8
種群初始化:
import random import numpy as np pop_size = 100 dec_num = 2 #變量個(gè)數(shù) dec_min_val = (-3, 4.1) #變量約束范圍 dec_max_val = (12.1, 5.8) pop_x = np.zeros((pop_size, dec_num)) # 所有粒子的位置 pop_v = np.zeros((pop_size, dec_num)) # 所有粒子的速度 p_best = np.zeros((pop_size, dec_num)) # 個(gè)體經(jīng)歷的最佳位置 def init_population(pop_size, dec_num, dec_min_val, dec_max_val, pop_x, pop_v, p_best): for i in range(pop_size): for j in range(dec_num): pop_x[i][j] = random.uniform(dec_min_val[j], dec_max_val[j]) pop_v[i][j] = random.uniform(0, 1) p_best[i] = pop_x[i] # p_best存儲(chǔ)個(gè)體的歷史最優(yōu)
迭代更新:
import random import matplotlib.pyplot as plt from Initialization import init_population max_gen = 100 w = 0.4 # 自身權(quán)重因子 c1 = 2 # 學(xué)習(xí)因子 c2 = 2 g_best = np.zeros((1, dec_num)) # 全局最佳個(gè)體的位置 popobj = [] def fitness(s): #個(gè)體適應(yīng)值計(jì)算 x1 = s[0] x2 = s[1] y = 21.5 + x1 * math.sin(4 * math.pi * x1) + x2 * math.sin(20 * math.pi * x2) return y if __name__ == "__main__": init_population(pop_size, dec_num, dec_min_val, dec_max_val, pop_x, pop_v, p_best) temp = -1 # ------------更新全局最優(yōu)------------- for i in range(pop_size): fit = fitness(p_best[i]) if fit > temp: g_best = p_best[i] temp = fit # ------------迭代優(yōu)化------------- for i in range(max_gen): for j in range(pop_size): # ----------------更新個(gè)體位置和速度----------------- pop_v[j] = w * pop_v[j] + c1 * random.uniform(0, 1) * (p_best[j] - pop_x[j]) + c2 * random.uniform(0, 1) * (g_best - pop_x[j]) pop_x[j] = pop_x[j] + pop_v[j] for k in range(dec_num): # 越界保護(hù) if pop_x[j][k] < dec_min_val[k]: pop_x[j][k] = dec_min_val[k] if pop_x[j][k] > dec_max_val[k]: pop_x[j][k] = dec_max_val[k] # -----------------更新p_best和g_best----------------- if fitness(pop_x[j]) > fitness(p_best[j]): p_best[j] = pop_x[j] if fitness(pop_x[j]) > fitness(g_best): g_best = pop_x[j] popobj.append(fitness(g_best)) print(fitness(g_best)) # -------------------畫(huà)圖-------------------- plt.figure(1) plt.title("Figure1") plt.xlabel("iterators", size=14) plt.ylabel("fitness", size=14) t = [t for t in range(0, 100)] plt.plot(t, popobj, color="b", linewidth=3) plt.show()
結(jié)果和遺傳算法差不多,但速度是快了,不需要像遺傳算法那樣交叉變異,另一方面粒子群的參數(shù)設(shè)置有點(diǎn)多。
Github源碼地址:https://github.com/kugua233/P...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/41639.html
摘要:自話粒子群算法超簡(jiǎn)單實(shí)例自話遺傳算法帶實(shí)例簡(jiǎn)單蟻群算法模擬實(shí)驗(yàn)這個(gè)模擬實(shí)驗(yàn)比較簡(jiǎn)單,并沒(méi)有對(duì)信息素路徑選擇等做優(yōu)化,主要是方便大家查看簡(jiǎn)單的螞蟻系統(tǒng)能夠帶來(lái)一個(gè)什么樣的效果詳細(xì)說(shuō)明見(jiàn)后文。 原文地址:http://breezedust.com/2016/07/10/zi-hua-yi-qun-suan-fa-jian-dan-mo-ni-shi-li/ 這算是填3年前的一個(gè)坑吧,已經(jīng)懶...
摘要:如果將小磁針看作神經(jīng)元,磁針狀態(tài)看作激發(fā)與抑制,也可以用來(lái)構(gòu)建深度學(xué)習(xí)的模型,或者玻爾茲曼機(jī)。這么多的基礎(chǔ)理論,展現(xiàn)了深度學(xué)習(xí)中的無(wú)處不在的物理本質(zhì)。 最近朋友圈里有大神分享薛定諤的滾,一下子火了,當(dāng)一個(gè)妹子叫你滾的時(shí)候,你永遠(yuǎn)不知道她是在叫你滾還是叫你過(guò)來(lái)抱緊,這確實(shí)是一種十分糾結(jié)的狀態(tài),而薛定諤是搞不清楚的,他連自己的貓是怎么回事還沒(méi)有弄清楚。雖然人們對(duì)于薛定諤頭腦中那只被放射性物質(zhì)殘害...
摘要:深度學(xué)習(xí)方法是否已經(jīng)強(qiáng)大到可以使科學(xué)分析任務(wù)產(chǎn)生最前沿的表現(xiàn)在這篇文章中我們介紹了從不同科學(xué)領(lǐng)域中選擇的一系列案例,來(lái)展示深度學(xué)習(xí)方法有能力促進(jìn)科學(xué)發(fā)現(xiàn)。 深度學(xué)習(xí)在很多商業(yè)應(yīng)用中取得了前所未有的成功。大約十年以前,很少有從業(yè)者可以預(yù)測(cè)到深度學(xué)習(xí)驅(qū)動(dòng)的系統(tǒng)可以在計(jì)算機(jī)視覺(jué)和語(yǔ)音識(shí)別領(lǐng)域超過(guò)人類水平。在勞倫斯伯克利國(guó)家實(shí)驗(yàn)室(LBNL)里,我們面臨著科學(xué)領(lǐng)域中最具挑戰(zhàn)性的數(shù)據(jù)分析問(wèn)題。雖然商業(yè)...
閱讀 932·2023-04-25 23:40
閱讀 3712·2021-11-22 15:22
閱讀 3551·2021-10-09 09:44
閱讀 3405·2021-09-23 11:52
閱讀 1260·2021-09-22 15:43
閱讀 789·2021-09-10 10:51
閱讀 2210·2021-09-06 15:02
閱讀 3204·2021-09-06 15:02