【预测模型】基于matlab粒子群算法预测【含Matlab源码 1326期】
一、粒子群算法简介
1 粒子群算法的概念
粒子群优化算法(PSO:Particle swarm optimization) 是一种进化计算技术(evolutionary computation)。源于对鸟群捕食的行为研究。粒子群优化算法的基本思想:是通过群体中个体之间的协作和信息共享来寻找最优解.
PSO的优势:在于简单容易实现并且没有许多参数的调节。目前已被广泛应用于函数优化、神经网络训练、模糊系统控制以及其他遗传算法的应用领域。
2 粒子群算法分析
2.1基本思想
粒子群算法通过设计一种无质量的粒子来模拟鸟群中的鸟,粒子仅具有两个属性:速度和位置,速度代表移动的快慢,位置代表移动的方向。每个粒子在搜索空间中单独的搜寻最优解,并将其记为当前个体极值,并将个体极值与整个粒子群里的其他粒子共享,找到最优的那个个体极值作为整个粒子群的当前全局最优解,粒子群中的所有粒子根据自己找到的当前个体极值和整个粒子群共享的当前全局最优解来调整自己的速度和位置。下面的动图很形象地展示了PSO算法的过程:
2 更新规则
PSO初始化为一群随机粒子(随机解)。然后通过迭代找到最优解。在每一次的迭代中,粒子通过跟踪两个“极值”(pbest,gbest)来更新自己。在找到这两个最优值后,粒子通过下面的公式来更新自己的速度和位置。
公式(1)的第一部分称为【记忆项】,表示上次速度大小和方向的影响;公式(1)的第二部分称为【自身认知项】,是从当前点指向粒子自身最好点的一个矢量,表示粒子的动作来源于自己经验的部分;公式(1)的第三部分称为【群体认知项】,是一个从当前点指向种群最好点的矢量,反映了粒子间的协同合作和知识共享。粒子就是通过自己的经验和同伴中最好的经验来决定下一步的运动。以上面两个公式为基础,形成了PSO的标准形式。
公式(2)和 公式(3)被视为标准PSO算法。
3 PSO算法的流程和伪代码
二、部分源代码
clear all;
clc;
close all;
% 露篓脪氓脢媒戮脻虏煤脡煤脢陆
x_string = '-2*x(1) + 3*x(2).^2 - 1*x(3) + 4*x(4).^2 + 10*x(5) + 6*x(6) + 50';
% 脤谩脠隆xdata潞脥ydata
xdata_all = rand(200, 6);
ydata_all = [];
for i = 1:size(xdata_all,1)
x = xdata_all(i,:);
y = eval(x_string);
ydata_all(i,1) = y;
end
%
xdata = xdata_all(1:158,:);
ydata = ydata_all(1:158);
xdata_test = xdata_all(159:end,:);
ydata_test = ydata_all(159:end);
% 露篓脪氓脕拢脳脫脣茫路篓虏脦脢媒
N = 50; % 脕拢脳脫脰脰脠潞脢媒脕驴
d = size(xdata,2)*2 + 1; % 露篓脪氓脙驴赂枚脕拢脳脫碌脛鲁陇露脠
ger = 100; % 露篓脪氓脳卯麓贸碌眉麓煤麓脦脢媒
% 露篓脪氓脦禄脰脙虏脦脢媒脡猫脰脙
limit_sub = zeros(1,d);
limit_up = zeros(1,d);
for i = 1:d
if i ~= d
if mod(i,2) == 1
limit_sub(i) = -30;
limit_up(i) = 30;
else
limit_sub(i) = -30;
limit_up(i) = 30;
end
else
limit_sub(i) = -100;
limit_up(i) = 100;
end
end
% 露篓脪氓脣脵露脠脧脼脰脝
vlimit = [-30, 30];
% 露篓脪氓鹿脽脨脭脠篓脰脴
Wmax = 0.8;
Wmin = 0.2;
% 露篓脪氓脳脭脦脪脩搂脧掳脪貌脳脫
c1 = 0.5;
% 露篓脪氓脠潞脤氓脩搂脧掳脪貌脳脫
c2 = 0.5;
% 鲁玫脢录禄炉脠潞脤氓
XX = zeros(N,d);
for i = 1:N
XX(i,:) = limit_sub + (limit_up - limit_sub).*rand(1,d);
end
% 鲁玫脢录禄炉脰脰脠潞脣脵露脠
V = rand(N,d);
Xm = XX; % 脙驴赂枚脕拢脳脫赂枚脤氓碌脛脌煤脢路脳卯录脩脦禄脰脙
fXm = fit_fun(XX, xdata, ydata); % 脙驴赂枚赂枚脤氓碌脛脌煤脢路脳卯录脩脢脢脫娄露脠
[fYm, nmin] = min(fXm); % 脰脰脠潞脌煤脢路脳卯录脩脢脢脫娄露脠
Ym = Xm(nmin,:); % 脰脰脠潞碌脛脌煤脢路脳卯录脩脢脢脫娄露脠
% 脠潞脤氓赂眉脨脗
iter = 1;
record = zeros(ger,1);
while iter <= ger
fx = fit_fun(XX, xdata, ydata); % 赂枚脤氓碌卤脟掳脢脢脫娄露脠
for i = 1:N
if fXm(i) > fx(i)
fXm(i) = fx(i); % 赂眉脨脗赂枚脤氓脌煤脢路脳卯录脩脢脢脫娄露脠
Xm(i,:) = XX(i,:); % 赂眉脨脗赂枚脤氓脌煤脢路脳卯录脩脦禄脰脙
end
end
if fYm > min(fXm)
[fYm, nmin] = min(fXm); % 赂眉脨脗脠潞脤氓脌煤脢路脳卯录脩脢脢脫娄露脠
Ym = Xm(nmin,:); % 赂眉脨脗脠潞脤氓脌煤脢路脳卯录脩脦禄脰脙
end
V = V * (Wmin + (Wmax - Wmin)*(ger - iter)/ger) + c1*rand(N,d).*(Xm - XX) + c2*rand(N,d).*(repmat(Ym,N,1) - XX); % 脣脵露脠赂眉脨脗
% 卤脽陆莽脣脵露脠麓娄脌铆
V(V > vlimit(2)) = vlimit(2);
V(V < vlimit(1)) = vlimit(1);
% 陆酶脨脨脦禄脰脙赂眉脨脗
XX = XX + V;
% 脭枚录脫脪禄赂枚脣忙禄煤陆禄禄禄碌脛虏脵脳梅
for i = 1:N
if rand < 0.3
X_sub = XX(i,:);
K = randperm(d,2);
X_sub([K(1), K(2)]) = X_sub([K(2), K(1)]);
XX(i,:) = X_sub;
end
end
% 卤脽陆莽麓娄脌铆
for i = 1:N
x_sub = XX(i,:);
for j = 1:d
if x_sub(j) < limit_sub(j)
x_sub(j) = limit_sub(j);
end
if x_sub(j) > limit_up(j)
x_sub(j) = limit_up(j);
end
end
XX(i,:) = x_sub;
end
record(iter) = fYm;
iter = iter + 1;
fprintf('%d\t%f\n', iter - 1, fYm);
end
% 禄忙脰脝脢脮脕虏脟煤脧脽脥录
figure;
plot(record); title('迭代图');
print(gcf, '-dpng', 'fig1.png');
% 禄帽碌脙脳卯录脩碌脛禄脴鹿茅路陆鲁脤脢陆
[~, Xstring] = fit_fun(Ym, xdata, ydata);
Xstring = Xstring{1};
% 赂霉戮脻禄脴鹿茅脢陆露脭虏芒脢脭录炉陆酶脨脨禄脴鹿茅
ypred = [];
for i = 1:size(xdata_test,1)
x = xdata_test(i,:);
ypred(i,1) = eval(Xstring);
end
% 禄忙脰脝脭陇虏芒脥录
figure;
plot(ydata_test, 'r-o');
hold on;
plot(ypred, 'b-*');
R = corr2(ypred, ydata_test);
title(['R = ', num2str(R)]);
legend({'测试值'; '预测值'});
print(gcf, '-dpng', 'fig2.png');
function [mseV, stringlist] = fit_fun(chromx, xdata, ydata)
% ÕâÀﶨÒåÒ»¸öº¯ÊýÓÃÀ´½øÐÐÊÊÓ¦¶ÈµÄ¼ÆËã
% ÕâÀïÉ趨Á˼¸¸ö¹«Ê½
% (1) ÊýÖµÔÚ0 ~ 1 ±íʾµ¥Ïîʽ x
% (2) ÊýÖµÔÚ1~2 ÊǶþ´Î·½
% (3) ÊýÖµÔÚ2~3 ÊÇÈý´Î·½
mseV = [];
stringlist = {};
for k = 1:size(chromx,1)
chromx_sub = chromx(k,:);
xstring = '';
for i = 1:(length(chromx_sub) - 1)/2
if i == 1
xstring = [xstring, num2str(chromx_sub((i - 1)*2 + 1)), '*', x_type(chromx_sub((i - 1)*2 + 2), i)];
else
xstring = [xstring, ' + ', num2str(chromx_sub((i - 1)*2 + 1)), '*', x_type(chromx_sub((i - 1)*2 + 2), i)];
end
end
xstring = [xstring, ' + ', num2str(chromx_sub(end))];
% ¼ÆËã¶àÏîʽ»Ø¹é
y = zeros(size(xdata,1),1);
for i = 1:size(xdata,1)
x = xdata(i,:);
y(i) = eval(xstring);
end
% ¼ÆËãMSE
mseV(k) = mean((y - ydata).^2);
stringlist{k} = xstring;
end
function y = x_type(chromx,i)
% (1) ÊýÖµÔÚ0 ~ 10 ±íʾµ¥Ïîʽ x
% (2) ÊýÖµÔÚ10 ~ 20 ÊǶþ´Î·½
% (3) ÊýÖµÔÚ20 ~ 30 ÊÇÈý´Î·½
% ¸ù¾ÝÊäÈëxµÄÊýÖµ´óСÀ´½øÐÐÅжÏ
if abs(chromx) >= 0 & abs(chromx) <= 10
y = ['x(', num2str(i), ')'];
elseif abs(chromx) > 10 & abs(chromx) <= 20
y = ['x(', num2str(i),').^2'];
elseif abs(chromx) > 20 & abs(chromx) <= 30
y = ['x(', num2str(i), ').^3'];
end
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
- 163
- 164
- 165
- 166
- 167
- 168
- 169
- 170
- 171
三、运行结果
四、matlab版本及参考文献
1 matlab版本
2014a
2 参考文献
[1] 包子阳,余继周,杨杉.智能优化算法及其MATLAB实例(第2版)[M].电子工业出版社,2016.
[2]张岩,吴水根.MATLAB优化算法源代码[M].清华大学出版社,2017.
文章来源: qq912100926.blog.csdn.net,作者:海神之光,版权归原作者所有,如需转载,请联系作者。
原文链接:qq912100926.blog.csdn.net/article/details/120455319
- 点赞
- 收藏
- 关注作者
评论(0)