智能優化算法之粒子群模型(含python案例代碼)

粒子群優化模型概述

????????粒子群優化(Particle Swarm Optimization,簡稱PSO)是一種基于群體智能的優化算法,最早由美國社會心理學家James KennedyRussell Eberhart1995年提出。PSO的靈感來自鳥群和魚群等自然界群體行為的觀察。

????????PSO的基本思想是通過模擬群體中個體的協作和信息共享來尋找問題的最優解。在PSO中,個體被稱為“粒子”,每個粒子代表搜索空間中的一個潛在解。這些粒子通過在搜索空間中移動來尋找最優解,其移動的方向和速度受到個體經驗和群體經驗的影響。

PSO的基本模型

  1. 粒子表示: 每個粒子都有一個位置向量和一個速度向量,它們分別表示在搜索空間中的當前位置和移動的速度。
  2. 適應度函數: 問題的目標函數被定義為適應度函數,粒子的目標是最小化或最大化這個適應度函數。
  3. 個體最優解: 每個粒子都會記住自己在搜索空間中找到的最好位置,稱為個體最優解。
  4. 全局最優解: 在整個粒子群中,會有一個粒子記住全局最優解,即整個群體中適應度最好的位置。
  5. 更新規則: 粒子根據一定的更新規則(通常包括個體經驗和群體經驗)來調整自己的位置和速度。

更新規則的一般形式為:

其中:

????????這個算法在不同問題上取得了很好的效果,特別是在連續優化問題中。在使用PSO時,需要根據具體問題來調整算法的參數,例如粒子數目、學習因子、慣性權重等。

什么時候用粒子群優化?

????????粒子群優化(Particle Swarm Optimization,PSO)是一種用于求解優化問題的群體智能算法。PSO適用于多種優化問題,但其特定的優點和適用場景使得它在某些情況下更為合適。

????????連續優化問題: PSO主要用于求解連續優化問題,其中目標函數是連續可導的。這包括了許多工程和科學應用,如機器學習模型的參數優化、神經網絡權重的調整、信號處理、控制系統設計等。

????????無約束問題: PSO對問題的約束較為寬松,因此適用于無約束優化問題。如果問題具有復雜的約束條件,可能需要對PSO進行改進或選擇其他更適合處理約束問題的優化算法。

????????高維空間: PSO在高維搜索空間中表現良好。對于具有大量變量的問題,PSO能夠有效地探索搜索空間,找到全局最優解。

????????全局優化: PSO的群體協作機制使其對全局優化問題具有較好的收斂性。它有助于避免陷入局部最優解,尤其在搜索空間復雜或存在多個局部最優解的情況下。

????????簡單實現: PSO的實現相對簡單,不需要太多的參數調整。這使得它成為一種易于使用和理解的優化算法,特別適用于初學者或對算法細節不太敏感的應用場景。

????????動態環境: PSO對于動態環境中的優化問題具有較好的適應性。由于其實時更新的特性,PSO能夠快速適應目標函數或搜索空間的變化。

????????盡管PSO在許多情況下表現良好,但在某些問題上可能不如其他優化算法,因此在選擇優化算法時,應根據具體問題的特性、算法的優點和缺點做出合理的選擇。

案例代碼1

????????以下是一個簡單的粒子群優化算法的 Python 示例代碼。這個例子是一個簡單的單變量優化問題,目標是最小化函數f(x)=x^2+5.

import random# 粒子群優化算法
def particle_swarm_optimization(obj_func, num_particles, num_iterations):# 初始化粒子群particles = [{'position': random.uniform(-10, 10),'velocity': random.uniform(-1, 1),'pbest_position': 0,'pbest_value': float('inf')} for _ in range(num_particles)]# 尋找全局最優解的粒子gbest_particle = min(particles, key=lambda p: obj_func(p['position']))# PSO參數inertia_weight = 0.5cognitive_coefficient = 1.5social_coefficient = 1.5# 開始優化迭代for _ in range(num_iterations):for particle in particles:# 更新速度和位置r1, r2 = random.uniform(0, 1), random.uniform(0, 1)particle['velocity'] = (inertia_weight * particle['velocity'] +cognitive_coefficient * r1 * (particle['pbest_position'] - particle['position']) +social_coefficient * r2 * (gbest_particle['pbest_position'] - particle['position']))particle['position'] += particle['velocity']# 更新個體最優解current_value = obj_func(particle['position'])if current_value < particle['pbest_value']:particle['pbest_value'] = current_valueparticle['pbest_position'] = particle['position']# 更新全局最優解if current_value < gbest_particle['pbest_value']:gbest_particle = {'pbest_position': particle['pbest_position'],'pbest_value': particle['pbest_value']}return gbest_particle['pbest_position']# 示例問題:最小化函數 f(x) = x^2 + 5
def objective_function(x):return x**2 + 5# 運行粒子群優化算法
best_solution = particle_swarm_optimization(objective_function, num_particles=30, num_iterations=100)# 打印結果
print("最優解:", best_solution)
print("最優解對應的目標函數值:", objective_function(best_solution))

????????這只是一個簡單的示例,實際應用中可能需要根據問題的復雜性進行更多的調整和改進。在實際問題中,需要調整粒子數量、迭代次數、參數等來獲得更好的性能。

案例代碼2

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3Ddef fit_fun(x):  # 適應函數return sum(100.0 * (x[0][1:] - x[0][:-1] ** 2.0) ** 2.0 + (1 - x[0][:-1]) ** 2.0)class Particle:# 初始化def __init__(self, x_max, max_vel, dim):self.__pos = np.random.uniform(-x_max, x_max, (1, dim))  # 粒子的位置self.__vel = np.random.uniform(-max_vel, max_vel, (1, dim))  # 粒子的速度self.__bestPos = np.zeros((1, dim))  # 粒子最好的位置self.__fitnessValue = fit_fun(self.__pos)  # 適應度函數值def set_pos(self, value):self.__pos = valuedef get_pos(self):return self.__posdef set_best_pos(self, value):self.__bestPos = valuedef get_best_pos(self):return self.__bestPosdef set_vel(self, value):self.__vel = valuedef get_vel(self):return self.__veldef set_fitness_value(self, value):self.__fitnessValue = valuedef get_fitness_value(self):return self.__fitnessValueclass PSO:def __init__(self, dim, size, iter_num, x_max, max_vel, tol, best_fitness_value=float('Inf'), C1=2, C2=2, W=1):self.C1 = C1self.C2 = C2self.W = Wself.dim = dim  # 粒子的維度self.size = size  # 粒子個數self.iter_num = iter_num  # 迭代次數self.x_max = x_maxself.max_vel = max_vel  # 粒子最大速度self.tol = tol  # 截至條件self.best_fitness_value = best_fitness_valueself.best_position = np.zeros((1, dim))  # 種群最優位置self.fitness_val_list = []  # 每次迭代最優適應值# 對種群進行初始化self.Particle_list = [Particle(self.x_max, self.max_vel, self.dim) for i in range(self.size)]def set_bestFitnessValue(self, value):self.best_fitness_value = valuedef get_bestFitnessValue(self):return self.best_fitness_valuedef set_bestPosition(self, value):self.best_position = valuedef get_bestPosition(self):return self.best_position# 更新速度def update_vel(self, part):vel_value = self.W * part.get_vel() + self.C1 * np.random.rand() * (part.get_best_pos() - part.get_pos()) \+ self.C2 * np.random.rand() * (self.get_bestPosition() - part.get_pos())vel_value[vel_value > self.max_vel] = self.max_velvel_value[vel_value < -self.max_vel] = -self.max_velpart.set_vel(vel_value)# 更新位置def update_pos(self, part):pos_value = part.get_pos() + part.get_vel()part.set_pos(pos_value)value = fit_fun(part.get_pos())if value < part.get_fitness_value():part.set_fitness_value(value)part.set_best_pos(pos_value)if value < self.get_bestFitnessValue():self.set_bestFitnessValue(value)self.set_bestPosition(pos_value)def update_ndim(self):for i in range(self.iter_num):for part in self.Particle_list:self.update_vel(part)  # 更新速度self.update_pos(part)  # 更新位置self.fitness_val_list.append(self.get_bestFitnessValue())  # 每次迭代完把當前的最優適應度存到列表print('第{}次最佳適應值為{}'.format(i, self.get_bestFitnessValue()))if self.get_bestFitnessValue() < self.tol:breakreturn self.fitness_val_list, self.get_bestPosition()if __name__ == '__main__':# test 香蕉函數pso = PSO(4, 5, 10000, 30, 60, 1e-4, C1=2, C2=2, W=1)fit_var_list, best_pos = pso.update_ndim()print("最優位置:" + str(best_pos))print("最優解:" + str(fit_var_list[-1]))plt.plot(range(len(fit_var_list)), fit_var_list, alpha=0.5)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/214625.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/214625.shtml
英文地址,請注明出處:http://en.pswp.cn/news/214625.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux驅動入門——編寫第一個驅動

目錄 前言 驅動入門知識 1.APP 打開的文件在內核中如何表示 2.打開字符設備節點時&#xff0c;內核中也有對應的 struct file 編寫 Hello 驅動程序步驟 1.流程介紹 2.驅動代碼&#xff1a; 3.應用層代碼&#xff1a; 4.本驅動程序的 Makefile 內容&#xff1a; 5.上機…

4fiddler抓包工具的使用

一、定義 1.1 抓包的定義 說明&#xff1a;客戶端向服務器發送請求以及服務器響應客戶端的請求&#xff0c;都是以數據包來傳遞的。 抓包(packet capture)&#xff1a;通過工具攔截客戶端與服務器交互的數據包 1.2 fiddler的介紹 Fiddler是一個http協議調試代理工具&#…

Java程序設計基礎 - 課程概述

文章目錄 一、程序員最具共性的心理特征二、Java開發工程師的崗位要求(一)素質和職業道德需求(二)崗位能力需求統計三、針對Java工程師崗位需求的課程目標(一)熟練掌握Java編程語言,掌握編程技能(二)精通使用集成開發工具Eclipse或IntelliJ IDEA(三)需要將“用戶體驗…

市場全局復盤 20231208

一、板塊成交額排名&#xff1a; 資金流入前三個板塊K 線&#xff1a; 行業成交額排名&#xff1a; 個股資金流入排名&#xff1a; select 成交額排名 ,近日指標提示 ,短線主題 ,漲停分析,CODE,名稱,DDE大單凈量,現價,量比,連板天,周漲停,月漲停,年漲停天,連漲天,…

【每日一題】—— B. StORage room(Codeforces Round 912 (Div. 2))(位操作符)

&#x1f30f;博客主頁&#xff1a;PH_modest的博客主頁 &#x1f6a9;當前專欄&#xff1a;每日一題 &#x1f48c;其他專欄&#xff1a; &#x1f534; 每日反芻 &#x1f7e1; C跬步積累 &#x1f7e2; C語言跬步積累 &#x1f308;座右銘&#xff1a;廣積糧&#xff0c;緩稱…

工業傳感器

工業傳感器 電子元器件百科 文章目錄 工業傳感器前言一、工業傳感器是什么二、工業傳感器的類別三、工業傳感器的應用實例四、工業傳感器的作用原理總結前言 工業傳感器的應用可以幫助提高工業過程的效率、安全性和可靠性,實現工業自動化和智能化。 一、工業傳感器是什么 工…

使用阿里云國際CDN加速后網站無法訪問的排查步驟

使用阿里云國際CDN加速后網站無法訪問的排查步驟&#xff0c;下面是一些常見的問題&#xff0c;以&#xff1a;www.c.9he.com為例&#xff0c;如果解決不了來信服務器廠商解決。 檢查CDN訪問異常是CDN節點的問題還是源站問題 如果是源站訪問異常&#xff0c;請直接排查源站服務…

Faster R-CNN

Faster R-CNN是作者Ross Girshick繼Fast R-CNN后的又一力作。同樣使用VGG16作推理速度在GPU上達到5fps(包括候選區域的生成)&#xff0c;準確率為網絡的backbone&#xff0c;也有進一步的提升。在2015年的ILSVRC以及COCO競賽中獲得多個項目的第一名。 算法流程 右邊這部分和Fa…

算法Day27 身材管理(三維背包)

身材管理&#xff08;三維背包&#xff09; Description Input Output Sample 代碼 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int n scanner.nextInt(); // 輸入n的值int money sca…

KaiOS 運營商相關文件operator_variant_manager.js代碼功能和調試

gaia/apps/system/js/operator_variant_manager.js at master mozilla-b2g/gaia GitHub js文件接口功能 No 接口/常量 功能 1 OperatorVariantManager var OperatorVariantManager function(core) 2 OperatorVariantManager.IMPORTS OperatorVariantManager.I…

搜集怎么繪制三維曲線和曲面?

1、針對函數對象是單一變量、兩個函數的情況。用plot3函數&#xff1b;&#xff08;三維曲線&#xff09; 看一下matlab官方的例子&#xff1a; t 0:pi/50:10*pi; st sin(t); ct cos(t); plot3(st,ct,t) 繪制出來的曲線&#xff1a; 幾個比較關鍵的點&#xff1a; &…

【Marp】基于Markdown-Marp快速制作PPT

【Marp】基于Markdown-Marp快速制作PPT 文章目錄 【Marp】基于Markdown-Marp快速制作PPT零、參考資料一、Marp基本語法&#xff08;創建分頁&#xff0c;排版圖片&#xff0c;更換主題&#xff0c;Marp擴展指令修改樣式&#xff09;1、創建新的PPT頁面2、插入圖片 & 排版圖…

小功能實現(二十)分類統計,Map取值自增

前言 從Map取值&#xff0c;根據獲取的類型進行統計&#xff0c;若有則1&#xff0c;若無則新增新的分類純屬靈機一動 步驟 for (String str : stringList) {int counttypeMap.getOrDefault(str,0);typeMap.put(resultList[2],count); }

解決刪除文件后 WSL2 磁盤空間不釋放的問題

查看 Linux distributions 打開 PowerShell 并執行如下命令&#xff1a; wsl -l -v 搜索并找到 ext4.vhdx 文件 我的 ext4.vhdx 文件如下&#xff1a; C:\Users\xxx\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu22.04LTS_79rhkp1fndgsc\LocalState\ext4.vhdx 由于…

vue中yarn install超時問題

囚籠中的網絡固然可以穩定局勢&#xff0c;不讓猴子們得以隨時醒悟&#xff01;給你吃的你就好好吃&#xff0c;不要有其他的翻然醒悟的時刻。無論如何&#xff0c;愚蠢的活著也是一種幸福&#xff0c;聽著那些耐心尋味的統計幸福指數&#xff0c;我們不由的幸福的一批。。 最…

軟件開發流程分析

軟件開發流程分析 相關概念1 原型設計2 產品設計3 交互設計4 代碼實現詳細步驟 相關概念 前端&#xff1a;自研API&#xff0c;調用第三放API 后端&#xff1a;自研API&#xff0c;第三方API 數據庫&#xff1a;Mysql&#xff0c;數據采集&#xff0c;數據遷移 服務器&#xf…

算法與數據結構--最短路徑Dijkstra算法

題目&#xff1a; 算法與數據結構實驗題 10.20 迷路 ★實驗任務 學長經常迷路&#xff0c;現在他又遇到問題了&#xff0c;需要求救。 假設他有一張地圖&#xff0c;上面有N個點&#xff0c;M條路&#xff0c;他現在在編號為S的地方&#xff0c;想要去編號為E的地方&#x…

Linux中的幾個重要指令

關於 Process 處理的指令 1. ps ps 是用來顯示目前你的 process 或系統 processes 的狀況。 以下列出比較常用的參數: 其選項說明如下: -a 列出包括其他 users 的 process 狀況。 -u 顯示 user - oriented 的 process 狀況 。 -x 顯示包括沒有 terminal 控制的 process 狀…

程序員養生指南。。。

【關注微信公眾號&#xff1a;跟強哥學SQL&#xff0c;回復“筆試”免費領取大廠SQL筆試題。】 作為一個程序員&#xff0c;確實需要特別關注健康問題。長時間的熬夜加班、久坐不動等工作習慣可能會導致身體亞健康狀態。以下是一些養生延壽的建議&#xff1a; 1. 定期運動&…

數據結構:第13關:查找兩個單詞鏈表共同后綴的起始結點

任務描述編程要求 輸入輸出測試說明來源 任務描述 本關任務&#xff1a;假定采用帶頭結點的單鏈表保存單詞&#xff0c;當兩個單詞有相同的后綴時&#xff0c;則可共享相同的后綴空間。 例如&#xff0c;“loading”和“being”的存儲映像如下圖所示&#xff1a; 設str1和str2…