算法分析与设计 实验报告
专 业 班 号 组 别 指导老师
姓 名 同 组 者
实验日期 第十四周 第 3 次实验
实验名称 基于粒子群算法的函数优化问题
一、实验项目
基于粒子群算法的函数优化问题实验,在Windows下基于Matlab完成编程。
二、实验目的
粒子群算法,也称粒子群优化算法(Particle Swarm Optimization),缩写为 PSO,
是近年来发展起来的一种新的进化算法((Evolu2tionary Algorithm - EA)。这种算
法以其实现容易、精度高、收敛快等优点引起了学术界的重视,并且在解决实际问题中展
示了其优越性。为学习其算法思想,有必要掌握并实现基于粒子群算法的函数优化问题
实验。
三、实验原理
粒子群优化算法(PSO)是一种进化计算技术(evolutionary computation),1995 年由
Eberhart 博士和kennedy 博士提出,源于对鸟群捕食的行为研究 。
PSO同遗传算法类似,是一种基于迭代的优化算法。系统初始化为一组随机解,通过
迭代搜寻最优值。但是它没有遗传算法用的交叉(crossover)以及变异(mutation),而是粒子
在解空间追随最优的粒子进行搜索。同遗传算法比较,PSO的优势在于简单容易实现并且
没有许多参数需要调整。目前已广泛应用于函数优化,神经网络训练,模糊系统控制以及
其他遗传算法的应用领域。
四、实验内容
1、首先编写通用代码
粒子群测试各个函数的主代码写出来,对于不同的测试函数,只需要调用相应的测试函数即可,将各个函数做成.m的文件。
matlab源代码程序如下:
clear all;
clc;
format long;
%------给定初始化条件----------------------------------------------
c1=1.4902; %学习因子1
c2=1.4901; %学习因子2
w=0.7281; %惯性权重
MaxDT=1000; %最大迭代次数
D=5; %搜索空间维数(未知数个数)
N=40;
eps=10^(-6); %设置精度(在已知最小值时候用)
%------初始化种群的个体(可以在这里限定位置和速度的范围)------------
fori=1:N
for j=1:D
x(i,j)=randn; %随机初始化位置
v(i,j)=randn; %随机初始化速度
end
end
%------先计算各个粒子的适应度,并初始化Pi和Pg----------------------
fori=1:N
p(i)=function(x(i,:));
y(i,:)=x(i,:);
end
pg=x(1,:); %Pg为全局最优
fori=2:N
if function(x(i,:))<function(pg)
pg=x(i,:);
end
%------进入主要循环,按照公式依次迭代,直到满足精度要求------------
for t=1:MaxDT
fori=1:N
v(i,:)=w*v(i,:)+c1*rand*(y(i,:)-x(i,:))+c2*rand*(pg-x(i,:));
x(i,:)=x(i,:)+v(i,:);
if function(x(i,:))<p(i)
p(i)=function(x(i,:));
y(i,:)=x(i,:);
end
if p(i)<function(pg)
pg=y(i,:);
end
end
Pbest(t)=function(pg);
end
%------最后给出计算结果
disp('*************************************************************')
disp('函数的全局最优位置为:')
Solution=pg'
plot(Solution)
disp('最后得到的优化极值为:')
Result=function(pg)
disp('*************************************************************')
2、对指定函数的优化
(1)Rastrigins.m文件代码如下,即Rastrigins测试函数;
function [out]=Rastrigin(x)
x=-5.12:0.01:5.12;
cos_in = cos(2*pi*x);
out= sum((x.^2-10*cos_in + 10), 2);
在matlab中运行结果如下:
函数的全局最优位置为:
Solution =
0.576475699699576
-0.860754225546370
1.220565827682626
1.420735482575301
0.552791439208896
最后得到的优化极值为:
Result =
1.899896389267265e+004
(2)函数2:使用粒子群算法对Griewank函数进行优化:
将下面代码保存成Griewank.m文件,代码如下:
Dx=length(in(1,:));
tlenx=length(in(:,1));
if isempty(D) | D~=Dx | tlen~=tlenx
D=Dx; % dimension of prob
tlen=tlenx; % how many separate states
d=repmat([1:D],tlen,1);
sqrtd=sqrt(d);
end
dat1= sum([(in-100).^2],2)./4000;
dat2 = prod( (cos( (in-100)./sqrtd )) ,2);
out = dat1 - dat2 + 1;
然后将主函数中的function替换成Griewank,然后在matlab中运行即可,运行结
果如下:
函数的全局最优位置为:
Solution =
1.0e+002 *
0.089393835024922
1.355075075547163
0.945667645113542
1.188118773920475
0.929927307049068
最后得到的优化极值为:
Result =
2.497904795831135
(3)函数3:使用粒子群算法对Foxhole函数进行优化:
将下面代码保存成Foxhole.m文件,代码如下:
function [out]=Foxhole(in)
%x=in(,1);
%y=in(,2);
term_sum=0;
x=in(:,1);
y=in(:,1);
a{1} = [...
-32 -16 0 16 32 ;...
-32 -16 0 16 32 ;...
-32 -16 0 16 32 ;...
-32 -16 0 16 32 ;...
-32 -16 0 16 32 ;...
];
a{2} = [...
-32 -32 -32 -32 -32 ;...
-16 -16 -16 -16 -16 ;...
0 0 0 0 0 ;...
16 16 16 16 16 ;...
32 32 32 32 32 ;...
];
term_sum=0;
for j=1 :numel((a{1}))
ax=a{1} (j);
ay=a{2} (j);
term_sum = (x - ax).^6 + (y - ay).^6;
term_sum=term_sum+ 1.0/(j+term_sum);
end
out = .002 + term_sum;
运行结果如下:
函数的全局最优位置为:
Solution =
31.999503320926419
6.742047876319869
-4.288120783678205
14.918070142918513
13.732644871242318
最后得到的优化极值为:
Result =
0.042000000000000
第二篇:蚁群算法人工智能实验报告
人工智能实验报告
姓名:
学号:
班级:
实验时间:
蚁群算法
实验原理:
蚂蚁在觅食过程中可以找出巢穴到食物源的最短路径,为什么?
(1)信息素(pheromone)
(2)正反馈现象:某一路径上走过的蚂蚁越多,则后来者选择该路径的概率就越大。
(3)挥发现象:路径上的信息素浓度会随着时间推进而逐渐衰减。
蚁群算法的缺点:
1)收敛速度慢
2)易于陷入局部最优
改进:
1)采用局部优化,设计了三种优化算子。
2)采用蚁群优化算法。
3)其它优化算法
实验内容:
旅行商问题(TSP,traveling salesman problem):
一商人去n个城市销货,所有城市走一遍再回到起点,使所走路程最短。
实验步骤:
算法代码:
%%蚁群算法的优化计算——旅行商问题(TSP)优化
%% 清空环境变量
clear all
clc
%% 导入数据
load citys_data.mat
%% 计算城市间相互距离
n = size(citys,1);
D = zeros(n,n);
for i = 1:n
for j = 1:n
if i ~= j
D(i,j) = sqrt(sum((citys(i,:) - citys(j,:)).^2));
else
D(i,j) = 1e-4;
end
end
end
%% 初始化参数
m = 50; % 蚂蚁数量
alpha = 1; % 信息素重要程度因子
beta = 5; % 启发函数重要程度因子
rho = 0.1; % 信息素挥发因子
Q = 1; % 常系数
Eta = 1./D; % 启发函数
Tau = ones(n,n); % 信息素矩阵
Table = zeros(m,n); % 路径记录表
iter = 1; % 迭代次数初值
iter_max = 200; % 最大迭代次数
Route_best = zeros(iter_max,n); % 各代最佳路径
Length_best = zeros(iter_max,1); % 各代最佳路径的长度
Length_ave = zeros(iter_max,1); % 各代路径的平均长度
%% 迭代寻找最佳路径
while iter <= iter_max
% 随机产生各个蚂蚁的起点城市
start = zeros(m,1);
for i = 1:m
temp = randperm(n); %返回n个[0, n]间的随机元素向量
start(i) = temp(1);
end
Table(:,1) = start;
% 构建解空间
citys_index = 1:n; %访问1~n这n个城市
% 逐个蚂蚁路径选择
for i = 1:m
% 逐个城市路径选择
for j = 2:n %各个蚂蚁都需要访问n-1个城市
tabu = Table(i,1:(j - 1)); % 已访问的城市集合(禁忌表)
allow_index = ~ismember(citys_index,tabu); %判断citys_index中元素有没有在tabu中出现,出现用1表示,否则用0表示。
allow = citys_index(allow_index); % 待访问的城市集合
P = allow;
% 计算城市间转移概率
for k = 1:length(allow)
P(k) = Tau(tabu(end),allow(k))^alpha * Eta(tabu(end),allow(k))^beta;
end
P = P/sum(P);
% 轮盘赌法选择下一个访问城市
Pc = cumsum(P); %返回矩阵不同维数的累加
target_index = find(Pc >= rand); %选择下一个访问城市,往往转移概率大的城市被选中的概率也更大。
target = allow(target_index(1));
Table(i,j) = target; %已选定的下一个待访问城市
end
end
% 计算各个蚂蚁的路径距离
Length = zeros(m,1);
for i = 1:m
Route = Table(i,:);
for j = 1:(n - 1)
Length(i) = Length(i) + D(Route(j),Route(j + 1));
end
Length(i) = Length(i) + D(Route(n),Route(1)); %构成环
end
% 计算最短路径距离及平均距离
if iter == 1
[min_Length,min_index] = min(Length);
Length_best(iter) = min_Length;
Length_ave(iter) = mean(Length);
Route_best(iter,:) = Table(min_index,:); %Table,访问城市列表,也就是路径记录表
else
[min_Length,min_index] = min(Length);
Length_best(iter) = min(Length_best(iter - 1),min_Length);
Length_ave(iter) = mean(Length);
if Length_best(iter) == min_Length
Route_best(iter,:) = Table(min_index,:);
else
Route_best(iter,:) = Route_best((iter-1),:);
end
end
% 更新信息素
Delta_Tau = zeros(n,n);
% 逐个蚂蚁计算
for i = 1:m
% 逐个城市计算
for j = 1:(n - 1)
Delta_Tau(Table(i,j),Table(i,j+1)) = Delta_Tau(Table(i,j),Table(i,j+1)) + Q/Length(i);
end
Delta_Tau(Table(i,n),Table(i,1)) = Delta_Tau(Table(i,n),Table(i,1)) + Q/Length(i);
end
Tau = (1-rho) * Tau + Delta_Tau; %所有蚂蚁在各连接路径上的信息素浓度,不同迭代层间有关联
% 迭代次数加1,清空路径记录表
iter = iter + 1;
Table = zeros(m,n);
end
%% 结果显示
[Shortest_Length,index] = min(Length_best);
Shortest_Route = Route_best(index,:);
disp(['最短距离:' num2str(Shortest_Length)]);
disp(['最短路径:' num2str([Shortest_Route Shortest_Route(1)])]);
%% 绘图
figure(1)
plot([citys(Shortest_Route,1);citys(Shortest_Route(1),1)],...
[citys(Shortest_Route,2);citys(Shortest_Route(1),2)],'o-');
grid on
for i = 1:size(citys,1)
text(citys(i,1),citys(i,2),[' ' num2str(i)]);
end
text(citys(Shortest_Route(1),1),citys(Shortest_Route(1),2),' 起点');
text(citys(Shortest_Route(end),1),citys(Shortest_Route(end),2),' 终点');
xlabel('城市位置横坐标')
ylabel('城市位置纵坐标')
title(['蚁群算法优化路径(最短距离:' num2str(Shortest_Length) ')'])
figure(2)
plot(1:iter_max,Length_best,'b',1:iter_max,Length_ave,'r:')
legend('最短距离','平均距离')
xlabel('迭代次数')
ylabel('距离')
title('各代最短距离与平均距离对比')
实验结果: