## 4 Algorithms
### Realization of Skyline Query  
A skyline query is performed at the beginning of each generation. Suppose the algorithm is performing the evolution of the \(n\)th generation of solutions; the subject of the skyline query is the union of the two following sets: (1) all of the solutions in generation \(n\) and (2) all of the temporary skyline solutions from generations 1 to \(n-1\). If \(n\) is 1, then the temporary skyline solutions are an empty set. The branch-and-bound search [13] algorithm is selected for most applications. However, this algorithm must construct a tree data structure for the query subject; given the small quantity of dynamic data (i.e., data that often change and requires additional calculations) discussed in this study, the block nested loops algorithm [12] is more appropriate, as no data preprocessing is required for this algorithm [62]. Only two solutions need to be compared, and this can be achieved directly in each dimension. In other words, the algorithm of this system can parallelize computation, that is, obtain the values of the decision objectives in every solution in the target generation while comparing the actual solutions with the earlier calculated solutions. Its greatest shortcoming is that for large quantities of data, computation time increases exponentially. However, for our purposes, only a small amount of data needs to be compared each time (only the solutions of one generation and the few temporary skyline solutions identified in the previous generations). Below, we outline the application of the block nested loop algorithm to the target algorithm. To facilitate our explanation, we refer to all of the solutions in this generation as \(\mathbf{P}=\{p_{1},p_{2},...,p_{m}\}\) and the temporary skyline solutions as \(\mathbf{Q}=\{q_{1},q_{2},...,q_{n}\}\). If the solution currently being checked is \(p_{i}\), then \(p_{i}\) will be compared to all of the solutions in \(\mathbf{P}\cup\mathbf{Q}\) aside from itself. Suppose the solution being compared to \(p_{i}\) is \(r_{j}\), and \(0<j<m+n\). Then, the comparison result must be one of the three following cases:  
1. If all of the objective values in \(p_{i}\) are poorer than those in \(r_{j}\) (i.e., \(p_{i}\) is dominated by \(r_{j}\)), then we add 1 to the number of times \(p_{i}\) is dominated.
2. If all of the objective values in \(p_{i}\) are better than those in \(r_{j}\) (i.e., \(p_{i}\) dominates \(r_{j}\)), then we record that \(r_{j}\) is dominated in this generation.
3. If \(p_{i}\) and \(r_{j}\) each have better and poorer objective values than the other (i.e., \(p_{i}\) and \(r_{j}\) do not dominate each other), then no action needs to be taken.  
After \(p_{i}\) has been compared to all of the other solutions \(\mathbf{P}\cup\mathbf{Q}\) aside from itself, we implement the block nested loops algorithm [12]: (1) record _dom_, the number of times that \(p_{i}\) was dominated (this number serves as the foundation of the fitness function during the crossover operation in the next stage), and (2) keep all of the solutions that were not dominated in \(\mathbf{P}\cup\mathbf{Q}\) as the temporary skyline solutions of this generation.