function [Routes,Eta,Tau,Multi_Days_Route] = Route(Ant_k,Routes,Eta,Tau,Multi_Days_Route) global Start_Node global End_Node global Node_Size global Distance global Visiting_Time global T_max global Alpha global Beta global Group_Size %to start all group member from the start Node for user = 1: Group_Size Routes.Path{Ant_k,1,user} = Start_Node; end %Each user has Trip_Time Trip_Time = zeros(Group_Size,1); %Each user has different vector of probability Probability.Node = {}; Probability.Users = {}; Probability.Percentage = {}; %Each user find the last node in the tour Last_Node_in_Routes = zeros(Group_Size,1); %Each user has different length in the tour %This variable to ensure each user has finished or not yet Finisth_Tour = zeros(Group_Size,1); while true %Find Last Node in each user tour Last_Node_in_Routes = Find_Last_Node_In_Tour(Last_Node_in_Routes,Ant_k,Routes) %This variable to check all users has finish to stop the loop Finish_Group_Tour = 1; %To unsure that each user has finished for user =1 : Group_Size Finish_Group_Tour = Finish_Group_Tour * Finisth_Tour(user,1); if length(Routes.Path{Ant_k,1,user}) > 1 if Last_Node_in_Routes(user) == End_Node Finisth_Tour(user,1) = 1; end end end %Ensure all user have finished if Finish_Group_Tour break; end Probability_Sum = zeros(Group_Size,1); Selected_Node = zeros(Group_Size,1); %Calculate_Probability for each user in the group [Probability,Probability_Sum] = Calculate_Probability(Probability,Ant_k,Routes,Multi_Days_Route,Trip_Time,Last_Node_in_Routes,Eta,Tau,Probability_Sum); %Calculate the percentage for each node for user = 1: Group_Size for i = 1: length(Probability.Percentage(:,user)) if Probability.Percentage{i,user} > -1 Probability.Percentage{i,user} = (Probability.Percentage{i,user} / Probability_Sum(user,1)); end end end Candidate_Nodes_List = zeros(length(Probability.Percentage(:,1)),2,Group_Size); Total_Percentages = zeros(Group_Size,1); %to genrate random number for each group member q = rand(Group_Size,1); for user = 1: Group_Size for index =1:length(Probability.Percentage(:,user)) if Probability.Node{index,user} > -1 Candidate_Nodes_List(index,1,user) = Probability.Node{index,user}; Candidate_Nodes_List(index,2,user) = Total_Percentages(user,1) + Probability.Percentage{index,user}; Total_Percentages(user,1) = Candidate_Nodes_List(index,2,user); end end end %This variable to inform if the user has chosen the item Selected_Node_for_User = zeros(Group_Size,1); for user = 1: Group_Size if Finisth_Tour(user,1) ~= 1 if Selected_Node_for_User( user,1) ~= 1 for index = 1: length(Candidate_Nodes_List(:,1,user)) if index == 1 if q(user) >= 0 && q(user) <= Candidate_Nodes_List(index,2,user) if length(Probability.Users{index,user}) > 1 for i = 1:length(Probability.Users{index,user}) Selected_Node(Probability.Users{index,user}(i),1) = Candidate_Nodes_List(index,1,user); Selected_Node_for_User(Probability.Users{index,user}(i),1) = 1; end break; else Selected_Node(user,1) = Candidate_Nodes_List(index,1,user); Selected_Node_for_User(user,1) = 1; break; end end else if q(user) > Candidate_Nodes_List(index - 1,2,user) && q(user) <= Candidate_Nodes_List(index,2,user) if length(Probability.Users{index,user}) > 1 for i = 1:length(Probability.Users{index,user}) Selected_Node(Probability.Users{index,user}(i),1) = Candidate_Nodes_List(index,1,user); Selected_Node_for_User(Probability.Users{index,user}(i),1) = 1; end break; else Selected_Node(user,1) = Candidate_Nodes_List(index,1,user); Selected_Node_for_User(user,1) = 1; break; end end end end end end end for user = 1: Group_Size if Finisth_Tour(user,1) ~= 1 if Probability_Sum(user) == 0 || Probability_Sum(user) == inf Routes.Path{Ant_k,1,user} = [Routes.Path{Ant_k,1,user},End_Node]; Finisth_Tour(user,1) = 1; else Routes.Path{Ant_k,1,user} = [Routes.Path{Ant_k,1,user},Selected_Node(user,1)]; Probability_Sum(user,1) = 0; Selected_Node(user,1) = -1; end Added_Node = Routes.Path{Ant_k,1,user}(length(Routes.Path{Ant_k,1,user})); Trip_Time(user,1) = Trip_Time(user,1) + Distance(Last_Node_in_Routes(user), Added_Node) + Visiting_Time(Added_Node,1); end end Candidate_Nodes_List = zeros(1,2,Group_Size); end end