国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

尋優(yōu)算法之粒子群

wangshijun / 1725人閱讀

摘要:遺傳算法回顧核心算子其中代表第個(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

相關(guān)文章

  • 自話蟻算法(帶簡(jiǎn)單模擬實(shí)驗(yàn))

    摘要:自話粒子群算法超簡(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)懶...

    binta 評(píng)論0 收藏0
  • 薛定諤的滾與深度學(xué)習(xí)中的物理

    摘要:如果將小磁針看作神經(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ì)殘害...

    gnehc 評(píng)論0 收藏0
  • 科學(xué)領(lǐng)域中的深度學(xué)習(xí)一覽

    摘要:深度學(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è)...

    zhou_you 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<