## 2 Materials and Methods
### Adaptive Selection of Algorithm Parameters
At first glance, it might seem that an implementation of a graph would be a set of nodes containing a list of edges, each of which contains a pointer to a neighboring node and quantitative characteristics (weight and amount of pheromone). However, the graph can be represented as a matrix of weights and a pheromone matrix. It is, first, easier to implement; second, lesser in terms of the amount of memory required (no need to store lists of pointers in each node); and, third, it works faster. The following method is especially effective: apply the pheromone to the matrix representing the graph, not at the end of each iteration (after the graph has been traversed by all ants), but create a copy of the matrix and, after each ant has traversed, increase the value of the pheromone in this copy, and after the traversal stage is over, perform a reverse replacement. Using this method (let us designate two pheromone graphs as _fGraph_ and _fImpGraph_) allows us to significantly increase the speed of calculations by applying the following trick. Within one iteration, the number of pheromones on each edge remains unchanged; therefore, the \(f_{k}{}^{\alpha}\) values from Equation (6) also do not change within one iteration. In this case, there is no need to calculate them for each ant again. Then, at the initialization stage, the _fImpGraph_ edges receive the initial value of the pheromone, and the _fGraph_ edges receive the initial value to the power of \(\alpha\). At each iteration, the ants, bypassing the graph, are guided by _fGraph_ (it is no longer necessary to calculate \(f_{k}{}^{\alpha}\)--it is the essence of increasing the speed), and the pheromone is deposited on _fImpGraph_. After all the ants traverse the graph and the pheromone evaporates from the graph _fImpGraph_, each \(k\)-th branch of fGraph receives a pheromone value equal to _fImpGraph_\(k\) = (_fImpGraph_)\({}^{\alpha}\). Equation (6) contains the operations of exponentiation. Depending on the compiler, raising a number to the power of \(e\) and calculating the natural logarithm may be faster than raising a number to an arbitrary power, so in the first case, the operation \(f^{\alpha}\) should be replaced as follows: \(f^{\alpha}=e^{\alpha\ln(f)}\). It should be noted that there are ways to quickly calculate the exponent and the natural logarithm. If there is a high probability that the coefficient \(\alpha\) will be an integer, especially 1 or 2, then for this case it is possible to add a variant of the algorithm in which multiplication will replace the exponentiation functions. ## 3 Results and Discussion

The software implementation of the proposed algorithm has been tested on the well-known model ]SS problems from [48; 49; 50] and the real-life manufacturing problems from [51]. Table 1 shows the values of the ACO algorithm's coefficients, which were selected by the GA as the best for test tasks. In Table 1 and the next two tables, the following designations are introduced:

* \(Iz\) is the number of runs over which averaging was carried out (with the same coefficients);
* \(L_{min}\) is the best-obtained solution;
* \(L_{agg}\) is the solution averaged over \(I_{z}\) launches;
* \(Iaco\) is the number of ACO iterations;
* \(C_{ant}\) is the number of ants;
* \(\alpha\) is the degree of significance of the pheromone when choosing the graph edge (Equation (6));
* \(\beta\) is the non-linear pheromone deposition coefficient (Equation (7));
* \(\rho\) is the pheromone evaporation coefficient (Equation (8));
* \(\gamma\) is the linear coefficient of pheromone application (Equation (7));
* \(\lambda\) is the accounting factor for the best current solution (Equation (9)). It follows from the data obtained that the best-found sets of coefficients differ even when solving the same problem. The search for the relationship between the coefficients and their correlation is a direction for further research.