二維粒子群演算法的matlab源程式

2022-12-09 18:03:04 字數 4002 閱讀 4664

function [pso f] = pso_2d()

% function pso --------use particle swarm optimization algorithm

% global present;

% close all;

clc;

clear all;

pop_size = 10pop_size 種群大小 ///粒子數量

part_size = 2part_size 粒子大小 ///粒子的維數

gbest = zeros(1,part_size+1); % gbest 當前搜尋到的最小的值

max_gen = 200max_gen 最大迭代次數

%best=zeros(part_size,pop_size*part_size);%xuan

region=zeros(part_size,2); % 設定搜尋空間範圍->解空間

region=10*[-3,3;-3,3;-3,3;-3,3;-3,3;-3,3;-3,3;-3,3;-3,3;-3,3]; % 每一維設定不同範圍(稱之為解空間,不是可行域空間)

rand('state',sum(100*clock)); % 重置隨機數發生器狀態

%當前種群的資訊矩陣,逐代進化的群體 % 當前位置,隨機初始化

% 乙個10*3的隨機的矩陣(初始化所有粒子的所有維數的位置值),其中最後一列為

arr_present = ini_pos(pop_size,part_size);

% 初始化當前速度

% 乙個10*2的隨機的矩陣(初始化所有粒子的所有維數的速度值)

v=ini_v(pop_size,part_size);

%不是當前種群,可看作是乙個外部的記憶體,儲存每個粒子歷史最優值(2維數值):根據適應度更新!

%注意:pbest陣列10*3 最後一列儲存的是適應度

pbest = zeros(pop_size,part_size+1); % pbest:粒子以前搜尋到的最優值,最後一列包括這些值的適應度

% 1*80 儲存每代的最優值

best_record = zeros(part_size+1,max_gen); % best_record陣列:記錄每一代的最好的粒子的適應度

w_max = 0.9; % w_max權係數最大值

w_min = 0.2; % w_min權係數最小值

v_max = 2; % 最大速度,為粒子的範圍寬度

c1 = 2學習因子1

c2 = 2學習因子2

% 計算原始種群的適應度,及初始化

% 注意:傳入的第乙個引數是當前的粒子群體 ,ini_fit函式計算每個粒子的適應度

% arr_present(:,end)是最後一列 ,儲存每個粒子的適應值,是這樣的!xuan

arr_present(:,end)= ini_fit( arr_present, pop_size, part_size );

% 陣列賦值,初始化每個粒子個體的歷史最優值,以後會更新的

pbest = arr_present; % 初始化各個粒子最優值

% 找到當前群體中適應度最小的(在最後一列中尋找),best_value

% 改為max,表示關聯度最大

[best_value best_index] = max(arr_present(:,end)); %初始化全域性最優,即適應度為全域性最小的值,根據需要也可以選取為最大值

% 唯一的全域性最優值,是當前代所有粒子中最好的乙個

gbest = arr_present(best_index,:);

% 因為是多目標,因此這個

% 只是示意性的畫出3維的

%x=[-3:0.01:3];

%y=[-3:0.01:3];

%[x,y]=meshgrid(x,y);

%z1=(-10)*exp((-0.2)*sqrt(x^2+y^2));

%z2=(abs(x))^0.8+abs(y)^0.8+5*sin(x^3)+5*sin(y^3);

%z1=@(x,y)(-10)*exp((-0.2)*sqrt(x^2+y^2));

%z2=@(x,y)(abs(x))^0.8+abs(y)^0.8+5*sin(x^3)+5*sin(y^3);

%ezmeshc(z1);grid on;

%ezmeshc(z2);grid on;

%開始進化,直到最大代數截至

for i=1:max_gen

%grid on;

%三維圖象 %多維圖象是畫不出來的

%ezmesh(z),hold on,grid on;

%畫出粒子群

%plot3(arr_present(:,1),arr_present(:,2),arr_present(:,3),'*'),hold off;

%drawnow

%flush

%pause(0.01);

w = w_max-(w_max-w_min)*i/max_gen; % 線形遞減權重

% 當前進化代數:對於每個粒子進行更新和評價----->>>>>>>

for j=1:pop_size

v(j,:) = w.*v(j,:

)+c1.*rand.*(pbest(j,1:

part_size)-arr_present(j,1:part_size))...

+c2.*rand.*(gbest(1:part_size)-arr_present(j,1:part_size)); % 粒子速度更新 (a)

% 判斷v的大小,限制v的絕對值小於20

for k=1:part_size

if abs(v(j,k))>20

rand('state',sum(100*clock));

v(j,k)=20*rand();

endend%前幾列是位置資訊

arr_present(j,1:part_size) = arr_present(j,1:part_size)+v(j,1:part_size);% 粒子位置更新 (b)

%最後一列是適應度

arr_present(j,end) = fitness(part_size,arr_present(j,1:part_size)); % 適應度更新 (儲存至最後一列)

% 適應度評價與可行域限制

if (arr_present(j,end)>pbest(j,end))&(region_in(arr_present(j,:),region)) % 根據條件更新pbest,如果是最小的值為小於號,相反則為大於號

pbest(j,:) = arr_present(j,:); % 更新個體的歷史極值

endend% 以下更新全域性的極值

[best best_index] = max(arr_present(:,end如果是最小的值為min,相反則為max

if best>gbest(end) & ( region_in(arr_present(best_index,:),region) ) % 如果當前最好的結果比以前的好,則更新最優值gbest,如果是最小的值為小於號,相反則為大於號

gbest = arr_present(best_index,:); % 全域性的極值

end混沌 xlhd = gbest(1:part_size);

if(1)

for p=1:25 %次數

%1生成

cxl=rand(1,part_size);

for j=1:part_size

if cxl(j)==0

cxl(j)=0.1;

endif cxl(j)==0.25

cxl(j)=0.26;

endif cxl(j)==0.5

cxl(j)=0.51;

endif cxl(j)==0.75

cxl(j)=0.76;

endif cxl(j)==1

cxl(j)=0.9;

endend%2對映

al=-30;bl=30;

rxl=al+(bl-al)*cxl;

基本粒子群演算法的matlab源程式

主函式源程式 基本粒子群優化演算法 particle swarm optimization 名稱 基本粒子群優化演算法 pso 作用 求解優化問題 說明 全域性性,並行性,高效的群體智慧型演算法 初始格式化 clear all clc format long 給定初始化條件 c1 1.4962 學習...

非線性規劃的粒子群演算法1

xx大學 智慧型優化演算法課內實驗報告書 非線性規劃問題的粒子群演算法 1.1 背景介紹 1.1.1 非線性規劃簡介 具有非線性約束條件或目標函式的數學規劃,是運籌學的乙個重要的分支,目標函式和約束條件都是線性函式的情形則屬於線性規劃。非線性規劃是20世紀50年代才開始形成的一門新興學科。1951年...

一類雙層規劃問題的粒子群演算法研究

學術研討 非線性雙層規劃具有遞階結構,被證明是 難問題。本文研究了一類下層是連續可微的非線性雙層規劃問題。利用 最優性條件把下層最優化問題轉為上層最優化問 題的一系列約束條件,利用平滑方法處理了約束條件中 的互補鬆弛問題,從而簡化了原問題的求解。在此基礎上針對轉化後的優化問題,設計了改進的粒子群演算...