%1.导入数据
clear all;
clc
t0 = clock;%开始计时
citys=xlsread('POI信息表.xls','Sheet1');
[Data,name]=xlsread('POI信息表.xls','Sheet2');
[m2]=size(citys,1);
D=zeros(m2,m2);
IV=0;
for i=1:m2
for j=1:m2
IV=abs(citys(i,8)-(citys(i,9)+citys(i,10)))*log(citys(i,8)/(citys(i,9)+citys(i,10)));
end
end
for i=1:m2
for j=1:m2
if citys(i,8)==1
citys(i,8)=0.99;
citys(i,10)=0.01;
end
end
end
for i=1:m2
for j=1:m2
if i~=j
D(i,j)=sqrt((1-(abs(citys(i,8)-(citys(i,9)+citys(i,10)))*log(citys(i,8)/(citys(i,9)+citys(i,10)))+ abs(citys(j,8)-(citys(j,9)+citys(j,10)))*log(citys(j,8)/(citys(j,9)+citys(j,10)))/IV))*((citys(i,1)-citys(j,1))^2+(citys(i,2)-citys(j,2)).^2)+(abs(citys(i,8)-(citys(i,9)+citys(i,10)))*log(citys(i,8)/(citys(i,9)+citys(i,10)))+ abs(citys(j,8)-(citys(j,9)+citys(j,10)))*log(citys(j,8)/(citys(j,9)+citys(j,10)))/IV)*(citys(i,11)-citys(j,11))^2+(citys(i,12)-citys(j,12))^2+(citys(i,13)-citys(j,13))^2+(citys(i,14)-citys(j,14))^2+(citys(i,15)-citys(j,15))^2);
else
D(i,j)=1e-4;
end
end
end
ratings=xlsread('用户评分表.xls','Sheet1');
[m1,n1]=size(ratings);
% 注意,svd算法当中要求不能是稀疏矩阵 [U,S,V]=svd(ratings)
item_Sim=zeros(n1,n1);
u1=xlsread('用户评分平均值表.xls','Sheet2');
for i=1:n1
for k=i+1:n1
for j=1:m1
if ~isnan(ratings(j,i))&&~isnan(ratings(j,k))
current_sum=0;
current_sum=current_sum+(ratings(j,i)-u1(1,i))*(ratings(j,k)-u1(1,k));
for i1=1:n1
for j1=1:n1
item_Sim(i1,j1)=current_sum;
end
end
end
end
end
end
item_Sim1=zeros(n1,n1);
for i=1:n1
for k=i+1:n1
for j=1:m1
if ~isnan(ratings(j,i))&&~isnan(ratings(j,k))
current_sum1=0;
current_sum2=0;
current_sum1=current_sum1+(ratings(j,i)-u1(1,i))^2;
current_sum2=current_sum2+(ratings(j,k)-u1(1,k))^2;
for i2=1:n1
for j2=1:n1
item_Sim1(i2,j2)=sqrt(current_sum1*current_sum2);
end
end
end
end
end
end
for i3=1:n1
for j3=1:n1
item_Sim(i3,j3)=item_Sim(i3,j3)/item_Sim1(i3,j3);
end
end
Sim=zeros(n1,n1);
for i=1:n1
for j=1:n1
Sim(i,j)=item_Sim(i,j)/(1+D(i,j));
end
end
% 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;%用很小的值代替0 公式需要
% end
% end
%end
%3.初始化参数
m=16;%蚂蚁数量
alpha=1;%信息素重要程度因子
beta=2;%启发函数重要程度因子
rho=0.1;%信息素挥发因子
Q=1;%常系数
Eta=1./Sim;%启发函数
Tau=1000*ones(n1,n1);%信息素矩阵
Table=zeros(m,n1);%路径记录表 M个蚂蚁走过的路径
iter=1;%迭代次数初值
iter_max=2000;
Route_best=zeros(iter_max,n1);%各代最佳路径
Length_best=zeros(iter_max,1);%各代最佳路径的长度
Length_ave=zeros(iter_max,1);%各代路径的平均长度
q0=rand(1,1);
current_max=0;
%4.迭代寻找最佳路径
while iter<=iter_max
%随机产生各个蚂蚁的起点城市
start=zeros(m,1);
for i=1:m %50个蚂蚁随机产生的起始城市位置
temp=randperm(n1);
start(i)=temp(1);
end
Table(:,1)=start;%初始位置
citys_index=1:n1;%城市索引取出来
%逐个蚂蚁路径选择
for i=1:m
%逐个城市路径选择
for j=2:n1 %第一只蚂蚁第一次已经随机选择了一个城市,因此从2开始
tabu=Table(i,1:(j-1));%已访问的城市集合(禁忌表)
allow_index=~ismember(citys_index,tabu);%没有访问过的城市取出来
allow=citys_index(allow_index);%待访问的城市集合
P=allow;
%计算城市间转移概率
if q0>0.95
for ii=1:length(allow)
P(ii)=Tau(tabu(end),allow(ii))^alpha*Eta(tabu(end),allow(ii))^beta;%end代表最后一个元素,对应公式
end
P=P/sum(P);
%轮盘赌法选择下一个访问城市
Pc=cumsum(P);
target_index=find(Pc>=rand);
target=allow(target_index(1));
Table(i,j)=target;%记录下来,添加新访问的城市
else
for iii=1:length(allow)
P(iii)=Tau(tabu(end),allow(iii))^alpha*Eta(tabu(end),allow(iii))^beta;%end代表最后一个元素,对应公式
if current_max
current_max=P(iii);
current_max_index=iii;
end
end
Table(i,j)=current_max_index;
end
end
end
if iter>=2
Table(1,:)=Route_best(iter-1,:);
end
%计算各个蚂蚁的距离路径
Length=zeros(m,1);
for i=1:m
Route=Table(i,:);%每一个蚂蚁的路径取出来
for j=1:(n1-1)
Length(i)=Length(i)+Sim(Route(j),Route(j+1));
end
Length(i)=Length(i)+Sim(Route(n1),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,:);
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
gb_length=max(Length_best);
TauMax=1/(rho*gb_length);
pbest=0.05; %%pbest设置为0.05
pbest=power(pbest,1/n1);
TauMin=TauMax*(1-pbest)/((n1/2-1)*pbest);
%更新信息素
Delta_Tau=zeros(n1,n1);
%逐个蚂蚁计算
for i=1:m
%逐个城市计算
for j=1:(n1-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,n1),Table(i,1))=Delta_Tau(Table(i,n1),Table(i,1))+Q/Length(i);
end
Tau=(1-rho).*Tau+Delta_Tau;
for i=1:n1
for j=1:n1
if Tau(i,j)>TauMax
Tau(i,j)=TauMax;
else if Tau(i,j)
Tau(i,j)=TauMin;
end
end
end
end
%迭代次数加一,清空路径记录表
Table=zeros(m,n1);
iter=iter+1;
end
%5结果显示
[ Shortest_Length,index]=min(Length_best);
Shortest_Route=Route_best(index,:);
Time_Cost=etime(clock,t0);
disp(['最优路径距离:' num2str(Shortest_Length)]);
disp(['最优路径:' [name(Shortest_Route)' name(Shortest_Route(1))]]);
disp(['程序执行时间:' num2str(Time_Cost) '秒']);
%6.绘图
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),name(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('故宫poi位置横坐标');
ylabel('故宫poi位置纵坐标');
title(['蚁群算法优化路径(最优路径距离:' num2str(Shortest_Length) ')']);
figure(2)
plot(1:iter_max,Length_best,'b',1:iter_max,Length_ave,'r:');
legend('最优路径距离','平均距离');
xlabel('迭代次数');
ylabel('距离');
title('各代最优距离与平均距离对比');
figure(3)
xlabel('迭代次数');
ylabel('Recall');
title('优化蚁群算法下各代Recall值变化');
figure(4)
xlabel('迭代次数');
ylabel('Precision');
title('优化蚁群算法下各代Precision值变化');
对于算式 我不知道自己修改的对不对 还是ACS自身缺陷问题 导致算法运行3个POI就出现了停滞
图片2.png (37.76 KB, 下载次数: 3)
2019-10-25 19:33 上传