생각
개별 새의 경우 먹이에 가장 빨리 접근 할 수있는 첫 번째 선택은 일반적으로 다른 새가있는 곳을 살펴 보는 것입니다. 그들은 군집 효과가 존재한다고 믿고 대부분의 새가 먼저가는 곳으로 갈 것입니다. 그렇지 않으면 그들은 갈 것입니다. 다른 곳을 봐
핵심 아이디어는
그룹 내 개인의 정보 공유 를 사용하여 전체 그룹의 이동이 문제 해결 공간에서 장애에서 질서로 진화하는 과정을 생성하여 문제에 대한 최적의 솔루션을 얻는 것입니다.
입자 떼 최적화 알고리즘은 조류와 어군의 포식 행동에서 파생 된 후 알고리즘으로 추상화 된 후 입자 떼 최적화 알고리즘을 설명하기 위해 새가 어떻게 먹이를 먹는지 입자를 소개합니다.
예를 들어
한 지역에 한 무리의 새가 있고이 지역의 한 곳 이상에 음식이있는 것으로 알려져 있습니다. 새는 새입니다. 음식의 특정 위치 나 음식이 어디에 있는지 모릅니다. 하지만 대부분 음식을 만났을 때 음식이 -_-라는 것을 알고 음식의 양을 구별 할 수 있습니다. 자연의 모든 생물은 끊임없이 음식을 찾고 있기 때문에 생존 할 수 있습니다.
가장 많은 음식 장소 찾기
솔루션 :이 프로세스 : 조건을 알고 해결하십시오.
그렇다면 새들은 어떻게 먹이를 찾습니까? 이 지역에서 가장 많은 음식이있는 장소를 찾는 방법은 무엇입니까?
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],经过运算后,变化范围是{
1,2},[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);