├── data.xlsx ├── README.md ├── RouletteWheel.m ├── InsertData.m ├── fitness.m └── ACO.m /data.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/basharbme/AntColony-Algorithm/master/data.xlsx -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # AntColony-Algorithm 2 | 3 | Find the Shortest Path With Ant Colony Algorithm 4 | -------------------------------------------------------------------------------- /RouletteWheel.m: -------------------------------------------------------------------------------- 1 | function j=RouletteWheel(P) 2 | 3 | if all(P==0) 4 | P=P+rand; 5 | end 6 | 7 | P=P./sum(P); 8 | P=cumsum(P); 9 | j=find(rand<=P,1,'first'); 10 | 11 | 12 | end -------------------------------------------------------------------------------- /InsertData.m: -------------------------------------------------------------------------------- 1 | function data=InsertData() 2 | 3 | Dis=xlsread('data.xlsx'); 4 | nvar=size(Dis,1); 5 | M=10^10*nvar; 6 | Dis(isnan(Dis))=M; 7 | 8 | data.nvar=nvar; 9 | data.Dis=Dis; 10 | data.M=M; 11 | 12 | end -------------------------------------------------------------------------------- /fitness.m: -------------------------------------------------------------------------------- 1 | function sol=fitness(sol,data) 2 | 3 | x=sol.x; 4 | Dis=data.Dis; 5 | N=numel(x); 6 | 7 | Z=0; 8 | for k=1:N-1 9 | i=x(k); 10 | j=x(k+1); 11 | Z=Z+Dis(i,j); 12 | end 13 | 14 | 15 | sol.fit=Z; 16 | 17 | 18 | 19 | end 20 | -------------------------------------------------------------------------------- /ACO.m: -------------------------------------------------------------------------------- 1 | clc 2 | clear all 3 | close all 4 | format shortG 5 | 6 | %% Insert Data 7 | 8 | data=InsertData(); 9 | 10 | 11 | nvar=data.nvar; % number of variable 12 | Dis=data.Dis; % Distance Matrix 13 | 14 | n_ant=10; % number of ant 15 | 16 | maxiter=100; % max of iteration 17 | 18 | 19 | Snode=input('Start Node = '); 20 | Fnode=input('Final Node = '); 21 | 22 | 23 | %% initialization 24 | 25 | tau0=1; 26 | tau=tau0*ones(nvar,nvar); % phromone matrix 27 | tau=tau-diag(diag(tau)); 28 | 29 | etha=1./Dis; % hueristic information matrix 30 | etha=etha-diag(diag(etha)); 31 | etha(isinf(etha))=0; 32 | etha(isnan(etha))=0; 33 | Q=100; 34 | alpha=2; 35 | beta=1; 36 | 37 | Roh=0.02; 38 | 39 | U=reshape(1:nvar*nvar,nvar,nvar); 40 | 41 | %% main loop 42 | tic 43 | 44 | emp.x=[]; 45 | emp.fit=[]; 46 | 47 | ant=repmat(emp,n_ant,1); % population 48 | 49 | gant.x=[]; % global ant 50 | gant.fit=inf; 51 | 52 | BEST=zeros(maxiter,1); 53 | MEAN=zeros(maxiter,1); 54 | 55 | 56 | 57 | Route=[Snode Fnode]; 58 | URoute=U(Snode,Fnode); 59 | ant(1).x=Route; 60 | ant(1)=fitness(ant(1),data); 61 | L=ant(1).fit; 62 | tau(URoute)=tau(URoute)+(Q/L); 63 | gant=ant(1); 64 | 65 | for iter=1:maxiter 66 | 67 | for k=1:n_ant 68 | 69 | Route=Snode; 70 | URoute=zeros(1,nvar); 71 | 72 | for v=2:nvar 73 | i=Route(end); 74 | P=(tau(i,:).^alpha).*(etha(i,:).^beta); 75 | P(Route)=0; 76 | j=RouletteWheel(P); 77 | [Route]=[Route j]; 78 | URoute(v-1)=U(i,j); 79 | 80 | if j==Fnode 81 | break 82 | end 83 | 84 | end 85 | 86 | 87 | ant(k).x=Route; 88 | ant(k)=fitness(ant(k),data); 89 | 90 | 91 | L=ant(k).fit; 92 | URoute(URoute==0)=[]; 93 | tau(URoute)=tau(URoute)+(Q/L); 94 | end 95 | 96 | tau=tau*(1-Roh); 97 | 98 | 99 | [value,index]=min([ant.fit]); 100 | 101 | if value