Matlab의 입자 군집 알고리즘 구현 (소스 코드 포함)

생각

개별 새의 경우 먹이에 가장 빨리 접근 할 수있는 첫 번째 선택은 일반적으로 다른 새가있는 곳을 살펴 보는 것입니다. 그들은 군집 효과가 존재한다고 믿고 대부분의 새가 먼저가는 곳으로 갈 것입니다. 그렇지 않으면 그들은 갈 것입니다. 다른 곳을 봐

핵심 아이디어는
그룹 내 개인의 정보 공유 사용하여 전체 그룹의 이동이 문제 해결 공간에서 장애에서 질서로 진화하는 과정을 생성하여 문제에 대한 최적의 솔루션을 얻는 것입니다.

입자 떼 최적화 알고리즘은 조류와 어군의 포식 행동에서 파생 된 후 알고리즘으로 추상화 된 후 입자 떼 최적화 알고리즘을 설명하기 위해 새가 어떻게 먹이를 먹는지 입자를 소개합니다.

예를 들어
한 지역에 한 무리의 새가 있고이 지역의 한 곳 이상에 음식이있는 것으로 알려져 있습니다. 새는 새입니다. 음식의 특정 위치 나 음식이 어디에 있는지 모릅니다. 하지만 대부분 음식을 만났을 때 음식이 -_-라는 것을 알고 음식의 양을 구별 할 수 있습니다. 자연의 모든 생물은 끊임없이 음식을 찾고 있기 때문에 생존 할 수 있습니다.

가장 많은 음식 장소 찾기

솔루션 :이 프로세스 : 조건을 알고 해결하십시오.

그렇다면 새들은 어떻게 먹이를 찾습니까? 이 지역에서 가장 많은 음식이있는 장소를 찾는 방법은 무엇입니까?

1. 새 무리간에 정보를 공유하고 그룹이 음식을 가장 많이 아는 곳으로 날아갑니다.
2. 자신의 경험을 바탕으로 음식을 가장 많이 아는 곳으로 날아갑니다.

이 두 가지 행동을 통해 새 떼는 서로 정보를 공유하고, 계속 수색을하면서 음식이 가장 많은 곳을 찾을 수 있습니다.

위의 분석을 통해 새들은 두 가지 행동을합니다 : 1. 사회적 행동, 2. 개별 행동,
사회적 행동 : 새들은 무리에서 가장 좋은 새들로부터 배우게됩니다. 즉, 현재 가장 많은 먹이가 알려진 곳으로 이동합니다.
개인 행동 : 검색 결과에 따라 음식을 가장 많이 아는 곳으로 이동합니다.
그런 다음 새 떼가 먹이를 찾는 방법에 따라 각 새가 입자로 추상화되고 각 입자는 위의 두 가지 동작을 가지므로 입자 떼 최적화 (PSO)가 발생합니다.

공식

다음 속도 해결 :
개인은 모든 이동 경로 (최적 값과 현재 위치 간의 차이 (개별 극단 값과 현재 위치 간의 관계))에 있고
그룹은 모든 이동 경로에 있음 (차이) 최적 값과 현재 위치 값 사이의 값 (그룹 극단 값과 현재 위치 사이의 관계)

다음 위치 해결 :
두 개의 인접한 간격, 기본 시간은 1이므로 속도와 위치를 직접 추가 할 수 있습니다.
여기에 사진 설명 삽입

프로그램

fun.m

function y = fun(x)
% 函数用于计算粒子适应度值,也就是公式
%x           input           输入粒子 
%y           output          粒子适应度值 
y = sin(10 * pi * x) / x;

main.m

 %% I. 清空环境
clc
clear all

%% II. 绘制目标函数曲线图
x = 1:0.01:2;  %1-2 
y = sin(10*pi*x) ./ x;%实际要优化的函数  矩阵的对应相除——点除  sin(10*π*x)
figure%单独执行可以出现表格,和前几行一起执行也是表格,必须和第四行一起执行才可以出现表格
plot(x, y)
hold on%添加新绘图时,保存当前figure

%% III.初始化参数
c1 = 1.49445;
c2 = 1.49445;

maxgen = 50;   % 进化次数  
sizepop = 10;   %种群规模

Vmax = 0.5;
Vmin = -0.5;
popmax = 2; %个体变化范围,与pop范围对应相同
popmin = 1;

%加入权重(1)
ws = 0.9;%start
we = 0.4;%end

%% IV. 产生初始粒子(种群) 速度 适应度函数
for i = 1:sizepop%10
    % 随机产生一个种群population=10,同时定义pop()
    %pop(i,:)——10*1double,不是1*10
    %因为右侧没有i,只是左侧的pop(i,:)
    %初始种群 rands(1)函数是随机产生[-1,1],经过运算后,变化范围是{
    
    12},[1,2]中随机10%pop(i,:) = rand + 1;%pop(i,:) = rand(1) + 1;两者都可以
    pop(i,:) = (rands(1) + 1) / 2 + 1;   
    V(i,:) = 0.5 * rands(1);  %初始化速度,[-0.5,0.5]
    % 适应度 把初始化的,10*1的种群,代入到函数中,得到1*10的适应度函数
    %fitness函数只能显示1*n的数据,这是设置的
    fitness(i) = fun(pop(i,:));   %针对每一个个体去调用适应度函数
end
%% V. 个体极值和群体极值 个体最佳和群体最佳
%选择最大或者最小都可以,但是一定要统一,毕竟是随机
%[最大值 对应的位置]
[bestfitness bestindex] = max(fitness);%1-10中最大的适应度函数值就是,fitness不加括号
%g_best = max(pop);输出的群体最佳和群体极值是一样(结果虽然是一样的,是偶然,),    0.9528    1.0490

%这三个里面,只有,p_best与fitness函数无关
%位置——在群体中,适应度函数值最大的对应的位置
g_best = pop(bestindex,:);      %全局最佳,并不是十个数里面最大的gbest = max(pop);,而是群体极值中最大的,对应的位置
p_best = pop;                   %个体最佳,十个个体,此时没有进入循环,在循环中,个体最佳是所有循环中个体最佳的

%值
p_best_fitness = fitness;       %个体最佳适应度值——个体极值
g_best_fitness = bestfitness;   %全局最佳适应度值——群体极值

%% VI. 迭代寻优
for i = 1:maxgen%50
        %加入权重(2)
    w = ws - (ws - we)*(maxgen - i)/maxgen;
    for j = 1:sizepop%10
        % 速度更新           个体最佳*10 每一次都选取最佳               全局最佳(每次循环中的最佳)
        V(j,:) = w*V(j,:) + c1*rand*(p_best(j,:) - pop(j,:)) + c2*rand*(g_best - pop(j,:));
        
        V(j,find(V(j,:)>Vmax)) = Vmax;%边界约束
        V(j,find(V(j,:)<Vmin)) = Vmin;
        
        % 种群更新
        pop(j,:) = pop(j,:) + V(j,:);
        pop(j,find(pop(j,:)>popmax)) = popmax;
        pop(j,find(pop(j,:)<popmin)) = popmin;
        
        % 适应度值更新
        fitness(j) = fun(pop(j,:)); 
    end
    
    for j = 1:sizepop    
        % 个体最优更新
        if fitness(j) > p_best_fitness(j)%当前的适应度函数值大于个体极值,就把当前个体,以及适应度函数值赋给best
            p_best(j,:) = pop(j,:);
            p_best_fitness(j) = fitness(j);
        end
        
        % 群体最优更新
        if fitness(j) > g_best_fitness%当前的适应度函数值大于群体极值,就把当前个体,以及适应度函数值赋给best
            g_best = pop(j,:);
            g_best_fitness = fitness(j);
        end
    end 
    yy(i) = g_best_fitness;          
end

%% VII. 输出结果并绘图
[g_best_fitness g_best]%寻找到的极值点——[值,位置]
plot(g_best, g_best_fitness,'r*')%极值点对应的变量

figure
plot(yy)
title('最优个体适应度','fontsize',12);
xlabel('进化代数','fontsize',12);ylabel('适应度','fontsize',12);


결과

여기에 사진 설명 삽입

추천

출처blog.csdn.net/qq_43641765/article/details/111414915