当前位置:文档之家› affinity propagation算法Matlab代码实现

affinity propagation算法Matlab代码实现

affinity propagation算法Matlab代码实现
affinity propagation算法Matlab代码实现

%APCLUSTER Affinity Propagation Clustering (Frey/Dueck, Science 2007) % [idx,netsim,dpsim,expref]=APCLUSTER(s,p) clusters data, using a set

% of real-valued pairwise data point similarities as input. Clusters

% are each represented by a cluster center data point (the "exemplar"). % The method is iterative and searches for clusters so as to maximize

% an objective function, called net similarity.

%

% For N data points, there are potentially N^2-N pairwise similarities;

% this can be input as an N-by-N matrix 's', where s(i,k) is the

% similarity of point i to point k (s(i,k) needn抰equal s(k,i)). In

% fact, only a smaller number of relevant similarities are needed; if

% only M similarity values are known (M < N^2-N) they can be input as % an M-by-3 matrix with each row being an (i,j,s(i,j)) triple.

%

% APCLUSTER automatically determines the number of clusters based on % the input preference 'p', a real-valued N-vector. p(i) indicates the

% preference that data point i be chosen as an exemplar. Often a good

% choice is to set all preferences to median(s); the number of clusters

% identified can be adjusted by changing this value accordingly. If 'p'

% is a scalar, APCLUSTER assumes all preferences are that shared value. %

% The clustering solution is returned in idx. idx(j) is the index of

% the exemplar for data point j; idx(j)==j indicates data point j

% is itself an exemplar. The sum of the similarities of the data points to % their exemplars is returned as dpsim, the sum of the preferences of

% the identified exemplars is returned in expref and the net similarity

% objective function returned is their sum, i.e. netsim=dpsim+expref.

%

% [ ... ]=apcluster(s,p,'NAME',VALUE,...) allows you to specify

% optional parameter name/value pairs as follows:

%

% 'maxits' maximum number of iterations (default: 1000)

% 'convits' if the estimated exemplars stay fixed for convits

% iterations, APCLUSTER terminates early (default: 100)

% 'dampfact' update equation damping level in [0.5, 1). Higher % values correspond to heavy damping, which may be needed % if oscillations occur. (default: 0.9)

% 'plot' (no value needed) Plots netsim after each iteration

% 'details' (no value needed) Outputs iteration-by-iteration

% details (greater memory requirements)

% 'nonoise' (no value needed) APCLUSTER adds a small amount of % noise to 's' to prevent degenerate cases; this disables that.

%

% Copyright (c) B.J. Frey & D. Dueck (2006). This software may be

% freely used and distributed for non-commercial purposes.

% (RUN APCLUSTER WITHOUT ARGUMENTS FOR DEMO CODE)

function [idx,netsim,dpsim,expref]=apcluster(s,p,varargin);

if nargin==0, % display demo

fprintf('Affinity Propagation (APCLUSTER) sample/demo code\n\n');

fprintf('N=100; x=rand(N,2); % Create N, 2-D data points\n');

fprintf('M=N*N-N; s=zeros(M,3); % Make ALL N^2-N similarities\n');

fprintf('j=1;\n');

fprintf('for i=1:N\n');

fprintf(' for k=[1:i-1,i+1:N]\n');

fprintf(' s(j,1)=i; s(j,2)=k; s(j,3)=-sum((x(i,:)-x(k,:)).^2);\n');

fprintf(' j=j+1;\n');

fprintf(' end;\n');

fprintf('end;\n');

fprintf('p=median(s(:,3)); % Set preference to median similarity\n');

fprintf('[idx,netsim,dpsim,expref]=apcluster(s,p,''plot'');\n');

fprintf('fprintf(''Number of clusters: %%d\\n'',length(unique(idx)));\n');

fprintf('fprintf(''Fitness (net similarity): %%g\\n'',netsim);\n');

fprintf('figure; % Make a figures showing the data and the clusters\n');

fprintf('for i=unique(idx)''\n');

fprintf(' ii=find(idx==i); h=plot(x(ii,1),x(ii,2),''o''); hold on;\n');

fprintf(' col=rand(1,3); set(h,''Color'',col,''MarkerFaceColor'',col);\n');

fprintf(' xi1=x(i,1)*ones(size(ii)); xi2=x(i,2)*ones(size(ii)); \n');

fprintf(' line([x(ii,1),xi1]'',[x(ii,2),xi2]'',''Color'',col);\n');

fprintf('end;\n');

fprintf('axis equal tight;\n\n');

return;

end;

start = clock;

% Handle arguments to function

if nargin<2 error('Too few input arguments');

else

maxits=1000; convits=100; lam=0.9; plt=0; details=0; nonoise=0;

i=1;

while i<=length(varargin)

if strcmp(varargin{i},'plot')

plt=1; i=i+1;

elseif strcmp(varargin{i},'details')

details=1; i=i+1;

elseif strcmp(varargin{i},'sparse')

% [idx,netsim,dpsim,expref]=apcluster_sparse(s,p,varargin{:});

fprintf('''sparse'' argument no longer supported; see website for additional software\n\n');

return;

elseif strcmp(varargin{i},'nonoise')

nonoise=1; i=i+1;

elseif strcmp(varargin{i},'maxits')

maxits=varargin{i+1};

i=i+2;

if maxits<=0 error('maxits must be a positive integer'); end;

elseif strcmp(varargin{i},'convits')

convits=varargin{i+1};

i=i+2;

if convits<=0 error('convits must be a positive integer'); end;

elseif strcmp(varargin{i},'dampfact')

lam=varargin{i+1};

i=i+2;

if (lam<0.5)||(lam>=1)

error('dampfact must be >= 0.5 and < 1');

end;

else i=i+1;

end;

end;

end;

if lam>0.9

fprintf('\n*** Warning: Large damping factor in use. Turn on plotting\n');

fprintf(' to monitor the net similarity. The algorithm will\n');

fprintf(' change decisions slowly, so consider using a larger value\n');

fprintf(' of convits.\n\n');

end;

% Check that standard arguments are consistent in size

if length(size(s))~=2 error('s should be a 2D matrix');

elseif length(size(p))>2 error('p should be a vector or a scalar');

elseif size(s,2)==3

tmp=max(max(s(:,1)),max(s(:,2)));

if length(p)==1 N=tmp; else N=length(p); end;

if tmp>N

error('data point index exceeds number of data points');

elseif min(min(s(:,1)),min(s(:,2)))<=0

error('data point indices must be >= 1');

end;

elseif size(s,1)==size(s,2)

N=size(s,1);

if (length(p)~=N)&&(length(p)~=1)

error('p should be scalar or a vector of size N');

end;

else error('s must have 3 columns or be square'); end;

% Construct similarity matrix

if N>3000

fprintf('\n*** Warning: Large memory request. Consider activating\n');

fprintf(' the sparse version of APCLUSTER.\n\n');

end;

if size(s,2)==3 && size(s,1)~=3,

S=-Inf*ones(N,N,class(s));

for j=1:size(s,1), S(s(j,1),s(j,2))=s(j,3); end;

else S=s;

end;

if S==S', symmetric=true; else symmetric=false; end;

realmin_=realmin(class(s)); realmax_=realmax(class(s));

% In case user did not remove degeneracies from the input similarities,

% avoid degenerate solutions by adding a small amount of noise to the

% input similarities

if ~nonoise

rns=randn('state'); randn('state',0);

S=S+(eps*S+realmin_*100).*rand(N,N);

randn('state',rns);

end;

% Place preferences on the diagonal of S

if length(p)==1 for i=1:N S(i,i)=p; end;

else for i=1:N S(i,i)=p(i); end;

end;

% Numerical stability -- replace -INF with -realmax

n=find(S<-realmax_); if ~isempty(n), warning('-INF similarities detected; changing to -REALMAX to ensure numerical stability'); S(n)=-realmax_; end; clear('n');

if ~isempty(find(S>realmax_,1)), error('+INF similarities detected; change to a large positive value (but smaller than +REALMAX)'); end;

% Allocate space for messages, etc

dS=diag(S); A=zeros(N,N,class(s)); R=zeros(N,N,class(s)); t=1;

if plt, netsim=zeros(1,maxits+1); end;

if details

idx=zeros(N,maxits+1);

netsim=zeros(1,maxits+1);

dpsim=zeros(1,maxits+1);

expref=zeros(1,maxits+1);

end;

% Execute parallel affinity propagation updates

e=zeros(N,convits); dn=0; i=0;

if symmetric, ST=S; else ST=S'; end; % saves memory if it's symmetric

while ~dn

i=i+1;

% Compute responsibilities

A=A'; R=R';

for ii=1:N,

old = R(:,ii);

AS = A(:,ii) + ST(:,ii); [Y,I]=max(AS); AS(I)=-Inf;

[Y2,I2]=max(AS);

R(:,ii)=ST(:,ii)-Y;

R(I,ii)=ST(I,ii)-Y2;

R(:,ii)=(1-lam)*R(:,ii)+lam*old; % Damping

R(R(:,ii)>realmax_,ii)=realmax_;

end;

A=A'; R=R';

% Compute availabilities

for jj=1:N,

old = A(:,jj);

Rp = max(R(:,jj),0); Rp(jj)=R(jj,jj);

A(:,jj) = sum(Rp)-Rp;

dA = A(jj,jj); A(:,jj) = min(A(:,jj),0); A(jj,jj) = dA;

A(:,jj) = (1-lam)*A(:,jj) + lam*old; % Damping

end;

% Check for convergence

E=((diag(A)+diag(R))>0); e(:,mod(i-1,convits)+1)=E; K=sum(E);

if i>=convits || i>=maxits,

se=sum(e,2);

unconverged=(sum((se==convits)+(se==0))~=N);

if (~unconverged&&(K>0))||(i==maxits) dn=1; end;

end;

% Handle plotting and storage of details, if requested

if plt||details

if K==0

tmpnetsim=nan; tmpdpsim=nan; tmpexpref=nan; tmpidx=nan;

else

I=find(E); notI=find(~E); [tmp c]=max(S(:,I),[],2); c(I)=1:K; tmpidx=I(c);

tmpdpsim=sum(S(sub2ind([N N],notI,tmpidx(notI))));

tmpexpref=sum(dS(I));

tmpnetsim=tmpdpsim+tmpexpref;

end;

end;

if details

netsim(i)=tmpnetsim; dpsim(i)=tmpdpsim; expref(i)=tmpexpref;

idx(:,i)=tmpidx;

end;

if plt,

netsim(i)=tmpnetsim;

figure(234);

plot(((netsim(1:i)/10)*100)/10,'r-'); xlim([0 i]); % plot barely-finite stuff as infinite

xlabel('# Iterations');

ylabel('Fitness (net similarity) of quantized intermediate solution');

% drawnow;

end;

end; % iterations

I=find((diag(A)+diag(R))>0); K=length(I); % Identify exemplars

if K>0

[tmp c]=max(S(:,I),[],2); c(I)=1:K; % Identify clusters

% Refine the final set of exemplars and clusters and return results

for k=1:K ii=find(c==k); [y j]=max(sum(S(ii,ii),1)); I(k)=ii(j(1)); end; notI=reshape(setdiff(1:N,I),[],1);

[tmp c]=max(S(:,I),[],2); c(I)=1:K; tmpidx=I(c);

tmpdpsim=sum(S(sub2ind([N N],notI,tmpidx(notI))));

tmpexpref=sum(dS(I));

tmpnetsim=tmpdpsim+tmpexpref;

else

tmpidx=nan*ones(N,1); tmpnetsim=nan; tmpexpref=nan;

end;

if details

netsim(i+1)=tmpnetsim; netsim=netsim(1:i+1);

dpsim(i+1)=tmpdpsim; dpsim=dpsim(1:i+1);

expref(i+1)=tmpexpref; expref=expref(1:i+1);

idx(:,i+1)=tmpidx; idx=idx(:,1:i+1);

else

netsim=tmpnetsim; dpsim=tmpdpsim; expref=tmpexpref; idx=tmpidx;

end;

if plt||details

fprintf('\nNumber of exemplars identified: %d (for %d data points)\n',K,N);

fprintf('Net similarity: %g\n',tmpnetsim);

fprintf(' Similarities of data points to exemplars: %g\n',dpsim(end));

fprintf(' Preferences of selected exemplars: %g\n',tmpexpref);

fprintf('Number of iterations: %d\n\n',i);

fprintf('Elapsed time: %g sec\n',etime(clock,start));

end;

if unconverged

fprintf('\n*** Warning: Algorithm did not converge. Activate plotting\n');

fprintf(' so that you can monitor the net similarity. Consider\n');

fprintf(' increasing maxits and convits, and, if oscillations occur\n');

fprintf(' also increasing dampfact.\n\n');

end;

图论算法及其MATLAB程序代码

图论算法及其MATLAB 程序代码 求赋权图G =(V ,E ,F )中任意两点间的最短路的Warshall-Floyd 算法: 设A =(a ij )n ×n 为赋权图G =(V ,E ,F )的矩阵,当v i v j ∈E 时a ij =F (v i v j ),否则取a ii =0,a ij =+∞(i ≠j ),d ij 表示从v i 到v j 点的距离,r ij 表示从v i 到v j 点的最短路中一个点的编号. ①赋初值.对所有i ,j ,d ij =a ij ,r ij =j .k =1.转向② ②更新d ij ,r ij .对所有i ,j ,若d ik +d k j <d ij ,则令d ij =d ik +d k j ,r ij =k ,转向③. ③终止判断.若d ii <0,则存在一条含有顶点v i 的负回路,终止;或者k =n 终止;否则令k =k +1,转向②. 最短路线可由r ij 得到. 例1求图6-4中任意两点间的最短路. 解:用Warshall-Floyd 算法,MATLAB 程序代码如下: n=8;A=[0281Inf Inf Inf Inf 206Inf 1Inf Inf Inf 8607512Inf 1Inf 70Inf Inf 9Inf Inf 15Inf 03Inf 8 Inf Inf 1Inf 3046 Inf Inf 29Inf 403 Inf Inf Inf Inf 8630];%MATLAB 中,Inf 表示∞ D=A;%赋初值 for (i=1:n)for (j=1:n)R(i,j)=j;end ;end %赋路径初值 for (k=1:n)for (i=1:n)for (j=1:n)if (D(i,k)+D(k,j)

Floyd算法Matlab程序

Floyd算法Matlab程序第一种: %floyd.m %采用floyd算法计算图a中每对顶点最短路 %d是矩离矩阵 %r是路由矩阵 function ,d,r,=floyd(a) n=size(a,1); d=a; for i=1:n for j=1:n r(i,j)=j; end end r for k=1:n for i=1:n for j=1:n if d(i,k)+d(k,j)

end k d r end 第二种: %Floyd算法 %解决最短路径问题,是用来调用的函数头文件 %[D,path]=floyd(a) %输入参数a是求图的带权邻接矩阵,D(i,j)表示i到j的最短距 离,path(i,j)i,j之间最短路径上顶点i的后继点 %[D,path,min1,path1]=floyd(a,i,j) %输入参数a是所求图的带权邻接矩阵,i,j起点终点,min1表示i与j最短距离,path1为最短路径function [D,path,min1,path1]=floyd(a,start,terminal) D=a;n=size(D,1);path=zeros(n,n); for i=1:n for j=1:n if D(i,j)~=inf path(i,j)=j; end end end for k=1:n for i=1:n

for j=1:n if D(i,k)+D(k,j)

蚁群算法TSP问题matlab源代码

function [R_best,L_best,L_ave,Shortest_Route,Shortest_Length]=ACATSP(C,NC_max,m,Alpha,Beta ,Rho,Q) %%===================================================== ==================== %% ACATSP.m %% Ant Colony Algorithm for Traveling Salesman Problem %% ChengAihua,PLA Information Engineering University,ZhengZhou,China %% Email:aihuacheng@https://www.doczj.com/doc/274522875.html, %% All rights reserved %%------------------------------------------------------------------------- %% 主要符号说明 %% C n个城市的坐标,n×4的矩阵 %% NC_max 最大迭代次数 %% m 蚂蚁个数 %% Alpha 表征信息素重要程度的参数 %% Beta 表征启发式因子重要程度的参数 %% Rho 信息素蒸发系数 %% Q 信息素增加强度系数 %% R_best 各代最佳路线 %% L_best 各代最佳路线的长度 %%===================================================== ==================== %%第一步:变量初始化 n=size(C,1);%n表示问题的规模(城市个数) D=zeros(n,n);%D表示完全图的赋权邻接矩阵 for i=1:n for j=1:n if i~=j D(i,j)=max( ((C(i,1)-C(j,1))^2+(C(i,2)-C(j,2))^2)^0.5,min(abs(C(i,3)-C(j,3)),144- abs(C(i,3)-C(j,3))) );%计算城市间距离 else D(i,j)=eps; end D(j,i)=D(i,j); end end Eta=1./D;%Eta为启发因子,这里设为距离的倒数 Tau=ones(n,n);%Tau为信息素矩阵 Tabu=zeros(m,n);%存储并记录路径的生成 NC=1;%迭代计数器 R_best=zeros(NC_max,n);%各代最佳路线

Floyd算法_计算最短距离矩阵和路由矩阵_查询最短距离和路由_matlab实验报告

实验四:Floyd 算法 一、实验目的 利用MATLAB 实现Floyd 算法,可对输入的邻接距离矩阵计算图中任意两点间的最短距离矩阵和路由矩阵,且能查询任意两点间的最短距离和路由。 二、实验原理 Floyd 算法适用于求解网络中的任意两点间的最短路径:通过图的权值矩阵求出任意两点间的最短距离矩阵和路由矩阵。优点是容易理解,可以算出任意两个节点之间最短距离的算法,且程序容易实现,缺点是复杂度达到,不适合计算大量数据。 Floyd 算法可描述如下: 给定图G 及其边(i , j )的权w i, j (1≤i≤n ,1≤j≤n) F0:初始化距离矩阵W(0)和路由矩阵R(0)。其中: F1:已求得W(k-1)和R(k-1),依据下面的迭代求W(k)和R(k) F2:若k≤n,重复F1;若k>n,终止。 三、实验内容 1、用MATLAB 仿真工具实现Floyd 算法:给定图G 及其边(i , j )的权 w i , j (1≤i≤n ,1≤j≤n) ,求出其各个端点之间的最小距离以及路由。 (1)尽可能用M 函数分别实现算法的关键部分,用M 脚本来进行算法结 果验证; (2)分别用以下两个初始距离矩阵表示的图进行算法验证:

分别求出W(7)和R(7)。 2、根据最短路由矩阵查询任意两点间的最短距离和路由 (1)最短距离可以从最短距离矩阵的ω(i,j)中直接得出; (2)相应的路由则可以通过在路由矩阵中查找得出。由于该程序中使用的是前向矩阵,因此在查找的过程中,路由矩阵中r(i,j)对应的值为Vi 到Vj 路由上的下一个端点,这样再代入r(r(i,j),j),可得到下下个端点,由此不断循环下去,即可找到最终的路由。 (3)对图1,分别以端点对V4 和V6, V3 和V4 为例,求其最短距离和路由;对图2,分别以端点对V1 和V7,V3 和V5,V1 和V6 为例,求其最短距离和路由。 3、输入一邻接权值矩阵,求解最短距离和路由矩阵,及某些点间的最短路径。 四、采用的语言 MatLab 源代码: 【func1.m】 function [w r] = func1(w) n=length(w); x = w; r = zeros(n,1);%路由矩阵的初始化 for i=1:1:n for j=1:1:n if x(i,j)==inf r(i,j)=0; else r(i,j)=j; end, end end; %迭代求出k次w值 for k=1:n a=w; s = w; for i=1:n

蚁群算法matlab程序代码

先新建一个主程序M文件ACATSP.m 代码如下: function [R_best,L_best,L_ave,Shortest_Route,Shortest_Length]=ACATSP(C,NC_max,m,Alpha,Beta,Rho,Q) %%================================================== ======================= %% 主要符号说明 %% C n个城市的坐标,n×2的矩阵 %% NC_max 蚁群算法MATLAB程序最大迭代次数 %% m 蚂蚁个数 %% Alpha 表征信息素重要程度的参数 %% Beta 表征启发式因子重要程度的参数 %% Rho 信息素蒸发系数 %% Q 表示蚁群算法MATLAB程序信息素增加强度系数 %% R_best 各代最佳路线 %% L_best 各代最佳路线的长度 %%================================================== =======================

%% 蚁群算法MATLAB程序第一步:变量初始化 n=size(C,1);%n表示问题的规模(城市个数) D=zeros(n,n);%D表示完全图的赋权邻接矩阵 for i=1:n for j=1:n if i~=j D(i,j)=((C(i,1)-C(j,1))^2+(C(i,2)-C(j,2))^2)^0.5; else D(i,j)=eps; % i = j 时不计算,应该为0,但后面的启发因子要取倒数,用eps(浮点相对精度)表示 end D(j,i)=D(i,j); %对称矩阵 end end Eta=1./D; %Eta为启发因子,这里设为距离的倒数 Tau=ones(n,n); %Tau为信息素矩阵 Tabu=zeros(m,n); %存储并记录路径的生成

matlab图论程序算法大全

精心整理 图论算法matlab实现 求最小费用最大流算法的 MATLAB 程序代码如下: n=5;C=[0 15 16 0 0 0 0 0 13 14 for while for for(i=1:n)for(j=1:n)if(C(i,j)>0&f(i,j)==0)a(i,j)=b(i,j); elseif(C(i,j)>0&f(i,j)==C(i,j))a(j,i)=-b(i,j); elseif(C(i,j)>0)a(i,j)=b(i,j);a(j,i)=-b(i,j);end;end;end for(i=2:n)p(i)=Inf;s(i)=i;end %用Ford 算法求最短路, 赋初值 for(k=1:n)pd=1; %求有向赋权图中vs 到vt 的最短路

for(i=2:n)for(j=1:n)if(p(i)>p(j)+a(j,i))p(i)=p(j)+a(j,i);s(i)=j;pd=0;end ;end;end if(pd)break;end;end %求最短路的Ford 算法结束 if(p(n)==Inf)break;end %不存在vs 到vt 的最短路, 算法终止. 注意在求最小费用最大流时构造有 while if elseif if if pd=0; 值 t=n; if elseif if(s(t)==1)break;end %当t 的标号为vs 时, 终止调整过程 t=s(t);end if(pd)break;end%如果最大流量达到预定的流量值 wf=0; for(j=1:n)wf=wf+f(1,j);end;end %计算最大流量 zwf=0;for(i=1:n)for(j=1:n)zwf=zwf+b(i,j)*f(i,j);end;end%计算最小费用

蚁群算法MATLAB代码

function [y,val]=QACStic load att48 att48; MAXIT=300; % 最大循环次数 NC=48; % 城市个数 tao=ones(48,48);% 初始时刻各边上的信息最为1 rho=0.2; % 挥发系数 alpha=1; beta=2; Q=100; mant=20; % 蚂蚁数量 iter=0; % 记录迭代次数 for i=1:NC % 计算各城市间的距离 for j=1:NC distance(i,j)=sqrt((att48(i,2)-att48(j,2))^2+(att48(i,3)-att48(j,3))^2); end end bestroute=zeros(1,48); % 用来记录最优路径 routelength=inf; % 用来记录当前找到的最优路径长度 % for i=1:mant % 确定各蚂蚁初始的位置 % end for ite=1:MAXIT for ka=1:mant %考查第K只蚂蚁 deltatao=zeros(48,48); % 第K只蚂蚁移动前各边上的信息增量为零 [routek,lengthk]=travel(distance,tao,alpha,beta); if lengthk

Floyd算法_计算最短距离矩阵和路由矩阵_查询最短距离和路由_matlab实验报告

一、实验目的 利用MATLAB实现Floyd算法,可对输入的邻接距离矩阵计算图中任意两点间的最短距离矩阵和路由矩阵,且能查询任意两点间的最短距离和路由。 二、实验原理 Floyd 算法适用于求解网络中的任意两点间的最短路径:通过图的权值矩阵求出任意两点间的最短距离矩阵和路由矩阵。优点是容易理解,可以算出任意两个 节点之间最短距离的算法,且程序容易实现,缺点是复杂度达到,不适合计算大量数据。 Floyd 算法可描述如下: 给定图G及其边(i , j ) 的权w, j (1 < i < n ,1 n,终止。?? 三、实验内容 1、用MATLAB仿真工具实现Floyd算法:给定图G及其边(i , j ) 的权 w, j (1 < i < n ,1 < j < n),求出其各个端点之间的最小距离以及路由。 (1)尽可能用 M 函数分别实现算法的关键部分,用 M 脚本来进行算法结果验证; (2)分别用以下两个初始距离矩阵表示的图进行算法验证: 分别求出WT和R7)。 2、根据最短路由矩阵查询任意两点间的最短距离和路由 (1)最短距离可以从最短距离矩阵的3 (i,j)中直接得出; (2)相应的路由则可以通过在路由矩阵中查找得出。由于该程序中使用的是前向矩阵,因此在查找的过程中,路由矩阵中r(i,j) 对应的值为Vi到Vj路由上的下一个端点,这样再代入r(r(i,j),j) ,可得到下下个端点,由此不断循环下去,即可找到最终的路由。 (3)对图1,分别以端点对V4 和V6, V3 和V4 为例,求其最短距离和路由;对图2,分别以端点对V1和V7, V3和V5, V1和V6为例,求其最短距离和路由。 3、输入一邻接权值矩阵,求解最短距离和路由矩阵,及某些点间的最短路径。

图论算法及其MATLAB程序代码

图论算法及其MATLAB程序代码 求赋权图G = (V, E , F )中任意两点间的最短路的Warshall-Floyd算法: 设A = (a ij )n×n为赋权图G = (V, E , F )的矩阵, 当v i v j∈E时a ij= F (v i v j), 否则取a ii=0, a ij = +∞(i≠j ), d ij表示从v i到v j点的距离, r ij表示从v i到v j点的最短路中一个点的编号. ①赋初值. 对所有i, j, d ij = a ij, r ij = j. k = 1. 转向② ②更新d ij, r ij . 对所有i, j, 若d ik + d k j<d ij, 则令d ij = d ik + d k j, r ij = k, 转向③. ③终止判断. 若d ii<0, 则存在一条含有顶点v i的负回路, 终止; 或者k = n终止; 否则令k = k + 1, 转向②. 最短路线可由r ij得到. 例1求图6-4中任意两点间的最短路. 图6-4 解:用Warshall-Floyd算法, MA TLAB程序代码如下: n=8;A=[0 2 8 1 Inf Inf Inf Inf 2 0 6 Inf 1 Inf Inf Inf 8 6 0 7 5 1 2 Inf 1 Inf 7 0 Inf Inf 9 Inf Inf 1 5 Inf 0 3 Inf 8 Inf Inf 1 Inf 3 0 4 6 Inf Inf 2 9 Inf 4 0 3 Inf Inf Inf Inf 8 6 3 0]; % MATLAB中, Inf表示∞ D=A; %赋初值 for(i=1:n)for(j=1:n)R(i,j)=j;end;end%赋路径初值 for(k=1:n)for(i=1:n)for(j=1:n)if(D(i,k)+D(k,j)

基于蚁群算法的MATLAB实现

基于蚁群算法的机器人路径规划MATLAB源代码 基本思路是,使用离散化网格对带有障碍物的地图环境建模,将地图环境转化为邻接矩阵,最后使用蚁群算法寻找最短路径。 function [ROUTES,PL,Tau]=ACASPS(G,Tau,K,M,S,E,Alpha,Beta,Rho,Q) %% --------------------------------------------------------------- % ACASP.m % 基于蚁群算法的机器人路径规划 % GreenSim团队——专业级算法设计&代写程序 % 欢迎访问GreenSim团队主页→https://www.doczj.com/doc/274522875.html,/greensim %% --------------------------------------------------------------- % 输入参数列表 % G 地形图为01矩阵,如果为1表示障碍物 % Tau 初始信息素矩阵(认为前面的觅食活动中有残留的信息素) % K 迭代次数(指蚂蚁出动多少波) % M 蚂蚁个数(每一波蚂蚁有多少个) % S 起始点(最短路径的起始点) % E 终止点(最短路径的目的点) % Alpha 表征信息素重要程度的参数 % Beta 表征启发式因子重要程度的参数 % Rho 信息素蒸发系数 % Q 信息素增加强度系数 % % 输出参数列表 % ROUTES 每一代的每一只蚂蚁的爬行路线 % PL 每一代的每一只蚂蚁的爬行路线长度 % Tau 输出动态修正过的信息素 %% --------------------变量初始化---------------------------------- %load D=G2D(G); N=size(D,1);%N表示问题的规模(象素个数) MM=size(G,1); a=1;%小方格象素的边长 Ex=a*(mod(E,MM)-0.5);%终止点横坐标 if Ex==-0.5 Ex=MM-0.5; end Ey=a*(MM+0.5-ceil(E/MM));%终止点纵坐标 Eta=zeros(1,N);%启发式信息,取为至目标点的直线距离的倒数 %下面构造启发式信息矩阵 for i=1:N

Dijkstra、Floyd算法Matlab_Lingo实现

Dijkstra 算法Matlab 实现。 %求一个点到其他各点的最短路径 function [min,path]=dijkstra(w,start,terminal) %W 是邻接矩阵 %start 是起始点 %terminal 是终止点 %min 是最短路径长度 %path 是最短路径 n=size(w,1); label(start)=0; f(start)=start; for i=1:n if i~=start label(i)=inf; end end s(1)=start; u=start; while length(s)(label(u)+w(u,v)) label(v)=(label(u)+w(u,v)); f(v)=u; end end end v1=0; k=inf; for i=1:n ins=0; for j=1:length(s) if i==s(j) ins=1; end end 应用举例: edge=[ 2,3,1,3,3,5,4,4,1,7,6,6,5,5,11,1,8,6,9,10,8,9, 9,10;... 3,4,2,7,5,3,5,11,7,6,7,5,6,11,5,8,1,9,5,11,9,8,10,9;... 3,5,8,5,6,6,1,12,7,9,9,2,2,10,10,8,8,3,7,2,9,9,2,2]; n=11; weight=inf*ones(n,n); for i=1:n weight(i,i)=0; end for i=1:size(edge,2) weight(edge(1,i),edge(2,i))=edge(3,i); end [dis,path]=dijkstra(weight,1,11)

(完整版)蚁群算法matlab程序实例整理

function [y,val]=QACS tic load att48 att48; MAXIT=300; % 最大循环次数 NC=48; % 城市个数 tao=ones(48,48);% 初始时刻各边上的信息最为1 rho=0.2; % 挥发系数 alpha=1; beta=2; Q=100; mant=20; % 蚂蚁数量 iter=0; % 记录迭代次数 for i=1:NC % 计算各城市间的距离 for j=1:NC distance(i,j)=sqrt((att48(i,2)-att48(j,2))^2+(att48(i,3)-att48(j,3))^2); end end bestroute=zeros(1,48); % 用来记录最优路径 routelength=inf; % 用来记录当前找到的最优路径长度 % for i=1:mant % 确定各蚂蚁初始的位置 % end for ite=1:MAXIT for ka=1:mant %考查第K只蚂蚁 deltatao=zeros(48,48); % 第K只蚂蚁移动前各边上的信息增量为零 [routek,lengthk]=travel(distance,tao,alpha,beta); if lengthk

蚁群算法最短路径通用Matlab程序(附图)

蚁群算法最短路径通用Matlab程序(附图) function [ROUTES,PL,Tau]=ACASP(G,Tau,K,M,S,E,Alpha,Beta,Rho,Q) %% --------------------------------------------------------------- % ACASP.m % 蚁群算法动态寻路算法 % ChengAihua,PLA Information Engineering University,ZhengZhou,China % Email:aihuacheng@https://www.doczj.com/doc/274522875.html, % All rights reserved %% --------------------------------------------------------------- % 输入参数列表 % G 地形图为01矩阵,如果为1表示障碍物 % Tau 初始信息素矩阵(认为前面的觅食活动中有残留的信息素) % K 迭代次数(指蚂蚁出动多少波) % M 蚂蚁个数(每一波蚂蚁有多少个) % S 起始点(最短路径的起始点) % E 终止点(最短路径的目的点) % Alpha 表征信息素重要程度的参数 % Beta 表征启发式因子重要程度的参数 % Rho 信息素蒸发系数 % Q 信息素增加强度系数 % % 输出参数列表 % ROUTES 每一代的每一只蚂蚁的爬行路线 % PL 每一代的每一只蚂蚁的爬行路线长度 % Tau 输出动态修正过的信息素 %% --------------------变量初始化---------------------------------- %load D=G2D(G); N=size(D,1);%N表示问题的规模(象素个数) MM=size(G,1); a=1;%小方格象素的边长 Ex=a*(mod(E,MM)-0.5);%终止点横坐标 if Ex==-0.5 Ex=MM-0.5; end Ey=a*(MM+0.5-ceil(E/MM));%终止点纵坐标 Eta=zeros(1,N);%启发式信息,取为至目标点的直线距离的倒数 %下面构造启发式信息矩阵 for i=1:N if ix==-0.5

基于matlab的floyd算法+matlab计算最短路径

基于matlab的floyd算法 matlab计算最短路径 function [d,path]=floyd(a,sp,ep) % floyd - 最短路问题 % % Syntax: [d,path]=floyd(a,sp,ep) % % Inputs: % a - 距离矩阵是指i到j之间的距离,可以是有向的 % sp - 起点的标号 % ep - 终点的标号 % % Outputs: % d - 最短路的距离 % path - 最短路的路径 % a =[ 0 50 inf; 50 0 15 ; Inf 15 0 ];% a(i,j),从节点i到j之间的距离 % [d,path]=floyd(a,2,5) sp=3; ep=1; n=size(a,1); D=a; path=zeros(n,n); for i=1:n for j=1:n

if D(i,j)~=inf path(i,j)=j; %j是i的后续点 end end end for k=1:n for i=1:n for j=1:n if D(i,j)>D(i,k)+D(k,j) D(i,j)=D(i,k)+D(k,j); path(i,j)=path(i,k); end end end end p=[sp]; mp=sp; for k=1:n if mp~=ep d=path(mp,ep); p=[p,d]; mp=d; end end d=D(sp,ep) path=p

试计算下图的最短路径, 1.起点C点,终点A点。 2.起点A点,终点G点。 3.起点D点,终点F点。 试计算下图的最短路径, 1.起点F点,终点A点。 2. 起点E点,终点C点。

蚁群算法最短路径matlab程序

蚁群算法最短路径通用Matlab程序 下面的程序是蚁群算法在最短路中的应用,稍加扩展即可应用于机器人路径规划 function [ROUTES,PL,Tau]=ACASP(G,Tau,K,M,S,E,Alpha,Beta,Rho,Q) %% ---------------------------------------------------------------% ACASP.m % 蚁群算法动态寻路算法 % ChengAihua,PLA Information Engineering University,ZhengZhou,China % Email:aihuacheng@https://www.doczj.com/doc/274522875.html, % All rights reserved %% ---------------------------------------------------------------% 输入参数列表 % G 地形图为01矩阵,如果为1表示障碍物 % Tau 初始信息素矩阵(认为前面的觅食活动中有残留的信息素) % K 迭代次数(指蚂蚁出动多少波) % M 蚂蚁个数(每一波蚂蚁有多少个) % S 起始点(最短路径的起始点) % E 终止点(最短路径的目的点) % Alpha 表征信息素重要程度的参数 % Beta 表征启发式因子重要程度的参数 % Rho 信息素蒸发系数 % Q 信息素增加强度系数 % % 输出参数列表 % ROUTES 每一代的每一只蚂蚁的爬行路线 % PL 每一代的每一只蚂蚁的爬行路线长度 % Tau 输出动态修正过的信息素 %% --------------------变量初始化---------------------------------- %load D=G2D(G); N=size(D,1);%N表示问题的规模(象素个数) MM=size(G,1); a=1;%小方格象素的边长 Ex=a*(mod(E,MM)-0.5);%终止点横坐标 if Ex==-0.5 Ex=MM-0.5; end Ey=a*(MM+0.5-ceil(E/MM));%终止点纵坐标 Eta=zeros(1,N);%启发式信息,取为至目标点的直线距离的倒数 %下面构造启发式信息矩阵 for i=1:N if ix==-0.5 ix=MM-0.5;

蚁群算法解决TSP问题的MATLAB程序

蚁群算法TSP(旅行商问题)通用matlab程序 function [R_best,L_best,L_ave,Shortest_Route,Shortest_Length]=ACATSP(C,NC_max,m,Alpha, Beta,Rho,Q) %%=================================================================== %% ACA TSP.m %% Ant Colony Algorithm for Traveling Salesman Problem %% ChengAihua,PLA Information Engineering University,ZhengZhou,China %% Email:aihuacheng@https://www.doczj.com/doc/274522875.html, %% All rights reserved %%------------------------------------------------------------------------- %% 主要符号说明 %% C n个城市的坐标,n×2的矩阵 %% NC_max 最大迭代次数 %% m 蚂蚁个数 %% Alpha 表征信息素重要程度的参数 %% Beta 表征启发式因子重要程度的参数 %% Rho 信息素蒸发系数 %% Q 信息素增加强度系数 %% R_best 各代最佳路线 %% L_best 各代最佳路线的长度 %%=================================================================== %%第一步:变量初始化 n=size(C,1);%n表示问题的规模(城市个数) D=zeros(n,n);%D表示完全图的赋权邻接矩阵 for i=1:n for j=1:n if i~=j D(i,j)=((C(i,1)-C(j,1))^2+(C(i,2)-C(j,2))^2)^0.5; else D(i,j)=eps; end D(j,i)=D(i,j); end end Eta=1./D;%Eta为启发因子,这里设为距离的倒数 Tau=ones(n,n);%Tau为信息素矩阵 Tabu=zeros(m,n);%存储并记录路径的生成 NC=1;%迭代计数器 R_best=zeros(NC_max,n);%各代最佳路线 L_best=inf.*ones(NC_max,1);%各代最佳路线的长度 L_ave=zeros(NC_max,1);%各代路线的平均长度

超全图论matlab程序

超全的图论程序 关注微信公众号“超级数学建模”,教你做有料、有趣的数模人 程序一:可达矩阵算法 function P=dgraf(A) n=size(A,1); P=A; for i=2:n P=P+A^i; end P(P~=0)=1; P; 程序二:关联矩阵和邻接矩阵互换算法 function W=incandadf(F,f) if f==0 m=sum(sum(F))/2; n=size(F,1); W=zeros(n,m); k=1; for i=1:n for j=i:n if F(i,j)~=0 W(i,k)=1; W(j,k)=1; k=k+1; end end end elseif f==1 m=size(F,2); n=size(F,1); W=zeros(n,n); for i=1:m a=find(F(:,i)~=0); W(a(1),a(2))=1; W(a(2),a(1))=1; end else fprint('Please imput the right value of f'); end W;

程序三:有向图关联矩阵和邻接矩阵互换算法 function W=mattransf(F,f) if f==0 m=sum(sum(F)); n=size(F,1); W=zeros(n,m); k=1; for i=1:n for j=i:n if F(i,j)~=0 W(i,k)=1; W(j,k)=-1; k=k+1; end end end elseif f==1 m=size(F,2); n=size(F,1); W=zeros(n,n); for i=1:m a=find(F(:,i)~=0); if F(a(1),i)==1 W(a(1),a(2))=1; else W(a(2),a(1))=1; end end else fprint('Please imput the right value of f'); end W;

蚁群算法求解TSP问题MATLAB程序

%% 蚁群算法¨ clear close clc n = 10; % 城市数量 m = 100; % 蚂蚁数量 alfa = 1.5; beta = 2.5; rho = 0.1; Q = 1000; maxgen = 50; x = [2 14 9 6 3 2 4 8 12 5]'; y = [8 9 12 4 1 2 5 8 1 15]'; % x = [37,49,52,20,40,21,17,31,52,51,42,31,5,12,36,52,27,17,13,57,62,42,16,8,7,27,30, 43,58,58,37,38,46,61,62,63,32,45,59,5,10,21,5,30,39,32,25,25,48,56,30]'; % y = [52,49,64,26,30,47,63,62,33,21,41,32,25,42,16,41,23,33,13,58,42,57,57,52,38,68, 48,67,48,27,69,46,10,33,63,69,22,35,15,6,17,10,64,15,10,39,32,55,28,37,40]'; City = [x,y]; % 城市坐标 %% 城市之间的距离 for i = 1:n D(i,:) = ((City(i,1) - City(:,1)).^2 + (City(i,2) - City(:,2)).^2).^0.5 + eps; end eta = 1./D; % 启发因子 tau = ones(n); % 信息素矩阵 path = zeros(m,n); % 记录路径 for iter = 1: maxgen %% 放置蚂蚁 path(:,1) = randi([1 n],m,1); for i = 2 : n for j = 1 : m visited = path(j,1:i-1); leftcity = setdiff(1:n,visited); %% 计算剩下城市的概率 P = zeros(1,length(leftcity)); for k = 1:length(leftcity) P(k) = tau(visited(end),leftcity(k))^alfa*eta(visited(end),leftcity(k))^beta;%判断是否有重复城市 end P1 = sum(P); Pk = P / P1; P = cumsum(Pk); r = rand; index = find(P >= r); nextcity = leftcity(index(1)); path(j,i) = nextcity; end end for flag = 1:m if length(unique(path(flag,:))) ~= n % keyboard; end end if iter >= 2 path(1,:) = Pathbest(iter-1,:); end for i = 1 : m

Floyd最短路算法

中国数学建模-数学工具-Floyd最短路算法的MATLAB程序 wh-ee 重登录隐身用户控制面板搜索风格论坛状态论坛展区社区服务社区休闲网站首页退出 >> Matlab,Mathematica,maple,几何画板,word,sas,spss...使用方法技巧我的收件箱(0) 中国数学建模→数学建模→数学工具→Floyd最短路算法的MATLAB程序 您是本帖的第90 个阅读者 * 贴子主题:Floyd最短路算法的MATLAB程序 hanlong 等级:新手上路 文章:28 积分:125 门派:☆nudter☆ 注册:2004-5-20 鲜花(1) 鸡蛋(0) 楼主 Floyd最短路算法的MATLAB程序 %floyd.m %采用floyd算法计算图a中每对顶点最短路 %d是矩离矩阵 %r是路由矩阵 function [d,r]=floyd(a) n=size(a,1); d=a; for i=1:n for j=1:n r(i,j)=j; end end r for k=1:n for i=1:n for j=1:n if d(i,k)+d(k,j)

r(i,j)=r(i,k) end end end k d r end 2004-5-24 1:04:35 wanggaoyang 等级:新手上路 文章:9 积分:106 门派:☆nudter☆ 注册:2004-5-24 第2 楼 顶 2004-5-28 23:06:16 feifei7 头衔:蓝魂行者 等级:新手上路 文章:36 积分:258 门派:桃花岛 注册:2004-4-27 第3 楼 ^

蚁群算法的Matlab程序

#include #include #include #include #define citynumber 5 #define Q 100 #define p 0.5 #define NM2 1000 #define A 1 #define B 5 int ccdi=-1;//全局变量,用在myrand()中 float myrand()//产生0-1随机数,100个,每调用一次,结果不同 {srand(time(0)); float my[100]; ccdi++; if (ccdi==100) ccdi=0; for(int mi=0;mi<100;mi++) {float fav=rand()%10000; my[mi]=fav/10000;} return my[ccdi]; } double fpkij(double T[citynumber][citynumber],double n[citynumber][citynumber],int tabu[citynumber][citynumber],int k,int s,int i,int j ) //定义函数用于计算Pij { //double A=0.5,B=0.5; double sumup,pkij,sumdown; sumdown=0; for(int aTi=0;aTi

相关主题
文本预览
相关文档 最新文档