日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

粒子群算法实例-求解函数极值

發(fā)布時間:2025/3/20 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 粒子群算法实例-求解函数极值 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前面介紹了《粒子群算法》的基本原理,這里結(jié)合實例,看看粒子群算法是怎樣解決實際問題的。采用過的函數(shù)和《遺傳算法實例》中的一樣:

f(x)=x+10sin5x+7cos4x

求其在區(qū)間[-10,10]之間的最大值。下面是該函數(shù)的圖像:

在本例中,我們可以把x作為個體的染色體,函數(shù)值f(x)作為其適應(yīng)度值,適應(yīng)度越大,個體越優(yōu)秀,最大的適應(yīng)度就是我們要求的最大值。
直接看代碼吧(直接看注釋就能看懂)。

# -*- coding: utf-8 -*-import numpy as np# 粒子(鳥) class particle:def __init__(self):self.pos = 0 # 粒子當(dāng)前位置self.speed = 0self.pbest = 0 # 粒子歷史最好位置class PSO:def __init__(self):self.w = 0.5 # 慣性因子self.c1 = 1 # 自我認(rèn)知學(xué)習(xí)因子self.c2 = 1 # 社會認(rèn)知學(xué)習(xí)因子self.gbest = 0 # 種群當(dāng)前最好位置self.N = 20 # 種群中粒子數(shù)量self.POP = [] # 種群self.iter_N = 100 # 迭代次數(shù)# 適應(yīng)度值計算函數(shù)def fitness(self, x):return x + 10 * np.sin(5 * x) + 7 * np.cos(4 * x)# 找到全局最優(yōu)解def g_best(self, pop):for bird in pop:if bird.fitness > self.fitness(self.gbest):self.gbest = bird.pos# 初始化種群def initPopulation(self, pop, N):for i in range(N):bird = particle()bird.pos = np.random.uniform(-10, 10)bird.fitness = self.fitness(bird.pos)bird.pbest = bird.fitnesspop.append(bird)# 找到種群中的最優(yōu)位置self.g_best(pop)# 更新速度和位置def update(self, pop):for bird in pop:# 速度更新speed = self.w * bird.speed + self.c1 * np.random.random() * (bird.pbest - bird.pos) + self.c2 * np.random.random() * (self.gbest - bird.pos)# 位置更新pos = bird.pos + speedif -10 < pos < 10: # 必須在搜索空間內(nèi)bird.pos = posbird.speed = speed# 更新適應(yīng)度bird.fitness = self.fitness(bird.pos)# 是否需要更新本粒子歷史最好位置if bird.fitness > self.fitness(bird.pbest):bird.pbest = bird.pos# 最終執(zhí)行def implement(self):# 初始化種群self.initPopulation(self.POP, self.N)# 迭代for i in range(self.iter_N):# 更新速度和位置self.update(self.POP)# 更新種群中最好位置self.g_best(self.POP)pso = PSO() pso.implement()for ind in pso.POP:print("x=", ind.pos, "f(x)=", ind.fitness)

某一次執(zhí)行中生成的種群結(jié)果:
x= 7.44390041845 f(x)= 2.34326279816
x= 9.48378207609 f(x)= 13.3821268397
x= 6.3672261374 f(x)= 17.0548851104
x= 7.85674414126 f(x)= 24.855362869
x= 7.85674414216 f(x)= 24.855362869
x= 7.85674414201 f(x)= 24.855362869
x= 7.85674414185 f(x)= 24.855362869
x= 8.02319542929 f(x)= 20.1093330013
x= 7.85674414327 f(x)= 24.855362869
x= 7.85674414414 f(x)= 24.855362869
x= 7.85674414288 f(x)= 24.855362869
x= 7.85674414296 f(x)= 24.855362869
x= 7.85674414178 f(x)= 24.855362869
x= 7.85674414174 f(x)= 24.855362869
x= 7.8567441494 f(x)= 24.855362869
x= 6.44588532539 f(x)= 19.2820411821
x= 7.85674414041 f(x)= 24.855362869
x= 9.93067628809 f(x)= 1.12241685006
x= 7.8567441425 f(x)= 24.855362869
x= 8.81867117742 f(x)= 4.6512749143
得到的最優(yōu)解結(jié)果為:
X=7.85674414174 f(x)=24.855362869
從圖像上看符合要求。其結(jié)果圖像如下,紅色點表示種群中個體的位置。

# 繪圖代碼 import matplotlib.pyplot as plt def func(x):return x + 10 * np.sin(5 * x) + 7 * np.cos(4 * x)x = np.linspace(-10, 10, 10000) y = func(x)scatter_x = np.array([ind.pos for ind in pso.POP]) scatter_y = np.array([ind.fitness for ind in pso.POP]) plt.plot(x, y) plt.scatter(scatter_x, scatter_y, c='r') plt.show()

總結(jié)

以上是生活随笔為你收集整理的粒子群算法实例-求解函数极值的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。