1. 程式人生 > >粒子群演算法的matlab實現(二)

粒子群演算法的matlab實現(二)

      上一次的部落格中我將粒子群的搜尋過程可視化了,並將其轉存為了gif格式檔案,這個過程我先在這裡給大家講一下:

1.首先pause(),是在每次繪圖之後暫停一段時間,單位是秒,再進行下一次繪圖;

2.而當要轉存為gif檔案時,這其實就是一種無聲的視訊檔案,因此我們需要每一幀的影象,可以用pause,但是用drawnow更好,它的原理是保持當前視窗不變,繼續下一次繪圖。

      因此將轉存為gif的步驟加入到之前的程式碼中就是:

clc;clear;close all;
%% 初始化種群
f= @(x)x .* sin(x) .* cos(2 * x) - 2 * x .* sin(3 * x); % 函式表示式
N = 50;                         % 初始種群個數
d = 1;                          % 空間維數
ger = 100;                      % 最大迭代次數     
limit = [0, 20];                % 設定位置引數限制
vlimit = [-1, 1];               % 設定速度限制
w = 0.8;                        % 慣性權重
c1 = 0.5;                       % 自我學習因子
c2 = 0.5;                       % 群體學習因子 
for i = 1:d
    x = limit(i, 1) + (limit(i, 2) - limit(i, 1)) * rand(N, d);%初始種群的位置
end
v = rand(N, d);                  % 初始種群的速度
xm = x;                          % 每個個體的歷史最佳位置
ym = zeros(1, d);                % 種群的歷史最佳位置
fxm = zeros(N, 1);               % 每個個體的歷史最佳適應度
fym = -inf;                      % 種群歷史最佳適應度
%% 群體更新
iter = 1;
record = zeros(ger, 1);          % 記錄器
while iter <= ger
     fx = f(x) ; % 個體當前適應度   
     for i = 1:N      
        if fxm(i) < fx(i)
            fxm(i) = fx(i);     % 更新個體歷史最佳適應度
            xm(i,:) = x(i,:);   % 更新個體歷史最佳位置
        end 
     end
if fym < max(fxm)
        [fym, nmax] = max(fxm);   % 更新群體歷史最佳適應度
        ym = xm(nmax, :);      % 更新群體歷史最佳位置
 end
    v = v * w + c1 * rand * (xm - x) + c2 * rand * (repmat(ym, N, 1) - x);% 速度更新
    % 邊界速度處理
    v(v > vlimit(2)) = vlimit(2);
    v(v < vlimit(1)) = vlimit(1);
    x = x + v;% 位置更新
    % 邊界位置處理
    x(x > limit(2)) = limit(2);
    x(x < limit(1)) = limit(1);
    record(iter) = fym;%最大值記錄
    x0 = 0 : 0.01 : 20;
    plot(x0, f(x0), 'b-', x, f(x), 'ro');title('狀態位置變化')
    drawnow
    frame = getframe(1);
    im = frame2im(frame);
    [A,map] = rgb2ind(im,256); 
	if iter == 1;
		imwrite(A,map,'E:\培訓\優化演算法\pso.gif','gif','LoopCount',Inf,'DelayTime',0.1);
	else
		imwrite(A,map,'E:\培訓\優化演算法\pso.gif','gif','WriteMode','append','DelayTime',0.1);
	end
    iter = iter+1;
end
disp(['最大值:',num2str(fym)]);
disp(['變數取值:',num2str(ym)]);

        另外,大家可以看到,種群歷史最優值處我們初始化為了-inf,這是因為我們需要求最大值。但是如果要求最小值應該怎麼辦呢?最好不要將這裡改成+inf,如果這樣做,我們後面的最優值更新中全部要改成最小值和<,太麻煩。那麼最好的方式就是直接在適應度處加上負號,這樣的話就相當於求最小值了,只不過要將最後的最優值取反。

      並且我們之前所寫的只是一維問題優化,程式碼優化程度不高,對此我給出一份優化程度較高的程式碼,以應對多維優化問題:

      問題是求21.5+x*sin(4*pi*x)+y*sin(20*pi*y),x=[-3,12.1];y=[4.1,5.8]的極值。

clc;clear;close all;tic
%% 引數設定
N = 500;
d = 2;
ger = 1000;
w = 0.8;
c1 = 0.9;
c2 = 0.9;
xlimit = [-3 12.1;4.1 5.8];
vlimit = [-1 1;-1 1];
%% 種群初始化
x = repmat(xlimit(:,1)',N,1)+repmat(diff(xlimit'),N,1).*rand(N,d);
v = repmat(vlimit(:,1)',N,1)+repmat(diff(vlimit'),N,1).*rand(N,d);
xm = x;
fxm = -inf*ones(N,1);
ym = xlimit(:,1)'+diff(xlimit').*rand(1,d);
fym = -inf;
%% 開始搜尋
for i = 1 : ger
    y = f(x);
    for j = 1 : N
        if y(j)>fxm(j)
            fxm(j)=y(j);
            xm(j,:) = x(j,:);
            if y(j)>fym
                fym = y(j);
                ym = x(j,:);
            end
        end
    end
    v = w*v+c1*rand*(xm-x)+c2*rand*(repmat(ym,N,1)-x);
    x = x+v;
    x = min(x,repmat(xlimit(:,2)',N,1));
    x = max(x,repmat(xlimit(:,1)',N,1));
    v = min(v,repmat(vlimit(:,2)',N,1));
    v = max(v,repmat(vlimit(:,1)',N,1));
end
toc
disp(['最優解為:',num2str(ym)]);
disp(['最優值為:',num2str(fym)]);
子函式為:
function y = f(x)
y = 21.5+x(:,1).*sin(4*pi*x(:,1))+x(:,2).*sin(20*pi*x(:,2));
end



相關推薦

粒子演算法matlab實現

      上一次的部落格中我將粒子群的搜尋過程可視化了,並將其轉存為了gif格式檔案,這個過程我先在這裡給大家講一下: 1.首先pause(),是在每次繪圖之後暫停一段時間,單位是秒,再進行下一次繪圖; 2.而當要轉存為gif檔案時,這其實就是一種無聲的視訊檔案,因此我們

2.遺傳演算法matlab實現2:再加例項兩個一元二元完整作圖,維圖形,三維圖形以及進化過程圖

(1)直接在命令視窗輸入以下程式碼: figure(1); hold on; lb=1;ub=2; %函式自變數範圍[1,2] ezplot('sin(10*pi*X)/X',[lb,ub]);

粒子演算法matlab實現

clc;clear;close all; %% 初始化種群 f= @(x)x .* sin(x) .* cos(2 * x) - 2 * x .* sin(3 * x); % 函式表示式 figure(1);ezplot(f,[0,0.01,20]); N = 50;

PSO解決TSP問題粒子演算法解決旅行商問題--python實現

歡迎私戳關注這位大神! 有任何問題歡迎私戳我->給我寫信 首先來看一下什麼是TSP: The travelling salesman problem (TSP) asks the following question: "Given a list

Java常用的八種排序演算法與程式碼實現:歸併排序法、快速排序法

注:這裡給出的程式碼方案都是通過遞迴完成的 --- 歸併排序(Merge Sort):   分而治之,遞迴實現   如果需要排序一個數組,我們先把陣列從中間分成前後兩部分,然後對前後兩部分進行分別排序,再將排好序的數組合並在一起,這樣整個陣列就有序了   歸併排序是穩定的排序演算法,時間

基於KNN分類演算法手寫數字識別的實現——構建KD樹

上一篇已經簡單粗暴的建立了一個KNN模型對手寫圖片進行了識別,所以本篇文章採用構造KD樹的方法實現手寫數字的識別。 (一)構造KD樹 構造KD樹的基本原理網上都有介紹,所以廢話不多說,直接上程式碼。 #Knn KD_Tree演算法 import math from

8種主要排序演算法的C#實現

歸併排序 歸併排序也是採用“分而治之”的方式。剛發現分治法是一種演算法正規化,我還一直以為是一種需要意會的思想呢。 不好意思了,孤陋寡聞了,哈哈! 原理:將兩個有序的數列,通過比較,合併為一個有序數列。 維基入口 為方便理解,此處實現用了List<in

基於內容推薦的個性化新聞閱讀實現:基於SVD的推薦演算法

一、前言 SVD前面已經說了好多次了,先不論其資訊檢索被宣稱的各種長處如何如何,在此最主要的作用是將稀疏的term-doc矩陣進行降維,當一篇篇文章變成簡短的向量化表示後,就可以用各種科學計算和機器學習演算法進行分析處理了。 之前的推薦演算法的設計是用的最大熵估計,他和諸如樸素貝葉斯、邏輯迴歸等,本質就

遺傳演算法matlab實現

       上一篇部落格中程式碼部分有人應該會有疑惑,在這裡我先做一些介紹: 自然選擇部分使用了排名法,適應度越高越難被淘汰,但是適應度最高的不會被淘汰;裡面出現了很多個個體,其中父代是一個種群N,交叉之後有了兩種子代2N,變異之後也會出現子代N,共4N,因此自然選擇需

寫程式學ML:樸素貝葉斯演算法原理及實現

[題外話]近期申請了一個微信公眾號:平凡程式人生。有興趣的朋友可以關注,那裡將會涉及更多更新機器學習、OpenCL+OpenCV以及影象處理方面的文章。 2、樸素貝葉斯演算法的實現 2.1   樸素貝葉斯演算法的實現 按照樸素貝葉斯演算法的原理,我們需要實現一個樸素貝葉

uc/os-II的記憶體改進與實現TLSF演算法的詳解,移植實現

上一節講到了TLSF的資料結構,下面繼續哈。 TLSF用兩個層次的分類對不同尺寸的記憶體塊進行分類。第一層次的類別目錄為2n,n為4,5,……,31的整數,稱為FLI(First-level Segregated Fit)。每一個FLI類別又根據第二層的SLI細分為2SLI

寫程式學ML:Logistic迴歸演算法原理及實現

2、Logistic迴歸演算法的實現 2.1   Logistic演算法的實現 首先,我們實現梯度上升演算法。 Sigmoid函式的定義如下: #sigmoid函式的實現 def sigmoid(inX): return 1.0 / (1 + exp(-inX))

文字相似性演算法實現-分組及分句熱度統計

1. 場景描述 軟體老王在上一節介紹到相似性熱度統計的4個需求(文字相似性熱度統計(python版)),本次介紹分組及分組分句熱度統計(需求1和需求2)。 2. 解決方案 分組熱度統計首先根據某列進行分組,然後再對這些句進行熱度統計,主要是分組處理,分句僅僅是按照標點符號做了下拆分,在程式碼說明中可以替換下就

Dji Mobile SDK 基礎實現

stat one 透傳 pub != exceptio rom tick ann Dji Mobile SDK 基礎實現(二) 本文簡要介紹如何通過調用DJI Mobile SDK,實現獲取和釋放無人機的控制權限、模擬遙控器按鈕控制無人機的飛行、獲取無人機的回傳視頻、獲取

實現自定義查詢的數據庫設計及實現

表名 table abr bigint sts 處理 update 關聯表 creat 上部分大概講了一下表設計,這部分講一下處理。 處理的結構 處理結構的內容比較多,分為幾個部分分別講解一下。首先講解一下尋找關系表。 尋找關系表 尋找關系表根據“表間關系登記表”進行處

Solr集搭建詳細教程

內容 必須 不同的 nbsp 統一 工作 虛擬 應該 opts 註:歡迎大家轉載,非商業用途請在醒目位置註明本文鏈接和作者名dijia478,商業用途請聯系本人[email protected]。 之前步驟:Solr集群搭建詳細教程(一) 三、solr集群搭建 註意,在

kafka集安裝及管理

進程 node 規則 nfa 情況 tor back per art 一、broker的遷移1.查看zookeeper和kafka啟動情況[root@slave1 ~]# pssh -h hostlist -i 'jps' [1] 22:08:11 [SUC

數字圖像處理的Matlab實現3—灰度變換與空間濾波

彩色圖像 equals 相同 tca 彩色 處理工具 off argc ber 第3章 灰度變換與空間濾波(1) 3.1 簡介 空間域指的是圖像平面本身,這類方法是以對圖像像素直接處理為基礎的。本章主要討論兩種空間域處理方法:亮度(灰度)變換與空間濾波。後一種方法有時涉及到

KVM虛擬化的四種簡單網絡模型介紹及實現

str drive 51cto -c water -a return dfa 模型 接上篇,介紹NAT網絡模型和橋接模型。 三、NAT模型 NAT模型其實就是SNAT的實現,路由中虛擬機能將報文發送給外部主機,但是外部主機因找不到通往虛擬機的路由因而無法回應請求。但是外部

SpringBoot在Kotlin中的實現

文件中 open 代碼 rabl delete ons list any data 根據現在的開發模式和網上的一些資料,SpringBoot需要對業務和操作進行分層,通常分為controller、entity、service、respository等結構。下面以Kotlin