## 2 Materials and Methods  
The objective of any optimization technique is to find the optimal or approximately optimal solution. The core idea of FSS is to make the agents in a population move towards the positive gradient of the optimized function in order to gain weight; agents with larger weight have a greater impact on the population behavior. On each iteration of the algorithm, one feeding and three movement operators are applied sequentially, and then the best agent \(\overset{\rightarrow}{x}_{best}\) is chosen, which is considered as the suboptimal solution until a new agent is found with better fitness function value. First, the individual movement operator is applied, given by:  
\[\overset{\rightarrow}{x}_{i,t+1}=\overset{\rightarrow}{x}_{i,t}+step_{ind} \overset{\rightarrow}{r}. \tag{1}\]  
where, \(\overset{\rightarrow}{r}\) is the vector containing random real numbers, uniformly distributed on \([-1,1]\). The \(step_{ind}\) variable denotes the maximum displacement of an agent, \(\overset{\rightarrow}{x}_{i,t}\) is the position of \(i\)-th agent on \(t\)-th iteration. The new position is accepted only in case if \(f\!\left(\overset{\rightarrow}{x}_{i,t+1}\right)>f\!\left(\overset{ \rightarrow}{x}_{i,t}\right)\). To perform the check, the delta value is computed for each agent, according to the following:  
\[\Delta f_{i,t+1}=f\!\left(\overset{\rightarrow}{x}_{i,t+1}\right)-f\!\left( \overset{\rightarrow}{x}_{i,t}\right)\!. \tag{2}\]  
where, \(f\) is the fitness function. After the individual movement step, the feeding operator is applied to the whole population. The scalar weight value \(\overset{\rightarrow}{w}_{i,t}\) is associated with each \(\overset{\rightarrow}{x}_{i,t}\) agent. The weights of all agents are adjusted on every iteration according to the following formula:  
\[\Delta w_{i,t+1}=w_{i,t}+\frac{\Delta f_{i,t+1}}{\max[\Delta f_{i+1}]}. \tag{3}\]  
As a result, the weights of agents with greater fitness function improvements increase more, compared to other agents. On the next step, the collective-instinctive movement operator is applied to every agent in the population. The position delta value is computed for each agent. The collective-instinctive movement occurs according to the following formula:  
\[\vvet{x}_{i,t+1}=\vvet{x}_{i,t+1}+\frac{\Sigma_{i=1}^{n}\Big{(}\vvet{x}_{i,t+1}- \vvet{x}_{i,t}\Big{)}\Delta f_{i,t+1}}{\Sigma_{i=1}^{n}\Delta f_{i,t+1}}. \tag{4}\]  
Then, the barycenter vector \(\vvet{B}_{t+1}\), required for the collective-volutive movement step, is computed:  
\[\vvet{B}_{t+1}=\frac{\Sigma_{i=1}^{n}\vvet{x}_{i,t+1}w_{i,t+1}}{\Sigma_{i=1}^{ n}w_{i,t+1}}. \tag{5}\]  
The collective-volutive movement operator is given by:  
\[\vvet{x}_{i,t+1}=\vvet{x}_{i,t+1}\pm\textit{step}_{vol}\vvet{r}\vvet{\vvet{x}_{ i,t+1}-\vvet{B}_{t+1}}. \tag{6}\]  
The \(\vvet{r}\) vector contains real numbers, uniformly distributed on the \([-1,\ 1]\) interval. The \(\textit{step}_{vol}\) variable denotes the collective-volutive movement step size. If the total weight of the population has increased since the last iteration, the '\(-\)' sign is used in Equation (6); this means that the agents are attracted to the barycenter of the population. Otherwise we use the '\(+\)' sign in Equation (6); the agents are spread away from the population barycenter. On each iteration of FSS, the variables \(\textit{step}_{ind}\) and \(\textit{step}_{vol}\) decay linearly. If we are maximizing a function \(f\), then on each iteration \(t\) the best agent \(\vvet{x}_{t,best}\) is chosen from the \(\mathbb{P}_{t}\) population, that \(\forall\vvet{x}_{t}\in\mathbb{P}_{t}:f\Big{(}\vvet{x}_{t,best}\Big{)}\geq f \Big{(}\vvet{x}_{t}\Big{)}\). The algorithm stops when the predefined iteration count \(\textit{iter}_{max}\) is reached. The best agent found on the last iteration is assumed as the optimal solution of the maximized function \(f\). The FSS algorithm shows accurate results in multimodal optimization because of its population-based nature.