蚁群算法解决TSP问题、二次分配问题、背包问题,是蚁群算法的经典应用。从mathworks上下载了三个代码,看了注释,对蚁群算法的有了更全面的了解。
% Project Title: Ant Colony Optimization for Traveling Salesman Problem clc; clear; close all; % Problem Definition model=CreateModel(); CostFunction=@(tour) TourLength(tour,model); nVar=model.n; % ACO Parameters MaxIt=300; % Maximum Number of Iterations 最大迭代次数 nAnt=40; % Number of Ants (Population Size) 种群数量 Q=1; tau0=10*Q/(nVar*mean(model.D(:))); % Initial Phromone alpha=1; % Phromone Exponential Weight beta=1; % Heuristic Exponential Weight rho=0.05; % Evaporation Rate蒸发率(信息素损失率) % Initialization eta=1./model.D; % Heuristic Information Matrix 启发信息矩阵 tau=tau0*ones(nVar,nVar); % Phromone Matrix BestCost=zeros(MaxIt,1); % Array to Hold Best Cost Values 保存最好的值的数组 % Empty Ant empty_ant.Tour=[]; empty_ant.Cost=[]; % Ant Colony Matrix ant=repmat(empty_ant,nAnt,1); % Best Ant BestSol.Cost=inf; % ACO Main Loop for it=1:MaxIt % Move Ants for k=1:nAnt ant(k).Tour=randi([1 nVar]); %在[1,nVar]中均匀随机产生一个数 for l=2:nVar i=ant(k).Tour(end); P=tau(i,:).^alpha.*eta(i,:).^beta; P(ant(k).Tour)=0; P=P/sum(P); j=RouletteWheelSelection(P); %轮盘赌 ant(k).Tour=[ant(k).Tour j]; end ant(k).Cost=CostFunction(ant(k).Tour); if ant(k).Cost<BestSol.Cost BestSol=ant(k); end end % Update Phromones 更新信息素 for k=1:nAnt tour=ant(k).Tour; tour=[tour tour(1)]; %#ok for l=1:nVar i=tour(l); j=tour(l+1); tau(i,j)=tau(i,j)+Q/ant(k).Cost; %可以用其他的信息素更新规则 end end % Evaporation tau=(1-rho)*tau; % Store Best Cost BestCost(it)=BestSol.Cost; % Show Iteration Information disp(['Iteration ' num2str(it) ': Best Cost = ' num2str(BestCost(it))]); % Plot Solution figure(1); PlotSolution(BestSol.Tour,model); pause(0.01); end % Results figure; plot(BestCost,'LineWidth',2); xlabel('Iteration'); ylabel('Best Cost'); grid on; % Project Title: Ant Colony Optimization for Traveling Salesman Problem function model=CreateModel() x=[82 91 12 92 63 9 28 55 96 97 15 98 96 49 80 14 42 92 80 96]; y=[66 3 85 94 68 76 75 39 66 17 71 3 27 4 9 83 70 32 95 3 ]; n=numel(x); %元素个数 D=zeros(n,n); %计算邻接矩阵 for i=1:n-1 for j=i+1:n D(i,j)=sqrt((x(i)-x(j))^2+(y(i)-y(j))^2); D(j,i)=D(i,j); end end model.n=n; model.x=x; model.y=y; model.D=D; end function PlotSolution(tour,model) tour=[tour tour(1)]; plot(model.x(tour),model.y(tour),'k-o',... 'MarkerSize',10,... 'MarkerFaceColor','y',... 'LineWidth',1.5); xlabel('x'); ylabel('y'); axis equal; grid on; alpha = 0.1; xmin = min(model.x); xmax = max(model.x); dx = xmax - xmin; xmin = floor((xmin - alpha*dx)/10)*10; xmax = ceil((xmax + alpha*dx)/10)*10; xlim([xmin xmax]); ymin = min(model.y); ymax = max(model.y); dy = ymax - ymin; ymin = floor((ymin - alpha*dy)/10)*10; ymax = ceil((ymax + alpha*dy)/10)*10; ylim([ymin ymax]); end %轮盘赌选择 function j=RouletteWheelSelection(P) r=rand; C=cumsum(P); j=find(r<=C,1,'first'); end %当前解的长度 function L=TourLength(tour,model) n=numel(tour); %tour里面是TSP的遍历路径 tour=[tour tour(1)]; %围成圈 L=0; for i=1:n L=L+model.D(tour(i),tour(i+1)); %累加计算总长度 end end
% Project Title: Ant Colony Optimization for Quadratic Assignment Problem clc; clear; close all; % Problem Definition model=CreateModel(); CostFunction=@(p) MyCost(p,model); nVar=model.n; % ACO Parameters MaxIt=500; % Maximum Number of Iterations 迭代次数 nAnt=50; % Number of Ants (Population Size) 种群数量 Q=1; tau0=10; % Initial Phromone alpha=0.3; % Phromone Exponential Weight--蚂蚁学习历史经验的权重 rho=0.1; % Evaporation Rate蒸发率 % Initialization tau=tau0*ones(model.m,nVar); BestCost=zeros(MaxIt,1); % Array to Hold Best Cost Values % Empty Ant empty_ant.Tour=[]; empty_ant.Cost=[]; % Ant Colony Matrix ant=repmat(empty_ant,nAnt,1); % Best Ant BestSol.Cost=inf; % ACO Main Loop for it=1:MaxIt % Move Ants for k=1:nAnt ant(k).Tour=[]; for l=1:nVar P=tau(:,l).^alpha; P(ant(k).Tour)=0; P=P/sum(P); j=RouletteWheelSelection(P); ant(k).Tour=[ant(k).Tour j]; end ant(k).Cost=CostFunction(ant(k).Tour); %蚂蚁方案的代价只取决于方案本身,不像TSP还取决于邻接边的长短 if ant(k).Cost<BestSol.Cost BestSol=ant(k); end end % Update Phromones for k=1:nAnt tour=ant(k).Tour; for l=1:nVar tau(tour(l),l)=tau(tour(l),l)+Q/ant(k).Cost; end end % Evaporation tau=(1-rho)*tau; % Store Best Cost BestCost(it)=BestSol.Cost; % Show Iteration Information disp(['Iteration ' num2str(it) ': Best Cost = ' num2str(BestCost(it))]); % Plot Solution figure(1); PlotSolution(BestSol.Tour,model); pause(0.01); end % Results figure; plot(BestCost,'LineWidth',2); xlabel('Iteration'); ylabel('Best Cost'); grid on; function model=CreateModel() x=[67 80 62 34 54 36 53 46 39 35 83 58 87 90 83 38 26 78 49 67]; y=[9 81 9 43 89 30 95 87 1 74 85 86 56 86 22 73 36 34 17 37]; m=numel(x); d=zeros(m,m); for p=1:m-1 for q=p+1:m d(p,q)=sqrt((x(p)-x(q))^2+(y(p)-y(q))^2); d(q,p)=d(p,q); end end w=[0 6 6 3 5 5 5 6 0 6 4 -10 3 6 6 6 0 4 5 8 6 3 4 4 0 4 4 100 5 -10 5 4 0 3 4 5 3 8 4 3 0 4 5 6 6 100 4 4 0]; n=size(w,1); model.n=n; model.m=m; model.w=w; %权重 model.x=x; model.y=y; model.d=d; %邻接矩阵 end function z=MyCost(p,model) n=model.n; w=model.w; d=model.d; z=0; for i=1:n-1 for j=i+1:n z=z+w(i,j)*d(p(i),p(j)); end end end function PlotSolution(p,model) x=model.x; y=model.y; plot(x,y,'o','MarkerSize',20,'Color',[0.4 0.5 0.9]); hold on; plot(x(p),y(p),'sk','MarkerSize',16,'MarkerFaceColor','y'); n=model.n; for i=1:n text(x(p(i)),y(p(i)),num2str(i),... 'HorizontalAlignment','center',... 'VerticalAlignment','middle'); end title('Quadratic Assignment Problem'); hold off; axis equal; grid on; alpha = 0.1; xmin = min(x); xmax = max(x); dx = xmax - xmin; xmin = floor((xmin - alpha*dx)/10)*10; xmax = ceil((xmax + alpha*dx)/10)*10; xlim([xmin xmax]); ymin = min(y); ymax = max(y); dy = ymax - ymin; ymin = floor((ymin - alpha*dy)/10)*10; ymax = ceil((ymax + alpha*dy)/10)*10; ylim([ymin ymax]); end function j=RouletteWheelSelection(P) r=rand; C=cumsum(P); j=find(r<=C,1,'first'); end
% Project Title: Ant Colony Optimization for Binary Knapsack Problem clc; clear; close all; % Problem Definition model=CreateModel(); CostFunction=@(x) MyCost(x,model); nVar=model.n; % ACO Parameters MaxIt=300; % Maximum Number of Iterations nAnt=40; % Number of Ants (Population Size) Q=1; tau0=0.1; % Initial Phromone alpha=1; % Phromone Exponential Weight beta=0.02; % Heuristic Exponential Weight启发式权重指数 rho=0.1; % Evaporation Rate蒸发率 % Initialization N=[0 1]; eta=[model.w./model.v model.v./model.w]; % Heuristic Information tau=tau0*ones(2,nVar); % Phromone Matrix BestCost=zeros(MaxIt,1); % Array to Hold Best Cost Values % Empty Ant empty_ant.Tour=[]; empty_ant.x=[]; empty_ant.Cost=[]; empty_ant.Sol=[]; % Ant Colony Matrix ant=repmat(empty_ant,nAnt,1); % Best Ant BestSol.Cost=inf; % ACO Main Loop for it=1:MaxIt % Move Ants for k=1:nAnt ant(k).Tour=[]; for l=1:nVar P=tau(:,l).^alpha.*eta(:,l).^beta; P=P/sum(P); j=RouletteWheelSelection(P); ant(k).Tour=[ant(k).Tour j]; end ant(k).x=N(ant(k).Tour); [ant(k).Cost, ant(k).Sol]=CostFunction(ant(k).x); if ant(k).Cost<BestSol.Cost BestSol=ant(k); end end % Update Phromones for k=1:nAnt tour=ant(k).Tour; for l=1:nVar tau(tour(l),l)=tau(tour(l),l)+Q/ant(k).Cost; end end % Evaporation tau=(1-rho)*tau; % Store Best Cost BestCost(it)=BestSol.Cost; % Show Iteration Information if BestSol.Sol.IsFeasible FeasiblityFlag = '*'; else FeasiblityFlag = ''; end disp(['Iteration ' num2str(it) ': Best Cost = ' num2str(BestCost(it)) ' ' FeasiblityFlag]); end % Results figure; plot(BestCost,'LineWidth',2); xlabel('Iteration'); ylabel('Best Cost'); grid on; function model=CreateModel() v=[391 444 250 330 246 400 150 266 268 293 471 388 364 493 202 161 410 270 384 486]; w=[55 52 59 24 52 46 45 34 34 59 59 28 57 21 47 66 64 42 22 23]; n=numel(v); W=500; model.n=n; model.v=v; model.w=w; model.W=W; end function [z, sol]=MyCost(x,model) v=model.v; w=model.w; W=model.W; V1=sum(v.*x); W1=sum(w.*x); V0=sum(v.*(1-x)); W0=sum(w.*(1-x)); Violation=max(W1/W-1,0); z=V0*(1+100*Violation); sol.V1=V1; sol.W1=W1; sol.V0=V0; sol.W0=W0; sol.Violation=Violation; sol.z=z; sol.IsFeasible=(Violation==0); end function j=RouletteWheelSelection(P) r=rand; C=cumsum(P); j=find(r<=C,1,'first'); end