2023亞太杯數學建模思路 - 案例:粒子群算法

文章目錄

  • 1 什么是粒子群算法?
  • 2 舉個例子
  • 3 還是一個例子
  • 算法流程
  • 算法實現
  • 建模資料

# 0 賽題思路

(賽題出來以后第一時間在CSDN分享)

https://blog.csdn.net/dc_sinor?type=blog

1 什么是粒子群算法?

粒子群算法(Particle Swarm Optimization,PSO)是一種模仿鳥群、魚群覓食行為發展起來的一種進化算法。其概念簡單易于編程實現且運行效率高、參數相對較少,應用非常廣泛。粒子群算法于1995年提出,距今(2019)已有24年歷史。
  
  粒子群算法中每一個粒子的位置代表了待求問題的一個候選解。每一個粒子的位置在空間內的好壞由該粒子的位置在待求問題中的適應度值決定。每一個粒子在下一代的位置有其在這一代的位置與其自身的速度矢量決定,其速度決定了粒子每次飛行的方向和距離。在飛行過程中,粒子會記錄下自己所到過的最優位置 P,群體也會更新群體所到過的最優位置G 。粒子的飛行速度則由其當前位置、粒子自身所到過的最優位置、群體所到過的最優位置以及粒子此時的速度共同決定。

在這里插入圖片描述

2 舉個例子

在這里插入圖片描述
在一個湖中有兩個人他們之間可以通信,并且可以探測到自己所在位置的最低點。初始位置如上圖所示,由于右邊比較深,因此左邊的人會往右邊移動一下小船。

在這里插入圖片描述

現在左邊比較深,因此右邊的人會往左邊移動一下小船

一直重復該過程,最后兩個小船會相遇

在這里插入圖片描述
得到一個局部的最優解
在這里插入圖片描述將每個個體表示為粒子。每個個體在某一時刻的位置表示為,x(t),方向表示為v(t)

在這里插入圖片描述

p(t)為在t時刻x個體的自己的最優解,g(t)為在t時刻所有個體的最優解,v(t)為個體在t時刻的方向,x(t)為個體在t時刻的位置

在這里插入圖片描述

下一個位置為上圖所示由x,p,g共同決定了

在這里插入圖片描述

種群中的粒子通過不斷地向自身和種群的歷史信息進行學習,從而可以找到問題的最優解。

3 還是一個例子

粒子群算法是根據鳥群覓食行為衍生出的算法。現在,我們的主角換成是一群鳥。
在這里插入圖片描述

小鳥們的目標很簡單,要在這一帶找到食物最充足的位置安家、休養生息。它們在這個地方的搜索策略如下:
  1. 每只鳥隨機找一個地方,評估這個地方的食物量。
  2. 所有的鳥一起開會,選出食物量最多的地方作為安家的候選點G。
  3. 每只鳥回顧自己的旅程,記住自己曾經去過的食物量最多的地方P。
  4. 每只鳥為了找到食物量更多的地方,于是向著G飛行,但是呢,不知是出于選擇困難癥還是對P的留戀,或者是對G的不信任,小鳥向G飛行時,時不時也向P飛行,其實它自己也不知道到底是向G飛行的多還是向P飛行的多。
  5. 又到了開會的時間,如果小鳥們決定停止尋找,那么它們會選擇當前的G來安家;否則繼續2->3->4->5來尋找它們的棲息地。

在這里插入圖片描述

上圖描述的策略4的情況,一只鳥在點A處,點G是鳥群們找到過的食物最多的位置,點P是它自己去過的食物最多的地點。V是它現在的飛行速度(速度是矢量,有方向和大小),現在它決定向著P和G飛行,但是這是一只佛系鳥,具體飛多少隨緣。如果沒有速度V,它應該飛到B點,有了速度V的影響,它的合速度最終使它飛到了點C,這里是它的下一個目的地。如果C比P好那么C就成了下一次的P,如果C比G好,那么就成了下一次的G。

算法流程

在這里插入圖片描述

算法實現

這里學長用python來給大家演示使用粒子群解函數最優解

在這里插入圖片描述

import numpy as np
import matplotlib.pyplot as plt
import random# 定義“粒子”類
class parti(object):def __init__(self, v, x):self.v = v                    # 粒子當前速度self.x = x                    # 粒子當前位置self.pbest = x                # 粒子歷史最優位置class PSO(object):def __init__(self, interval, tab='min', partisNum=10, iterMax=1000, w=1, c1=2, c2=2):self.interval = interval                                            # 給定狀態空間 - 即待求解空間self.tab = tab.strip()                                              # 求解最大值還是最小值的標簽: 'min' - 最小值;'max' - 最大值self.iterMax = iterMax                                              # 迭代求解次數self.w = w                                                          # 慣性因子self.c1, self.c2 = c1, c2                                           # 學習因子self.v_max = (interval[1] - interval[0]) * 0.1                      # 設置最大遷移速度#####################################################################self.partis_list, self.gbest = self.initPartis(partisNum)                 # 完成粒子群的初始化,并提取群體歷史最優位置self.x_seeds = np.array(list(parti_.x for parti_ in self.partis_list))    # 提取粒子群的種子狀態 ###self.solve()                                                              # 完成主體的求解過程self.display()                                                            # 數據可視化展示def initPartis(self, partisNum):partis_list = list()for i in range(partisNum):v_seed = random.uniform(-self.v_max, self.v_max)x_seed = random.uniform(*self.interval)partis_list.append(parti(v_seed, x_seed))temp = 'find_' + self.tabif hasattr(self, temp):                                             # 采用反射方法提取對應的函數gbest = getattr(self, temp)(partis_list)else:exit('>>>tab標簽傳參有誤:"min"|"max"<<<')return partis_list, gbestdef solve(self):for i in range(self.iterMax):for parti_c in self.partis_list:f1 = self.func(parti_c.x)# 更新粒子速度,并限制在最大遷移速度之內parti_c.v = self.w * parti_c.v + self.c1 * random.random() * (parti_c.pbest - parti_c.x) + self.c2 * random.random() * (self.gbest - parti_c.x)if parti_c.v > self.v_max: parti_c.v = self.v_maxelif parti_c.v < -self.v_max: parti_c.v = -self.v_max# 更新粒子位置,并限制在待解空間之內if self.interval[0] <= parti_c.x + parti_c.v <=self.interval[1]:parti_c.x = parti_c.x + parti_c.velse:parti_c.x = parti_c.x - parti_c.vf2 = self.func(parti_c.x)getattr(self, 'deal_'+self.tab)(f1, f2, parti_c)             # 更新粒子歷史最優位置與群體歷史最優位置def func(self, x):                                                       # 狀態產生函數 - 即待求解函數value = np.sin(x**2) * (x**2 - 5*x)return valuedef find_min(self, partis_list):                                         # 按狀態函數最小值找到粒子群初始化的歷史最優位置parti = min(partis_list, key=lambda parti: self.func(parti.pbest))return parti.pbestdef find_max(self, partis_list):parti = max(partis_list, key=lambda parti: self.func(parti.pbest))   # 按狀態函數最大值找到粒子群初始化的歷史最優位置return parti.pbestdef deal_min(self, f1, f2, parti_):if f2 < f1:                          # 更新粒子歷史最優位置parti_.pbest = parti_.xif f2 < self.func(self.gbest):self.gbest = parti_.x            # 更新群體歷史最優位置def deal_max(self, f1, f2, parti_):if f2 > f1:                          # 更新粒子歷史最優位置parti_.pbest = parti_.xif f2 > self.func(self.gbest):self.gbest = parti_.x            # 更新群體歷史最優位置def display(self):print('solution: {}'.format(self.gbest))plt.figure(figsize=(8, 4))x = np.linspace(self.interval[0], self.interval[1], 300)y = self.func(x)plt.plot(x, y, 'g-', label='function')plt.plot(self.x_seeds, self.func(self.x_seeds), 'b.', label='seeds')plt.plot(self.gbest, self.func(self.gbest), 'r*', label='solution')plt.xlabel('x')plt.ylabel('f(x)')plt.title('solution = {}'.format(self.gbest))plt.legend()plt.savefig('PSO.png', dpi=500)plt.show()plt.close()if __name__ == '__main__':PSO([-9, 5], 'max')

效果
在這里插入圖片描述

建模資料

資料分享: 最強建模資料
在這里插入圖片描述
在這里插入圖片描述

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

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

相關文章

安防監控視頻融合平臺EasyCVR定制化頁面開發

安防監控EasyCVR視頻匯聚平臺基于云邊端智能協同&#xff0c;支持海量視頻的輕量化接入與匯聚、轉碼與處理、全網智能分發、視頻集中存儲等。安防視頻平臺EasyCVR拓展性強&#xff0c;視頻能力豐富&#xff0c;具體可實現視頻監控直播、視頻輪播、視頻錄像、云存儲、回放與檢索…

ConditionObject介紹(二)

1. Condition的signal方法分析 分為了幾個部分&#xff1a; ● 確保執行signal方法的是持有鎖的線程 ● 脫離Condition的隊列 ● 將Node狀態從-2改為0 ● 將Node添加到AQS隊列 ● 為了避免當前Node無法在AQS隊列正常喚醒做了一些判斷和操作 // 線程掛起后&#xff0c;可以基于…

Centos設置nginx開機自啟動設置

Centos設置nginx開機自啟動設置 要設置CentOS中的Nginx開機自啟動&#xff0c;可以按照以下步驟進行操作&#xff1a; 首先&#xff0c;登錄到CentOS服務器上&#xff0c;并以root用戶或具有sudo權限的用戶身份執行以下命令來安裝Nginx&#xff08;如果尚未安裝&#xff09;&a…

字符集合!!!

字符集合&#xff01;&#xff01;&#xff01; 描述 輸入一個字符串&#xff0c;求出該字符串包含的字符集合&#xff0c;按照字母輸入的順序輸出。 數據范圍&#xff1a;輸入的字符串長度滿足 1 \le n \le 100 \1≤n≤100 &#xff0c;且只包含大小寫字母&#xff0c;區分大小…

中國信息通信研究院產業與規劃研究所校招一面、二面內容

本文介紹2024屆秋招中&#xff0c;中國信息通信研究院的數字孿生智慧城市研究員崗位一面、二面的面試基本情況、提問問題等。 10月投遞了中國信息通信研究院的數字孿生智慧城市研究員崗位&#xff0c;所在部門為數字孿生與城市數字化研究部。目前完成了一面與二面&#xff0c;在…

Django 模型和Admin站點管理(三)

一、定義模型 &#xff08;1&#xff09; 創建模型類&#xff0c;必須要繼承自 models.Model from django.db import models# Create your models here. #設計數據庫 #創建模型 class UserModel(models.Model):namemodels.CharField(max_length30) #對應于SQL name varchar(30…

K8s實戰RestartPoliy策略

一、默認策略為Always cmd.yaml apiVersion: v1 kind: Pod metadata:name: myapp-pod labels:app: myapp spec: containers:- name: myapp-container image: busyboxcommand: [sh, -c, echo OK!&& sleep 60]首先我們根據這個yaml創建一個測試的pod 執行命令 kubec…

Vue.observable可以在vue2中給新增的屬性增加響應式

將data中的config數據轉為響應式&#xff1a; data() {return {config: {password1: "YQd^7D1",password2: "YQd^7D2",password3: "YQd^7D3"}}; }, computed: {transformedConfig() {if (this.config) {return Object.keys(this.config).map(k…

C++二維數組中的查找

4. 二維數組中的查找 題目鏈接 牛客網 題目描述 給定一個二維數組,其每一行從左到右遞增排序,從上到下也是遞增排序。給定一個數,判斷這個數是否在該二維數組中。 Consider the following matrix: [[1, 4, 7, 11, 15],[2, 5, 8, 12, 19],[3, 6, 9, 16, 22],[1…

深度之眼Paper帶讀筆記GNN.08.GCN(下)

文章目錄 前言細節四&#xff1a;卷積核介紹圖卷積核初代目圖卷積核二代目契比雪夫多項式例子小結 GCN公式推導 實驗設置和結果分析數據集節點分類任務消息傳遞方式比較運行效率 總結關鍵點創新點啟發點 代碼復現train.pyutil.pymodel.pylayer.py 作業 前言 本課程來自深度之眼…

基于單片機直流電機調速(proteus仿真+源程序)

一、系統方案 1、本設計采用這51單片機作為主控器。 2、轉速值送到液晶1602顯示。 3、按鍵設加減速&#xff0c;開始暫停、正反轉。 二、硬件設計 原理圖如下&#xff1a; 三、單片機軟件設計 1、首先是系統初始化 en0; rw0; write_com(0x01); //lcd初始化 write_com(0x38)…

CQ 社區版 V2.6.0 發布 | SQL閃回、權限看板、新增數據源人大金倉等

前言 HELLO&#xff0c;大家好&#xff0c;又到了 CloudQuery 社區版發版時間&#xff01;本次更新版本為 v2.6.0&#xff0c;亮點多多&#xff0c;我們直入主題一起來看&#xff01; 一、本期亮點 新增 3 種數據源支持 V2.6.0&#xff0c;新增三種國產數據源支持&#xff…

cocos2dx ??Animate3D (一)

3D相關的動畫都是繼承Grid3DAction 本質上是用GirdBase進行創建動畫的小塊。 Shaky3D 晃動特效 // 持續時間(時間過后不會回到原來的樣子) // 整個屏幕被分成幾行幾列 // 晃動的范圍 // z軸是否晃動 static Shaky3D* create(float initWithDuration, const Size& …

內存可見性與指令重排序

文章目錄 內存可見性內存可見性問題代碼演示JMM&#xff08;Java Memory Model&#xff09; 指令重排序指令重排序問題代碼演示指令重排序分析 volatile關鍵字volatile 保證內存可見性 & 禁止指令重排序volatile 不保證原子性 在上一節介紹線程安全問題的過程中&#xff0c…

2023亞太杯數學建模B題思路 - 玻璃溫室中的微氣候法規

# 1 賽題 問題B 玻璃溫室中的微氣候法規 溫室作物的產量受到各種氣候因素的影響&#xff0c;包括溫度、濕度和風速[1]。其中&#xff0c;適 宜的溫度和風速是植物生長[2]的關鍵。為了調節玻璃溫室內的溫度、風速等氣候因素 , 溫室的設計通常采用帶有溫室風扇的通風系統&#x…

實驗4.數據全量、增量、比較更新

【實驗目的】 1.利用Kettle的“表輸入”&#xff0c;“表輸入出”&#xff0c;”JavaScript代碼”組件&#xff0c;實現數據全量更新。 2.熟練掌握“JavaScript代碼”&#xff0c;“表輸入”&#xff0c;“表輸入出”組件的使用&#xff0c;實現數據全量更新。 【實驗原理】 …

MATLAB算法實戰應用案例精講-【圖像處理】圖像縮放

目錄 前言 知識儲備 MATLAB圖像處理函數 數字數字圖像增強 數字數字圖像的變換

二級指針

*代表指針變量。int*為p的類型。故pp第一個*表示pp為指針int** pp&#xff0c;指向p的二級指針。 p中儲存a的地址&#xff0c;pp中儲存p的地址。 打印&#xff0c;printf中**pp的表示&#xff1a;pp中儲存的是p的地址&#xff0c;第一個*解引用地址p表示p的內容&#xff0c;p的…

Pickcode:教孩子們編碼的新視覺語言

Pickcode 通過視覺課程、聊天機器人、游戲和繪圖來教授編程。 Pickcode 是一種新的語言和編輯器&#xff0c;可以直觀地指導用戶編寫代碼來制作聊天機器人、動畫圖畫和游戲。Pickcode 旨在讓用戶在學習更高級的語言之前能夠充滿信心地開始學習編碼。 Pickcode 可視化編程語言…

回歸算法優化過程推導

假設存在一個數據集&#xff0c;包含工資、年齡及貸款額度三個維度的數據。我們需要根據這個數據集進行建模&#xff0c;從而在給定工資和年齡的情況下&#xff0c;實現對貸款額度的預測。其中&#xff0c;工資和年齡是模型構建時的兩個特征&#xff0c;額度是模型輸出的目標值…