<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>Solving the Quality-based Software-Selection and Hardware-Mapping Problem with ACO</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Samaneh HoseinDoost s.hoseindoost@eng.ui.ac.ir</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
          <xref ref-type="aff" rid="aff1">1</xref>
          <xref ref-type="aff" rid="aff2">2</xref>
          <xref ref-type="aff" rid="aff3">3</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Shekoufeh Kolahdouz-Rahimi sh.rahimi@eng.ui.ac.ir</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
          <xref ref-type="aff" rid="aff1">1</xref>
          <xref ref-type="aff" rid="aff2">2</xref>
          <xref ref-type="aff" rid="aff3">3</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Bahman Zamani</institution>
        </aff>
        <aff id="aff1">
          <label>1</label>
          <institution>Copyright c by the paper's authors. In: A. Garcia-Dominguez, G. Hinkel and F. Krikava (eds.): Proceedings of the 11th Transformation Tool Contest</institution>
          ,
          <addr-line>Toulouse, France, 29-06-2018, published at</addr-line>
        </aff>
        <aff id="aff2">
          <label>2</label>
          <institution>MDSE research group Department of Software Engineering Faculty of Computer Engineering University of Isfahan</institution>
          ,
          <country country="IR">Iran</country>
        </aff>
        <aff id="aff3">
          <label>3</label>
          <institution>Meysam Karimi</institution>
        </aff>
      </contrib-group>
      <abstract>
        <p>This paper presents a solution for the Quality-based Software-Selection and Hardware-Mapping problem using the ACO algorithm. ACO is one of the most successful swarm intelligence algorithms for solving discrete optimization problems. The evaluation results show that the proposed approach generates correct results for all evaluated test cases. Also, better results in terms of performance and scalability are given in comparison with the ILP and EMFeR approaches.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>Introduction</title>
      <p>choose paths marked by strong pheromone. This helps the ant to choose the best path. After an ant finds food
and returns to the nest, it will deposit pheromone again and emphasizes on the correct path. If an ant does not
find a food it does not deposit pheromone on the path passed previously. Figure 1 shows an experiment with a
real colony of Argentine ants done by Goss et al. [6]. They will choose a shorter route, gradually. When faced
with an obstacle, there is an equal chance for an ant to choose a path (the left or right). As the left path is shorter
than the right one, the ant eventually deposits a higher level of pheromone. More ants take the left path, when
more level of pheromone will be on that path.</p>
      <p>Since, the ants may not have chosen very good paths especially in the early stages, it is essential to gradually
withdraw these paths from the candidates of new selections. Therefore, there is a need for a concept called
evaporation. The evaporation causes the pheromones to evaporate gradually, in order to omit the inappropriate
paths.</p>
      <p>Listing 1 presents the generic algorithm of ACO. The parameters are set in the initialization phase of this
algorithm. Most parameters of ACO are similar to population based metaheuristic algorithms including Genetic
and PSO. The most important parameter belonging to ACO is pheromone initialization.</p>
      <p>Listing 1: Generic algorithm of ACO
1 Initialize including the pheromone trails and evaporation rate
2 Repeat
3 FOR each ant Do
4 Solution construction using pheromone trails
5 Evaporation
6 Reinforcement
7 Until stopping criteria
8 OUTPUT: Best solution found or a set of solutions</p>
      <p>Each artificial ant can be seen as a greedy procedure that constructs a feasible solution in probabilistic fashion.
In each step an ant selects a path based on the pheromone and heuristic information. For example in Travel
Sales Man (TSP) problem, it can be considered as the distance between cities that each artificial ant cares about
to make a better choice. Equation 1 shows the decision transition probabilities. S shows not yet visited solutions
in current iteration.</p>
      <p>( ij) ( ij)</p>
      <p>Pij = P( ij) ( ij) ; i 2 [1; N]; j 2 S</p>
      <p>After each ant made a feasible solution, pheromone trail, which is the most important concept of ant
communication, will be updated in two phases. Reinforcement phase, where pheromone trails is updated based on
the newly constructed solutions by colony in current iteration. Then, an evaporation phase is applied, where
pheromone trail will decrease by a fixed proportion called evaporation rate.</p>
      <p>Equation 2 shows updating pheromone. is a positive value added by ants in current iteration and ij shows
the pheromone trail. Evaporation phase is shown in equation 3, where shows evaporation rate which has
been set in the initialization phase.</p>
      <p>
        ij = ij +
ij = (
        <xref ref-type="bibr" rid="ref1">1</xref>
        ) ij
(
        <xref ref-type="bibr" rid="ref1">1</xref>
        )
(
        <xref ref-type="bibr" rid="ref2">2</xref>
        )
(
        <xref ref-type="bibr" rid="ref3">3</xref>
        )
In order to apply the ACO algorithm to this problem, first a swarm of ants is created by transforming the
problem into an ACO specific solution. Following that each ant is evaluated and then deposited pheromone
according to the result of evaluation. New solutions are then generated from heuristic information and the
amount of pheromone deposited in predecessor iterations. The solutions are evaluated again to make better
results. The algorithm is terminated according to the predefined condition and finally the most optimal result
will be generated. The solution is implemented as two Java files: ACOSolver.java and Ant.java. It is available
as a Github repository1. Additionally, the implementation is provided in Share virtual machine2.
      </p>
      <p>Listing 2 presents the psudocode of our ACO solver (For more details refer to Appendix A.1). This psudocode
has two main parts. In part 1 valid software solutions are generated and in part 2, the solutions are passed
to swarm of ants for finding the best valid solutions. The population size and iteration size are predefined
parameters that determine the termination of parts 1 and 2, respectively.</p>
      <p>In part 1 of the psudocode an empty solution is created and for every requested component of the problem
model, a valid software assignment is added to the solution. Each component has an implementation list
that one of them should be selected randomly for the assignment. Each implementation has some required
components and resources that should be mapped to a valid component and resource aiming at generating better
abject values. For mapping required component to a valid component, an implementation is selected randomly
and then is checked if a valid assignment for the required component is provided. Another implementation is
selected until a valid assignment is produced. Following that it is essential to map valid software assignments
to their required resources. To this end, all resources of the model are tested for each valid software assignment.
If a resource does not violate the validity of assignment, it will be added to the list of possible resources of
assignment. The values of , and are set for each resource of the list and then saved into two dimension
matrixes in which columns indicate assignments and rows represent resources. Each cell of the matrixes presents
values of , , or p. An invalid hardware solution is recognized, if a solution contains an assignment with no
possible resource. Any other solutions are considered as valid software after which possible valid hardware
solutions are passed to the ants.</p>
      <p>Listing 2: The psudocode of the ACO solver
1 /* Part 1: Generating valid software solutions */
2 Initialize population_size, 0, ,
3 FOR each population
4 IF time has exceeded from maxSolvingTime THEN
5 exit
6 END IF
7 create an empty solution
8 FOR each requested components
9 create an empty assignmenti
10 create a valid component mappings for the assignmenti
11 find the possible resources from all of the available resources //the resources that don't violated the required
property clauses and request constraints
12 IF an assignment has no possible resources THEN
13 Ignore the solution
14 ELSE
15 FOR each possible resourcesj
16
1https://github.com/Ariyanic/TTC18
2http://is.ieis.tue.nl/sta /pvgorp/share/?page=MyVirtualDiskImageBanners#XP-TUe_TTC18-ACO.vdi</p>
      <p>In part 2, for each saved solution, an ant is created and the solution with its possible resource and the , and
matrix are passed to the ant. Following that ants are run for finding the best solution. Additionally, the value
of the and matrix is updated for running ants in the next iteration. At the end of each iteration, the best of
ant solutions is added to an array. Finally, the algorithm is terminated according to the predefined condition,
and the last solution of the array is identified as an optimal solution.</p>
      <p>Listing 3 shows the psudocode of the ant.run() method (For more details refer to Appendix A.2). Each ant
selects assignments of the received solution one by one with respect to a number of possible resources, such
that assignments with the smallest number of possible resources have higher priority than other assignments.
This is because the resource cannot be shared between more than one assignment. If an assignment with a small
number of possible resources is investigated later, it is possible that all of its possible resources are allocated
by other assignments, and therefore the solution becomes invalid. In this paper the map data structure is used
for implementing this mechanism. Each map consists of keys and values. The key factors correspond to the
number of possible resources and values relate to the index of the assignment. The map is constructed in the
first part of the ACO solver after finding possible resources, and then it is passed to the ant with the , , and
parameters. In this step, each ant investigates the existence of possible resources for the selected assignment,
which have not been used by other assignments. If a resource is found the ant calculates the probability of
selecting any possible resources of the assignment. It then selects one of them using a roulette wheel mechanism
based on the probability of selecting the resource. If the Roulette Wheel selects an unused resource, the resource
is allocated to the assignment, and the and for the selected resource are updated (based on equations 2
and 3). Finally, the updated solution with the best resource mapping is returned by the ant, if the process is
terminated successfully for all the assignment of the solution.</p>
      <p>Listing 3: The psudocode of the ant.run() method
1 Initialize , , and Q
2 Sort the assignments of the solution based on the number of possible resources
3 FOR each assignments
4 IF there is at least one possible resource that has not been used by other assignment
5 Select a possible resourcej using Rolette Wheel mechanism that has not been used by other assignment
6 Assign resourcej to assignmenti
7
8
9</p>
    </sec>
    <sec id="sec-2">
      <title>Evaluation</title>
      <p>In order to evaluate our solution in comparison with the other solutions, all of them are run on a standard
Windows 7 PC using an Intel R CoreTM i5-2430M with 2.40GHz processor and 4.00 GB RAM. Table 1 shows the
results of evaluation w.r.t. their correctness, performance, solution quality and scalability. As explained in the
case study description [1]:
“Correctness denotes that only solutions not violating the minimum requirements of the users are
considered valid”.
“The performance of an approach describes how fast a solution can be computed for a given problem”. In
order to prevent running the benchmarks very long, the timeout is set on 15 minutes.
“The solution quality quantifies how close the computed solution is to the optimal solution”. For this
purpose, the objective value of the solutions is measured based on the objective function in the current
model. “The objective function is represented as minimization of either a weighted sum or the maximum
of all variables”; Therefore the solutions with less objective value are better in terms of quality (except zero
points which means the solution has failed in the validity test).</p>
      <p>Finally, “scalability is represented by the size of the largest problem”. As shown in Table 1, for each
scalability level, the population and iteration size of the ACO algorithm is increased in order to find a better
objective for the solution.</p>
      <p>The outcome indicates that this approach generates correct results for the evaluated test cases. Also, better
results in terms of performance and scalability are given in comparison with the results of the ILP and EMFeR
approaches.</p>
    </sec>
    <sec id="sec-3">
      <title>Conclusion</title>
      <p>In the paper the ACO algorithm is used to solve the Quality-based Software-Selection and Hardware-Mapping
problem. ACO is a comprehensive algorithm for solving discrete optimization problems. It is a constructive
algorithm that in each step a feasible solution for the next step is constructed. Additionally, ACO is a
populationbased algorithm, in which each ant is a candidate solution in a solution space. The population size can be
increased according to the problem. Importantly, each ant can run autonomously and this makes an optimal
result in terms of performance.</p>
      <p>The scalability, performance and quality of the proposed solution are tested on di erent benchmarks. The
outcome indicates that this approach generates correct results for the evaluated test cases. Also, better results in
terms of performance and scalability are given in comparison with the results of the ILP and EMFeR approaches.</p>
      <p>A
A.1</p>
    </sec>
    <sec id="sec-4">
      <title>Appendix: Details of our solution</title>
      <p>ACOSolver.java
public ACOSolver setPopulation_size(int population_size) {
this.population_size = population_size;
return this;
int population_size = 50000;
int iteration_size = 50;
private static final Logger logger = LogManager.getLogger(ACOSolver.class);
private Solution lastSolution;
private long lastSolvingTime;
private int solutionCounter;
private long maxSolvingTime;
private StopWatch stopWatch;
private boolean timedOut;
int numAssignments = 0;
public Assignment ACOCreateSoftwareAssignment(Request request, Component component, boolean topLevel, int i) {
Assignment assignment = new Assignment();
assignment.setRequest(request);
assignment.setTopLevel(topLevel);
Implementation implementation = component.getImplementation(i);
assignment.setImplementation(implementation);
for (ComponentRequirement requirement : implementation.getComponentRequirementList()) {
for (Instance instance : requirement.getInstanceList()) {
int rangeMin = 0;
int rangeMax = requirement.getComponentRef().getRef().getImplementationList().getNumChild();
Assignment ass = null;
do{
int randomNum = ThreadLocalRandom.current().nextInt(rangeMin, rangeMax);
ass = ACOCreateSoftwareAssignment(request, requirement.getComponentRef().getRef(), false, randomNum);
}while(!ass.isSoftwareValid());
assignment.addComponentMapping(new ComponentMapping(instance, ass));
}
for (Instance instance : implementation.getResourceRequirement().getInstanceList()) {
assignment.setResourceMapping(new ResourceMapping(instance, null, new de.tudresden.inf.st.mquat.jastadd.model.</p>
      <p>List&lt;&gt;()));
private static void assignResource(Assignment assignment, Resource resource) {</p>
      <p>Implementation impl = assignment.getImplementation();
ResourceMapping mapping = new ResourceMapping(impl.getResourceRequirement().getInstance(0), resource,
new de.tudresden.inf.st.mquat.jastadd.model.List&lt;&gt;());
SolverUtils.populateResourceMapping(mapping, impl.getResourceRequirement(), resource);
assignment.setResourceMapping(mapping);
}
int numSoftwareSolutions = 0;
int numTotalSoftwareSolutions = 0;
stopWatch = StopWatch.start();
List&lt;Solution&gt; solutions = new ArrayList&lt;&gt;();
List&lt;Solution&gt; currentSolutions = new ArrayList&lt;&gt;();
List&lt;List&lt;Set&lt;Resource&gt;&gt;&gt; currentPossibleResources = new ArrayList&lt;&gt;();
List&lt;List&lt;List&lt;Double&gt;&gt;&gt; currentTau = new ArrayList&lt;&gt;(); // Pheromone for each resources
List&lt;List&lt;List&lt;Double&gt;&gt;&gt; currentEta = new ArrayList&lt;&gt;(); // Objective for each resources
List&lt;List&lt;Double&gt;&gt; currentDenominatorP = new ArrayList&lt;&gt;();</p>
      <p>List&lt;List&lt;List&lt;Double&gt;&gt;&gt; currentNumeratorP = new ArrayList&lt;&gt;();
List&lt;Map&lt;Integer, List&lt;Integer&gt;&gt;&gt; currentSort = new ArrayList&lt;&gt;();</p>
      <p>}
Solution currentSolution = new Solution();
currentSolution.setModel(model);
de.tudresden.inf.st.mquat.jastadd.model.List&lt;Request&gt; requests = model.getRequests();
for(Request request: requests){
int rangeMin = 0;
int rangeMax = request.getTarget().getRef().getImplementationList().getNumChild();
Assignment ass = null;
do{
int randomNum = ThreadLocalRandom.current().nextInt(rangeMin, rangeMax);
ass = ACOCreateSoftwareAssignment(request, request.getTarget().getRef(), true, randomNum);
}while(!ass.isSoftwareValid());
currentSolution.addAssignment(ass);
de.tudresden.inf.st.mquat.jastadd.model.List&lt;Resource&gt; resources = model.getHardwareModel().getResources();
numTotalSoftwareSolutions++;
List&lt;Assignment&gt; assignments = currentSolution.allAssignments();
List&lt;Set&lt;Resource&gt;&gt; possibleResources = new ArrayList&lt;&gt;(assignments.size());
boolean isHardwareValid = true;
double tau0 = 1;
List&lt;List&lt;Double&gt;&gt; tau = new ArrayList&lt;&gt;(); // Pheromone for each resources
List&lt;List&lt;Double&gt;&gt; eta = new ArrayList&lt;&gt;(); // Objective
double alpha = 1;
double beta = 1;
List&lt;List&lt;Double&gt;&gt; numeratorP = new ArrayList&lt;&gt;();
List&lt;Double&gt; denominatorP = new ArrayList&lt;&gt;();
Map&lt;Integer, List&lt;Integer&gt;&gt; SortIndexByPossibleResource = new HashMap&lt;&gt;();
int index = 0;
Parallel.ForEach(population, new LoopBody&lt;Ant&gt;() {
@Override
public void run(Ant ant) {
int ant_Number = ant.id;
List&lt;List&lt;Double&gt;&gt; tau = currentTau.get(ant_Number); ///////////// BEFORE RUN
List&lt;List&lt;Double&gt;&gt; numeratorP = currentNumeratorP.get(ant_Number);
List&lt;Double&gt; denominatorP = currentDenominatorP.get(ant_Number);
if (antSolution != null) {
currentTau.set(ant_Number, tau); ///////////// AFTER RUN
currentNumeratorP.set(ant_Number, numeratorP);
currentDenominatorP.set(ant_Number, denominatorP);
numAssignments += ant.numAssignments;
solutionCounter++;
if (solutions.isEmpty() || antSolution.computeObjective() &lt; solutions.get(solutions.size() - 1).</p>
      <p>computeObjective()) {
Solution clone = antSolution.deepCopy();
solutions.add(clone);
logger.info("found a better solution with an objective of {}.",antSolution.computeObjective());
}
});
}
}</p>
      <p>}
logger.info("Number of total software solutions: {}", numTotalSoftwareSolutions);
logger.info("Number of iterated software solutions: {}", numSoftwareSolutions);
logger.info("Number of iterated solutions: {}", numAssignments);
logger.info("Number of correct solutions: {}", solutionCounter);
if (solutions.size() &gt; 0) {</p>
      <p>lastSolution = solutions.get(solutions.size() - 1);
} else {
lastSolution = Solution.emptySolutionOf(model);
logger.warn("Found no solution!");
}
lastSolvingTime = stopWatch.time(TimeUnit.MILLISECONDS);
return lastSolution;
}
}
}
private void reset() {
this.lastSolution = null;
this.solutionCounter = 0;
this.lastSolvingTime = 0;
this.timedOut = false;
@Override
public long getLastSolvingTime() {</p>
      <p>return lastSolvingTime;
A.2</p>
      <p>Ant.java
import de.tudresden.inf.st.mquat.jastadd.model.Assignment;
import de.tudresden.inf.st.mquat.jastadd.model.Implementation;
import de.tudresden.inf.st.mquat.jastadd.model.Resource;
import de.tudresden.inf.st.mquat.jastadd.model.ResourceMapping;
import de.tudresden.inf.st.mquat.jastadd.model.Solution;
import de.tudresden.inf.st.mquat.solving.SolverUtils;</p>
      <p>Ant(int i, Solution solu, List&lt;Set&lt;Resource&gt;&gt; pr, List&lt;List&lt;Double&gt;&gt; et, Map&lt;Integer, List&lt;Integer&gt;&gt; sort, int num
) {
id = i;
currentSolution = solu;
possibleResources = pr;
eta = et;
Sort = sort;
numAssignments = num;
List&lt;Assignment&gt; assignments = currentSolution.allAssignments();
Stack&lt;Resource&gt; usedResources = new Stack&lt;&gt;();
double alpha = 1;
double beta = 1;
double rho = 0.1; // Evaporation rate
double Q = 2;
List&lt;Integer&gt; keys = new ArrayList&lt;Integer&gt;(Sort.keySet());</p>
      <p>Collections.sort(keys); // "keys" are number of possible resources &amp; "values" are index of the assignments
assignResource(assignment, resource);
usedResources.push(resource);
denominatorP.set(index, denominatorP.get(index) - numeratorP.get(index).get(select));
List&lt;Double&gt; taui = tau.get(index);
// Upadte Pheromone -&gt; tau[index][select] = tau[index][select] + (Q /assignment.computeObjective());
taui.set(select, taui.get(select) + (Q / assignment.computeObjective()));
// Evaporation on Pheromone of antSolution.allAssignments();
taui.set(select, (1 - rho) * taui.get(select)); // tau[index][select] = (1 - rho) * tau[index][select];
tau.set(index, taui);
// p[index][select] = (tau[index][select] * alpha) + (eta[index][select] * beta);
List&lt;Double&gt; sIndex = numeratorP.get(index);
sIndex.set(select, (tau.get(index).get(select) * alpha) + (eta.get(index).get(select) * beta));
numeratorP.set(index, sIndex);
denominatorP.set(index, denominatorP.get(index) + numeratorP.get(index).get(select));
}</p>
      <p>}
numAssignments++;
return currentSolution;</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>Sebastian</given-names>
            <surname>Götz</surname>
          </string-name>
          , Johannes Mey, Rene Schöne and Uwe Aßmann, “
          <article-title>Quality-based Software-Selection and Hardware-Mapping as Model Transformation Problem,” in Proceedings of the 11th Transformation Tool Contest, a part of the Software Technologies: Applications and Foundations (STAF 2018) federation of conferences (A</article-title>
          . GarciaDominguez, G. Hinkel, and F. Krikava, eds.),
          <source>CEUR Workshop Proceedings</source>
          , CEUR-WS.org,
          <year>June 2018</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>M.</given-names>
            <surname>Fleck</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Troya</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Kessentini</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Wimmer</surname>
          </string-name>
          , and
          <string-name>
            <given-names>B.</given-names>
            <surname>Alkhazi</surname>
          </string-name>
          , “
          <article-title>Model transformation modularization as a many-objective optimization problem</article-title>
          ,
          <source>” IEEE Trans. Softw. Eng</source>
          , vol.
          <volume>43</volume>
          , no.
          <issue>11</issue>
          , pp.
          <fpage>1009</fpage>
          -
          <lpage>1032</lpage>
          ,
          <year>2017</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>G.</given-names>
            <surname>Kappel</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P.</given-names>
            <surname>Langer</surname>
          </string-name>
          ,
          <string-name>
            <given-names>W.</given-names>
            <surname>Retschitzegger</surname>
          </string-name>
          ,
          <string-name>
            <given-names>W.</given-names>
            <surname>Schwinger</surname>
          </string-name>
          , and
          <string-name>
            <given-names>M.</given-names>
            <surname>Wimmer</surname>
          </string-name>
          , “
          <article-title>Model transformation by-example: a survey of the first wave,” in Conceptual Modelling and Its Theoretical Foundations</article-title>
          , pp.
          <fpage>197</fpage>
          -
          <lpage>215</lpage>
          , Springer,
          <year>2012</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <given-names>L.</given-names>
            <surname>Bianchi</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Dorigo</surname>
          </string-name>
          ,
          <string-name>
            <given-names>L. M.</given-names>
            <surname>Gambardella</surname>
          </string-name>
          , and
          <string-name>
            <given-names>W. J.</given-names>
            <surname>Gutjahr</surname>
          </string-name>
          , “
          <article-title>A survey on metaheuristics for stochastic combinatorial optimization</article-title>
          ,
          <source>” Natural Computing</source>
          , vol.
          <volume>8</volume>
          , no.
          <issue>2</issue>
          , pp.
          <fpage>239</fpage>
          -
          <lpage>287</lpage>
          ,
          <year>2009</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>M.</given-names>
            <surname>Dorigo</surname>
          </string-name>
          , “
          <article-title>Optimization, learning and natural algorithms</article-title>
          ,”
          <source>PhD Thesis</source>
          , Politecnico di Milano,
          <year>1992</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>S.</given-names>
            <surname>Goss</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Aron</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.-L.</given-names>
            <surname>Deneubourg</surname>
          </string-name>
          , and
          <string-name>
            <given-names>J. M.</given-names>
            <surname>Pasteels</surname>
          </string-name>
          , “
          <article-title>Self-organized shortcuts in the argentine ant</article-title>
          ,
          <source>” Naturwissenschaften</source>
          , vol.
          <volume>76</volume>
          , no.
          <issue>12</issue>
          , pp.
          <fpage>579</fpage>
          -
          <lpage>581</lpage>
          ,
          <year>1989</year>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>