Professional Documents
Culture Documents
Supervisor:
Keld Helsgaun
Jean-Luc Ngassa
Jakob Kierkegaard
Abstract
We took an existing ant colony system framework with an accompanying TSP
algorithm, which we changed by implementing different algorithms and extra
functionality, in an attempt to acheive better tour constructions. We then
extended it by implementing 2-opt and 2,5-opt optimization algorithms.
We tested the program with cases found on TSPLIB, and compared our results
with results from the original application and a third party ant colony algorithm.
These results were then compared with the official optimal solutions. Even
though our results never reached the optimal values, we achieved better re-
sults than those from the original framework without using our optimization
algorithms, but they were never able to compete with the third party applica-
tion. When applying optimization, we achieved results much better than the
original framework, and slightly better than those gotten from the third party
application.
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
Computer Science, RUC
ii
Foreword
This report is part of the 2nd bachelor module at Computer Science at RUC.
We would like to thank our supervisor, Keld Helsgaun, for his unconditional
support, his assistance and advice throughout the process.
We would also like to thank Jean-Luc’s father Jean-Claude Njitche for his undi-
rected support.
Unless otherwise stated, all figures have been made by us.
Footnotes are numbered continuously throughout the report. Tables and figures
are numbered using the chapter number and the number the table or figure is in
the current chapter. E.g. the second table in chapter 3 would have the number
”3.2”.
Jean-Luc Ngassa
Jakob Kierkegaard
Computer Sciences, RUC, 29th of May, 2007
iii
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
Computer Science, RUC
iv
Contents
1 Introduction 1
1.1 Motivation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2 Problem Formulation . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.3 Target audience . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.4 Structure of the report . . . . . . . . . . . . . . . . . . . . . . . . 4
3 The TSP 9
3.1 A heuristic tour construction . . . . . . . . . . . . . . . . . . . . 10
3.2 Heuristic Search List . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.2.1 Neighborhood List . . . . . . . . . . . . . . . . . . . . . . 11
3.2.2 Choice List . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.3 The State Transition Rule . . . . . . . . . . . . . . . . . . . . . . 11
3.4 Pheromone Update rule . . . . . . . . . . . . . . . . . . . . . . . 12
3.4.1 The local updating rule . . . . . . . . . . . . . . . . . . . 12
3.4.2 The global updating rule . . . . . . . . . . . . . . . . . . 13
3.5 TSPLIB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
5 Implementation 21
5.1 The original code . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
5.1.1 The ACS framework . . . . . . . . . . . . . . . . . . . . . 21
5.1.2 The TSP implementation . . . . . . . . . . . . . . . . . . 23
5.2 Our changes to the code . . . . . . . . . . . . . . . . . . . . . . . 23
5.2.1 The ACS framework . . . . . . . . . . . . . . . . . . . . . 24
5.2.2 The TSP algorithm . . . . . . . . . . . . . . . . . . . . . 25
5.2.3 Additions to the code . . . . . . . . . . . . . . . . . . . . 26
5.3 Known bugs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
6 Experiments 31
6.1 Test setup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
6.2 Tests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
6.3 Comparison of performance . . . . . . . . . . . . . . . . . . . . . 35
7 Discussion 41
v
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
CONTENTS Computer Science, RUC
8 Conclusion 43
9 Perspectives 45
Bibliography 47
A Screenshots 49
B Contents on the CD 55
E Code 75
E.1 AntColonyForTSP.java . . . . . . . . . . . . . . . . . . . . . . . . 75
E.2 AntColonyFramework.java . . . . . . . . . . . . . . . . . . . . . . 77
E.3 AntForTSP.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
E.4 AntFramework.java . . . . . . . . . . . . . . . . . . . . . . . . . . 83
E.5 AntGraphFramework.java . . . . . . . . . . . . . . . . . . . . . . 86
E.6 GUI.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
E.7 InputFile.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
E.8 Neighbor.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
E.9 Node.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
E.10 TSPCanvas.java . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
E.11 TSPFileFilter.java . . . . . . . . . . . . . . . . . . . . . . . . . . 103
E.12 TwohOpt.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
E.13 TwoOpt.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
vi
1 Introduction
An initial look at ants in nature does not give an impression of an animal
with a high IQ, but a closer look reveals that they are highly efficient in at
least one task; finding the shortest route between two points. Starting from
the hive they are prone to walk randomly around until they find a point of
interest, e.g. a food source. When traveling back to the hive, they will deposit
a chemical substance called pheromone as they go, which will help them find
their way back to where they came from. When other ants encounter the path
of pheromone, they will follow it, becoming less random in their movement.
These will then also deposit pheromone, strengthening the already existing path.
Because pheromone is a volatile substance, a constant stream of ants is required
to keep up the strength of the trail. This means that if a shorter trail exists,
the power of this trail’s pheromone will be stronger, as the ants will traverse
the trail in a shorter amount of time, while the pheromone still evaporates at
the same speed. After a (relatively) short time span, the majority of the ants
will therefore be following the shortest path, as this path has the strongest
pheromone.
1 2
3 4
Figure 1.1: Ants encounter a split on their way to their food, and gradually they
prioritize the shortest path because of the deployed pheromone (represented by
the small lines).
An example of how the ants find the shortest way can be seen in figure 1.1,
where the ants encounter a crossroad between their nest and the food source.
1
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
CHAPTER 1. INTRODUCTION Computer Science, RUC
At first the chances to take either left or right are 50/50, but as the ants traverse
the two distances, the pheromone increases faster on the shorter route and more
ants end up taking that route.
Alberto Colorni, Vittorio Maniezzo and Marco Dorigo were the first to come
up with an algorithm to simulate the ants’ behavior, calling it an Ant Colony
System (ACS) algorithm, commonly known as ACO; O for the optimizations
that are made daily from the original ACS. As ACO contains general methods
for solving various problems, it can be seen as a collection of several heuristic
methods that can be applied to a large number of problems. ACO is part of the
science ”swarm intelligence”, which is about using small independent units (e.g.
bees, ants or birds to mention a few) to solve problems. Alone these units are
dumb, but when they are allowed to communicate with each other and react to
the responses, they are able to solve complex problems.
The problems that ACO can be applied to are too many to mention here, but one
of the most popular ones is the Traveling Salesman Problem, known as the TSP.
The TSP is the classical mathematical problem where a salesman has to pass
through n cities (also called ”nodes” as a more general term), and because he
wants to complete the travel in the smallest amount of time, he needs to find out
which route is the shortest. The TSP is known as a NP-hard problem, meaning
that there is no deterministic polynomial computation to a final solution.
1.1 Motivation
When examining nature, people often find that animals and plants have evolved
in an ingenious manner to survive. These new techniques can sometimes be used
in modern day technology to solve problems that might be too time-consuming
to solve by conservative means. After all, nature has had many millions of years
to evolve into what it is now, whereas we have had less than 100 years to get
technology to where it is now.
The concept of having something as simple as ants (or rather simulated ants)
to solve a seemingly complex mathematical problem seemed interesting, and we
wanted to find out if this method really was as good and functional as several
sources claimed.
The purpose of our project is to design a framework for an ACO algorithms
based on an existing one, that can be applied for constructing solutions for the
TSP.
Ugo Chirico in [Chi04] developed a framework for ACO algorithms that was
applied on the Travelling Salesman Problem and the Steiner Problem. His
framework appeared to be quite excellent, but we also realised that the TSP
implementation needed improvement, making us want to create a new and better
framework and TSP implementation. During the design of the framework, we
2
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
Computer Science, RUC CHAPTER 1. INTRODUCTION
involved all aspects for constructing an ACO algorithm based mainly on [DS04].
Our main problem is:
• Time consumption
In order to approach the problem, we have split our problem definition into
smaller problems:
• Tour Construction:
Use Chirico’s framework for Ant Colony Systems applied to the TSP, and
make changes without ruining it’s overall performance and usability as a
framework.
• Tour Optimization:
Extend the framework applied to the TSP so that it uses local search
algorithms for improving retrieved tours from the ACO framework
• Visual Observation:
Implement a GUI for tours’ visualisation and a control panel for setting
parameters.
• Experimental Observation:
Change the values of the parameters for experimental analysis and general
program evaluation.
The target audience for this report is people who want to study the basics of
ACO and how to apply it to a real life problem like TSP. Previous knowledge
about ACO and TSP is not necessary, as we will introduce the reader to the
necessary theory.
3
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
CHAPTER 1. INTRODUCTION Computer Science, RUC
4
2 An Ant Colony Framework
The design of ant colony algorithms is based on the search behavior of real ants.
The ants’ search behavior is based on a positive feedback from the cooperative
behavior, based on the trail following of the other ants to reinforce good solutions
on a problem. A solution for a shortest path problem is determined by the back
and forth movements of ants on the path where shorter distances are more
prioritized due to the higher concentration of pheromone.
τ ABi + 1, δ ≤ PAB
τ ABi+1 = (2.1)
τ ABi , δ > PAB
τ ACi + 1, δ ≤ PAC
τ ACi+1 = (2.2)
τ ACi , δ > PAC
1 The Double Bridge experiment is an experiment described in [GADP89] where the authors
5
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
CHAPTER 2. AN ANT COLONY FRAMEWORK Computer Science, RUC
The probability PAB (resp. PAC ) is the probability that an ant chooses the city
B (resp. C) as the next state position in the environment. It is enunciated by:
τ AB
PAB = (2.3)
τ AB + τ AC
τ AC
(resp. PAC = )
τ AB + τ AC
Remarks
• PAB + PAC = 1.
• It is obvious from equation 2.3 that the more ants traversing a branch,
the greater the probability on that branch will be, and the higher are the
chances for that branch to be chosen.
The traversal of a branch by an ant is equivalent to the deposit of pheromone,
which makes the pheromone plays a big role in the choice of the moves of an ant
in the environment. Therefore, an ant colony algorithm is an algorithm made
on the basis of the pheromone trail and the state transition moves.
6
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
Computer Science, RUC CHAPTER 2. AN ANT COLONY FRAMEWORK
The state transition rule is a set of rules that defines the next move of an
artificial ant. Those rules are determined by using:
• The Constraint Satisfaction.
This is a memory that helps ants to construct possible good solutions. As
we have said when presenting ants, ants are chosing their path following a
random probability. Constraint settings make an ant’s choice of moves to
be more constructive rather than a total dependance on a random choice.
• The Heuristic Desirability
This is an evaluation of the closest steps, based on the inverted length
on each branch. It is used to increase the amount of pheromone on small
branches.
The state transition rule can be expressed as a random probability move function
of the Heuristic Desirability and the Pheromone update. The transition rules
are known as exploitation and exploration.
1. The exploitation rule.
The exploitation rule is determined by the choice of edge with the highest
amount of pheromone. It is straight forward using the heuristic desirabil-
ity, the pheromone trail and several parameter settings.
2. The exploration rule
The exploration rule is the search among all possible edges for the most
probable edge that can be used to construct a good solution for the ant.
However, such choice belongs to a probability that is set as well following
parameters on ants’ behaviors.
An ant colony algorithm can be used for solving a huge variety of combinatorial
problems as described in [DS04] following the above structure. However, the
parameter settings of the pheromone trail update rule and the state transition
rule depend on the problem the colony will have to solve, and the level of opti-
mization the colony would have to perform. Building a framework is modelling
a data-structure on a higher level abstraction that can be extended for solv-
ing such applications of the ant colony and/or used for other data-modelling.
Following Dorigo in [DG97], Chirico in [Chi04] designed his framework as a
distributed system of a colony of ants where ants perform the tasks described
above; moving and updating the pherome in an environment represented by
a graph. We have decided to keep the same general abstract design for two
reasons:
1. A graph is a simplified representation of a physical or abstract environ-
ment using nodes and edges/cost.
The different states an ant can move among in the environment are rep-
resented by the nodes in the graph, and the branches or arcs connecting
7
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
CHAPTER 2. AN ANT COLONY FRAMEWORK Computer Science, RUC
such nodes built by ants are edges. Edges can also be assimilated as cost,
as it still involves the connection between two states.
2. A distributed system where each ant represent a thread and the colony is
the shared object.
The global update is assigned to the colony as it is the update that affects
the behavior of the whole colony, while the local update is affected to the
threaded ant, as such update is controlling the individual ant on its single
meta-heuristic move.
The framework developed in [Chi04] was well structured in terms of classes and
we ended up with the same classical construction:
• The Graph object
This is the object defining the environment in which ants are capable of
performing their moves.
• The Ant Colony object
Ants are created using this object and run following a set amount of
iterations. On an initial run, the pheromone is set on each path, and after
each iteration, only the best path is being updated.
• The Ant object
This object performs single moves of an ant, which is moving in the graph
according to the state transition rule updating the pheromone after the
state move.
However, a few changes have been made, and we applied the improved version
of the framework on the TSP, a combinatorial problem solved efficiently using
ants in [DG97] and [DS04].
8
3 The Travelling Salesman
Problem
In our project we are working with the symmetric TSP, meaning that the dis-
tance between two cities a and b will be the same as between b and a. The TSP
is known to be a NP-hard problem, so unless we settle for an approximated
result, computations will be very time consuming. The easiest way (but as we
will see not the quickest way) to find a solution is just to find all the paths, and
then choose the shortest one. Unfortunately not many cities are necessary be-
fore we end up with an unmanageable number of tours, which again will require
an unlimited amount of calculation power. When leaving the first city starting
a tour (where the tour will consist of n cities), there will be n− 1 cities to choose
among, and so on after the next city has been visited. This will end up giving us
(n − 1)!. But as back and forth is the same (because of the symmetrical nature
of the problem), we can divide it by two and get the expression:
(n − 1)!
Number of tours = (3.1)
2
Such a method, which will end up giving the optimal solution, is obviously not
very feasible because of the time consumption required to calculate all the tours.
If we assume that we can calculate one tour per nanosecond (10−9 seconds), the
time consumption will be as seen in table 3.2.
2 As comparison it can be mentioned that there are app. 4E+79 hydrogen atoms in the
universe (http://www.madsci.org/posts/archives/oct98/905633072.As.r.html)
9
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
CHAPTER 3. THE TSP Computer Science, RUC
Table 3.2: Time required to calculate tours if one tour requires 1 nanosecond
It can be seen that even for small instances, the time consumption is extremely
high if we want to find every possible tour. Instead we can use an approximation
algorithm, which in less time will end up giving a result that isn’t necessarily
the best tour, but instead a tour that is close to the best tour.
In the previous chapter, we defined a common structure for ant colony algo-
rithms; we are aiming in this section to describe the use of that structure based
on mathematical expressions given in [DS04] for solving the TSP. An impor-
tant element that has to be followed during the implementation of the tour
construction is a heuristic list. It defines the constraint satisfaction described
in the previous chapter which is, for the TSP, not visiting a node twice. Such
constraint helps visiting all the nodes before returning to the initial node.
10
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
Computer Science, RUC CHAPTER 3. THE TSP
An ant colony algorithm uses two heuristic lists for instantiating the moves of
ants in the graph. The two lists are the neighborhood list and the heuristic
choice list, also known as the tabu list.
A heuristic tour construction starts from a tour which is getting improved as long
as the algorithm runs. The neighborhood list is used to improve the minimal
tour construction starting from the nearest neighbor tour, as we believe that the
overall best tour may contain a subset of the nearest neighbor tour. Moreover,
the neighborhood list is used to determine the length of the nearest neighbor
tour used for setting the initial deposit of the pheromone by an ant on an edge
in the local update rule (see equation 3.5).
The same list can also be used for further optimizations such as 2-opt and
2,5-opt (see chapter 4 for details).
The choice list is the list of cities the ant has to visit to perform a tour. The
characteristic of the choice list is that once an ant has chosen the next city to
visit, that city is removed from the choice list. The procedure of searching in
the list ends when there are no more cities to visit; at this point the ant has to
go back to the starting city. In Chirico’s implementation of the TSP, there were
no consideration of the return of the ant which led to unrealistic results.
The above mentioned lists are relevant for the state transition rule, as it is the
decision rule of an ant for the choice of the next unvisited city.
In the TSP state transition rule, the move to the next state is determined by
a value q randomly distributed over an interval [0,1] and another value Q0 also
set between [0,1]. The two values are compared, and their comparison leads to
one of the two possible rules:
1. Exploitation if q ≤ Q0 .
The exploitation is the maximum value obtained by combining the con-
centration of the pheromone on an edge with its heuristic desirability.
11
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
CHAPTER 3. THE TSP Computer Science, RUC
2. Exploration if q > Q0 .
In this rule, the transition is based on the choice of the city with the highest
probability using the probability expression or the random proportional
choice defined in equation 3.3.
The following expression denotes the description given above of the nodes’ tran-
sition states for the TSP.
argmaxuJik {[τiu (t)] · [ηiu ]β } if q ≤ Q0
j= (3.2)
J if q > Q0
For the TSP, Chirico expressed the parameter of deposit by combining the sum
of all the average lengths between the nodes and the number of nodes to obtain
the following:
2·n
τ0 = (3.4)
δ(r, s)
n is the number of nodes.
δ(r, s), the length between node r and node s.
Chirico did not expand on why he had used this expression, so we decided instead
to chose the expression 3.5 given in [DG97] and [DS04], where the parameter of
deposit is based on the length constructed by the nearest neighbor list and the
number of nodes.
12
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
Computer Science, RUC CHAPTER 3. THE TSP
With n as the number of cities and Lnn the length produced by the nearest
neighbor list.
Equation 3.5 is used to spread the pheromone using equation 3.6 on each edge
used by an ant. The fact that the pheromone is spread along all edges traversed
by an ant opens for all possible solutions.
ρ is the parameter of decay and t is the iteration number when the update is
performed.
k
where ρ is still the parameter for the pheromone decay and Δτi,j a parameter
of deposit defined by:
k W
Δτi,j = (3.8)
Lbest
Where Lbest is the length of the best cycle, and W is a parameter ranged be-
tween [1..100]. Our choice of W is based on the settings of Bonabeau et al.
described in [JM03].
3.5 TSPLIB
The tests made using the TSP algorithm are based on real cases using TSPLIB
as a reference. TSPLIB is an online library, developed by the university of
Heidelberg in Germany that contains several samples of TSP and similar related
problems ranged on a list of different files. It has become a standard reference in
modern research and the documentation can be obtained in [Rei95]. We chose
solely to focus on instances of the type Symmetric Euclidian TSP, referenced
as EU C 2D, meaning that distances (or weights) between nodes are expressed
on an Euclidean 2D coordinate system. The coordinates are decimal numbers
(or doubles), including negative values and the distances between the nodes are
computed according to the Pythagoras equation.
Based on the framework structure, we extended the TSP for tour optimiza-
tions and implemented methods for local search based on the 2-opt and 2,5-opt
algorithms.
13
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
CHAPTER 3. THE TSP Computer Science, RUC
14
4 Local search optimization
No matter how effecient a TSP algorithm is, it will in theory always have some
shortcomings, as the updating rules can not possibly take all situations into
account when being designed. Therefore it will always be an advantage to set
an optimization method, which can be used after retrieving an initial result from
the TSP algorithm for improvement. The heuristic used for optimizing the TSP
is local search.
The most commonly used optimization algorithms for the TSP are 2-opt, 2,5-
opt, 3-opt and the Lin-Kernighan. The Lin-Kernighan algorithm is generally
seen as being the most efficient optimization algorithm right now, particularly
after Keld Helsgaun created and published his own implementation[Hel98]. Its
efficiency is to be seen in its complexity, which convinced us from the beginning,
that even if it could have been better to get it involved in the project, we would
have to drop it as we didn’t have the required time and experience to implement
it. Instead we turned ourselves towards implementating a 2-opt, hoping to have
time to also implement a 2,5-opt and 3-opt algorithm. As time went by, and
despite the simplicity of the 2-opt algorithm and implementation, we ended up
spending a lot of time struggling to get it to work properly and optimizing the
code. This resulted in that we after this only had time to implement a 2,5-opt
algorithm, meaning that we had to give up on trying to implement a 3-opt
algorithm.
4.1 2-opt
The 2-opt is a basic case of the local search optimization heuristics, and as
such it is capable of obtaining useful results very fast. Even if the other more
advanced options, such as the Lin-Kernighan, would give us a higher chance
of a near to optimal (if not the optimal) tour, the 2-opt is a feasible choice
when looking at its results versus the time required to obtain these results. The
implementation of the 2-opt is based on the following points as shown in figure
4.1:
1. Take two pairs of consecutive nodes, pairs A & B and C & D from a tour.
2. Check to see if the distance AB + CD is higher than AC + DB.
3. If that is the case, swap A and C, resulting in reversing the tour between
the two nodes.
The tour should be run through from the beginning to check for any possible
swaps every time a swap is made, as every swap results in a new tour being
made. The swap can be performed in two different ways:
• Search until the first possible improvement is found, and perform the swap.
15
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
CHAPTER 4. LOCAL SEARCH OPTIMIZATION Computer Science, RUC
• Search through the entire tour to find all possible improvements, and
perform only a swap on the best improvement.
We chose to use the first option (as seen in code fragment 4.1), as the second
one could possibly run for a much longer time before returning a result, as it
has to run through its entire list of neighbors before it performs a swap, whereas
the first on performs the swap as soon it hits the first possible improvement.
The disadvantage of choosing the first one over the second one is that we might
loose a potential good improvement.
For shorter tours it is feasible to let the algorithm run until it cannot find another
swap, but for larger tours it is recommended to implement a check which at some
point during optimizing should go in and stop the process, as it would run for
an undesirably long time. This could be a simple limit on how many swaps
should be done until it stops. The disadvantage of doing it like this is that
the chances for achieving the optimal tour length decreases dramatically, as you
are not letting the program run undisturbed until it can’t find more possible
optimizations. On the other hand you limit the runtime and are therefore not
forced to wait for an unknown amount of time before it completes the run.
As it can be seen the codes themselves are simple, and it is very easy to recognize
what is going on. As mentioned earlier, the complexity of the code itself is not
what requires the long computation time, but rather the actual calculations and
operations that have to be done as the algorithm works itself through the tour.
According to [DS04, page 94], the time complexity for running a neighborhood
search in 2-opt is O(n2 ), which is significantly lower than the 3-opt’s O(n3 ).
Using various optimization techniques these times can be lowered, but as the
algorithm says above, a neighborhood search will have to be performed for every
node in the tour. The version we have implemented has already been optimized
in respect to how the algorithm originally was conceived, as using the nearest
neighbor list is part of the optimization techniques mentioned in [Nil03]. By
doing that it is possible to limit how many nodes each node should check when
looking for a possible improvement. We chose from the beginning to use the
complete neighbor list to make sure we don’t miss a possible swap, but in doing
that we have not saved any time compared to if we hadn’t implemented the
16
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
Computer Science, RUC CHAPTER 4. LOCAL SEARCH OPTIMIZATION
17
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
CHAPTER 4. LOCAL SEARCH OPTIMIZATION Computer Science, RUC
neighbor list. Instead we could have limited the list to only contain 20% of
the total number of nodes, decreasing the required computation time greatly,
but also increasing the risk that we won’t end up having a fully optimized tour.
According to [JM97, page 26] the improvemnent in a tour when going from 20 to
80 neighbors is only app. 0,1-0,2% on average, which means that our concerns
about not finding all the possible improvements were unnecessary. This changes
the time complexity for the 2-opt from O(n2 ) to O(nm), where m is the number
of neighbors.
4.2 2,5-opt
The concept of the 2,5-opt algorithm is simpler compared to the 2-opt algorith-
mas as it only performs a move of a single node. The simplicity of the algorithm
affects the results that can be gained by using the 2,5-opt, which is why our
opinion is not to use this optimization algorithm alone, but rather use it in com-
bination with another, which in our case is the 2-opt. But it can be useful as a
finishing touch; after running another optimization algorithm, it can be used to
find small improvements throughout the tour that the former optimization did
not find, thus decreasing the distance a little more. The structure of the 2,5-opt
algorithm is as seen in figure 4.2:
1. Take two consecutive nodes A and B.
2. Check to see if the distance is decreased if C is moved in between A and
B.
3. If that is the case, insert C in between A and B.
From the visual representation in figure 4.2, it is obvious that the 2,5-opt only
performs a simple move of a node, solely dependent on that the distance AB +
CD + DE is higher than the distance CE + AD + BD.
18
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
Computer Science, RUC CHAPTER 4. LOCAL SEARCH OPTIMIZATION
19
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
CHAPTER 4. LOCAL SEARCH OPTIMIZATION Computer Science, RUC
Even if the actions done by the algorithm are simpler than those of the 2-opt
algorithm, the complexity of the code is slightly higher, as another node is to
be involved to enable the computations. But this does not change the fact that
the algorithm only affects these 5 nodes, whereas the 2-opt algorithm impacts
not only the 4 named nodes, but also all those nodes between A to C.
Comparing to the potential time consumption of the 2-opt algorithm, the 2,5-opt
therefore has the advantage that less computation time is needed for changing
nodes, as only 5 nodes are to be changed. A way to optimize the 2,5-opt can
also be done by using a neighborhood search similar to the one in the 2-opt,
with the results in a time complexity of O(n2 ), or O(nm) if you chose to limit
the neighbor list.
20
5 Implementation
In this chapter we will introduce the functionality of Chirico’s original program,
followed by introducing our version with the changes we have made including
extra classes we implemented to get the functionality we wanted.
1. The graph
When starting the application, an object of the type AntGraph is created,
containing the matrices delta described above and tau for setting the
pheromone on the edges of the graph. The class also contains methods
that enables changes in these matrices during runtime, such as updating
the pheromone on the edges and resetting tau for a new repetition.
2. The ant colony
After creating the graph, an AntColony object is created, with the graph as
one of its parameters. This way, the ants can - through the colony - always
get access to the graph so they know what options they have when going to
their next node. The colony keeps track of all the ants associated with this
colony (as the framework supports more than one colony at a time), which
is accomplished by having an array of ant objects. The ant colony also
stores information of the best tour performed by the ants at each iteration.
Before the first iteration is run, the abstract method createAnts is called
6 The Steiner Problem is similar to TSP, but opposite TSP where you only have the nodes
you are supplied from the beginning, the SP allows for creating temporary nodes, that can
shorten the tour between several nodes. Eg. would a tour between three nodes using the SP
be shorter than when using the TSP, as you can put a node in the middle, letting the edges
connect via this. This way all the nodes are connected, but non of them are directly.
21
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
CHAPTER 5. IMPLEMENTATION Computer Science, RUC
to create the ants, taking the graph and number of ants to be created as
parameters. All the iterations are then run through, and each iteration
begins by starting all the ants, which report back to the colony using
the update method when they have created a new tour. When the ants
have been started the abstract method globalUpdatingRule is called,
applying the global updating rule to the graph’s edges. When all the
ants have reported back and the global updating rule has been applied, a
new iteration is started if there are still any left according to the colony’s
iteration counter.
3. The ant
The Ant object holds information about the start node, the current node,
the tour list7 , its best tour so far and the iteration the best tour was made.
When the start method for an ant is called, a new thread is created with
7 The tour list is the list containing the nodes the ant has visited so far during the iteration.
22
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
Computer Science, RUC CHAPTER 5. IMPLEMENTATION
the ant as parameter. The thread is then run, finding the next node for the
ant using the abstract method stateTransitionRule. At the end of the
method call, it calculates its new tour length based on the distance to the
current node, adds the new node to its tour list, and deposits pheromone
on that edge according to the abstract method localUpdatingRule. At
the end of the iteration it checks to see if the new tour is shorter (abstract
method better) than the best tour so far, and if this is the case, the new
tour becomes the best tour so far.
The TSP algorithm for the original code is fairly simplified, as the basic func-
tionality of the ant already exists in the framework. As an extension to the
framework, it is only supplying rules for the ants’ behaviour.
1. The ant colony for TSP
As described in figure 5.1, the AntColony4TSP class only holds its con-
structor and implements the two abstract methods globalUpdatingRule
and createAnts. The colony creates the ants of the type Ant4TSP, resets
the ants (by resetting the values for the ants’ best tour), associates them
with this colony, and sets the starting node as a random one. The global
updating rule algorithm used for this TSP solution can be seen in [Chi04,
eq 4].
2. The ant for TSP
The Ant4TSP is an extension of Ant that overrides the ant’s initializa-
tion or the init method, adding a Hashtable of nodes the ant needs
to visit, and sets an end condition to true if the table is empty. The
localUpdatingRule and stateTransitionRule methods are performed
following the rules described in [Chi04]. The implemented better method
simply compares two final tour distances and select the best.
We very soon found limitations in the original framework; because the nodes
were represented by integers, they would not be able to carry any data, which
would make it impossible to give them any coordinates. This quickly convinced
us that we had to change how the framework handled the nodes, as we would re-
place the integers with Node objects instead. As we were dealing with TSP files,
we also set the framework to be compatible with the files found on TSPLIB.
For a view of the tour, we implemented a GUI and added buttons for setting
parameters without having to go into the Java files. A final goal was to imple-
ment one or more local search optimization algorithms in an attempt to give us
better chances of getting an optimal solution. We ended up with a structure
described by the figures 5.2, 5.3 and 5.4. We will be going through the frame-
work and TSP algorithm stating only the changes that have been made. We
also applied changes to the class names, as we were warned about a possible
23
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
CHAPTER 5. IMPLEMENTATION Computer Science, RUC
Figure 5.2: UML diagram of the new version; the framework.acos and tsp pack-
ages.
24
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
Computer Science, RUC CHAPTER 5. IMPLEMENTATION
Our TSP implementation has gone through some more extensive changes than
the framework, as a result of actually simulating the basic behaviours of the ants.
Apart from the algorithms, the most noteworthy changes have been made to
accomodate the Node objects instead of Integers, and making the parameters
in the algorithms get their values from the GUI.
The local updating rule of the AntForTSP class has not been changed if looking
at the computations that are done, but the ρ has been swapped with ξ to follow
Dorigo’s terminology as seen on page 78 in [DS04]. The only big change as such
has been done in the state transition rule method. First of all it now checks if
the current ant is the first ant in the first iteration; if that is the case it will
be doing a tour using the nearest neigbor heuristic. Otherwise the ant has the
choice between exploitation and exploration; the former is unchanged compared
to the one in Ant4TSP, but the latter has been changed. Instead of using the
equations found in [Chi04, eq 1&2], we implemented the equation 3.6 as seen in
code fragment 5.2.
The AntColonyForTSP class has had some extra functionality added which pro-
vides retrieval of the best tour in a list, either filled with Integers being node
25
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
CHAPTER 5. IMPLEMENTATION Computer Science, RUC
IDs, or actual Node objects. The global updating rule method has been changed
slightly; Δτ is now calculated as seen in 3.8. The implementation of the evapo-
ration and deposition have also been changed in accordance to equation 3.7 and
code fraction 5.3.
We put the additions to the code into 4 packages; Node, IO, tsp.optimization
and Main.
The Node package contains two classes; the Node and Neighbor classes. The
node class creates a node object which contains the node’s coordinates and ID.
It also has the possibility of assigning a list of Neighbor objects sorted by the
distance to the node. The neighbor is just a node object put together with a
distance to the node to which the neighbor belongs.
26
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
Computer Science, RUC CHAPTER 5. IMPLEMENTATION
Figure 5.3: UML diagram of the new version; the Main package.
The IO package
The program accesses the external tsp files via the InputFile class in the IO
package. This class takes the path and filename of a file, takes the data found
in the file and converts it into Node objects and puts them into an ArrayList
which can be retrieved using the getNode method.
27
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
CHAPTER 5. IMPLEMENTATION Computer Science, RUC
Figure 5.4: UML diagram of the new version; the Node, IO and tsp.optimization
packages.
Having the add and remove methods already built in the LinkedList object,
we are saved from a lot of work of changing the properties of T3’s neighboring
nodes.
28
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
Computer Science, RUC CHAPTER 5. IMPLEMENTATION
The Main package contains the GUI, TSPCanvas and TSPFileFilter classes,
which exist to make it easy for the user to control the program, as he in a user
interface can find the TSP instance file he wants to use, define the parameters
ρ, α, β, ξ, Q0 and W , choose the number of ants and iterations, choose what
kind of optimization he wants to have done on the tour (if any), and lastly get
a graphical representation of the tour when it has been found together with its
length.
The GUI is the main classs containing means for managing the values of the
parameters. The GUI extends JFrame which utilizes action listeners for tracing
user interactions with the GUI. The inner class InputVerifier makes sure
that the user only enters valid integers when choosing the number of ants and
iterations. The TSPFileFilter class makes the file chooser (which is used when
looking for a tsp file) only show folders and tsp files. The TSPCanvas is our
customized version of Canvas; it takes a tour, twoOpt or twohOpt object, and
draws the optimal tour on the canvas, scaling it so that it fits in the canvas,
whithout getting stretched.
Even if we have been spending a lot of time to get the code working the way we
wanted, we unfortunately still experience problems we haven’t been able to or
had time to solve before we got too close to the deadline. The known problems
are:
• The scrollbar in the GUI.
We have for some reason not been able to get the scrollbar to work properly
so that the user could scroll back and forth in the list of nodes to see in
what order they come in the final tour. This problem can be circumvented
by selecting the text and dragging the selection to the left or right (or just
pressing home/end). This is of course not a preferable way of doing it,
but until we figure out how to use the ScrollBar and ScrollPane in the
Java library, we have no solution for it at this time.
• dSum = Infinity
Occasionally when running the program, we experienced getting an Array
IndexOutOfBoundsException: -1 when the ant was to retrieve its next
node from the state transition rule method. We found out that at random,
dSum would be set to infinity because the distance between nCurNode and
nNode was 0. After some more investigation we found that when the er-
ror occured, the m nodesToVisitTble still contained the nCurNode even
29
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
CHAPTER 5. IMPLEMENTATION Computer Science, RUC
though it should have been removed when it was the ant’s next node. It
happened when there was only one node left in the m nodesToVisitTble,
as there wouldn’t be other nodes to be checked to see if they were above
0 (the balance). So as long there were more than one node left in the
m nodesToVisitTble, this bug would not have an affect on the overall
functionality, whereas when there was only one left, it stopped the pro-
gram.
To avoid this there should have been an extra check when deciding whether
the ant should explore or exploit; if the dSum was Infinity, the ant should
be forced to exploit, completely avoiding the calculations in which it could
do damage.
It is unknown at this time what actually triggers the program not to
remove a visited node. We have conducted several tests printing out data
on the ant, but there seems to be no common thread between the different
occurences of the bug.
30
6 Experiments
After modifying Chirico’s framework and TSP implementation, we wanted to
investigate how well our program would perform compared to other existing
solutions. From the beginning we had chosen to take Chirico’s original appli-
cation, as it would be interesting to see if we in any way had improved its
performance, or just added extra functionality9 . As another reference, we took
a solution called SimpleACS [BDDW02], as it looked interesting because it was
obvious that its goal is not to be a framework, but rather just an ACS solution
without any thought of making it easy for other people to expand it at a later
time.
6.2 Tests
When wanting to test our program to see how it performed, we chose to only
use one case for testing, as we expected that changing the number of ants or
iterations would affect the outcome equally for all the cases. We chose to use
the eil51 case as our test subject for several reasons. Firstly we have been using
this case (or parts of it) througout the entire development period for testing our
9 Chirico’s unedited code can be seen in appendix D and also found on the enclosed CD
31
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
CHAPTER 6. EXPERIMENTS Computer Science, RUC
Figure 6.1: Running the eil51 instance 100 times using optimization.
When we don’t use our options to optimize the tour, the results change dra-
matically, and the results are far from as positive. As seen in figure 6.2 the
results vary between 462 and 509, with an average of app. 483 (8,45%, 19,6%
and 13,44% deviation respectively). Obviously the extra time required to do
the optimizations on the tour made by the TSP algorithm is well spent when
looking at the gained improvement.
We wanted to see how changing the number of ants and iterations would affect
the time the program would need to complete a task, and also if it would affect
the output distance. It could be interesting to see if it would be worth the time
to use 100 iterations instead of 10, or how it would affect the resulting distance,
and also if the changes were done to the ants instead. This resulted in four
tests, where eil51 was run 300 times, and the number of ants or iterations were
increased by one for each run, thereby testing it with 1-300 ants or iterations.
When the iterations were increased we were using 10 ants and vice versa. The
results can be seen in figures 6.3 - 6.6.
32
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
Computer Science, RUC CHAPTER 6. EXPERIMENTS
Figure 6.2: Running the eil51 instance 100 times without optimzation.
Figure 6.3: Running the eil51 testing the distance with 10 iterations and an
increasingly amount of ants.
One would at first think that because we use more iterations or ants, the chances
for getting a good result would be higher. Unfortunately that is not what our
tests tell us. As seen on figure 6.3 and 6.4 the results seem very random between
the two extreme values found in figure 6.1 (427 and 443). It can also be seen
that the average value is slightly higher when varying the number of iterations
than the number of ants, but we suspect that that might just be because of
33
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
CHAPTER 6. EXPERIMENTS Computer Science, RUC
Figure 6.4: Running the eil51 testing the distance with 10 ants and an increas-
ingly amount of iterations.
Figure 6.5: Running the eil51 testing the time with 10 iterations and an increas-
ingly amount of ants.
the randomness of the results. We tried also running with 10 ants and 5000
iterations to see what kind of results we would get, and it was clear to us that
these results were just as random as those seen in figure 6.3 and 6.4.
Not finding any evident order in the results when changing the number of ants or
iterations, we started investigating any relation between the computation time
and number of ants or iterations, and we found that it’s a completely different
case. For both varying number of ants and iterations we got an approximated
34
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
Computer Science, RUC CHAPTER 6. EXPERIMENTS
Figure 6.6: Running the eil51 testing the time with 10 ants and an increasingly
amount of iterations.
linear ascending line, only with few discrepancies. These can be seen in figure
6.5 and 6.6. Notice that figure 6.5 has a slightly faster ascension than figure 6.6
as a new ant requires more computation power (and therefore more time) than
a new iteration.
When comparing our program’s performance with the two beforementioned ap-
plications, we took all the instances found at TSPLIB of the type Eucledian 2D
(which can be found on the enclosed CD), and let the programs try to find a
solution. As neither Chirico’s program nor SimpleACS implement an optimiza-
tion algorithm, we deactivated ours so that we would get a more fair result. For
the tests we used 30 ants and 300 iterations.
As seen in table 6.1, the SimpleACS surpasses the two other in both time con-
sumption and quality of the output result. The reason for this is that SimpleACS
as mentioned is not a generalized framework which needs to be easy to use so it
can be extended by other people for other solutions not necessarily thought of
by the programmer. Instead it is highly specialized with only one kind of im-
plementation in mind. This heightens its efficiency greatly, and this is reflected
in the results seen in table 6.1. Another thing to think of is that SimpleACS is
not object oriented, so not having to handle custom objects limits the weight of
the program on a computer, giving the program an extra advantage. Compared
to Chirico’s original program we actually received better results, proving that
the changes we made to his program were not only simple changes, but also
improvements. On the other hand our program required more time to do the
calculations, so in this case one has to decide whether the time spent or the
final result is the most important thing.
35
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
CHAPTER 6. EXPERIMENTS Computer Science, RUC
Table 6.1: Comparison of performance. The empty places are runs where the
program encountered a java.lang.OutOfMemoryError: Java heap space
exception.
We then tried to use our optimization algorithms to see if using them would
give us an advantage in both time and quality against the others. This time
we only used 10 ants and iterations, as the optimizations would compensate for
low quality of the initial result from the TSP algorithm. The results of this test
can be seen in table 6.2.
Table 6.2: The improvement going from not using to using optimization.
36
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
Computer Science, RUC CHAPTER 6. EXPERIMENTS
Deviations
Instance Optimal Chirico’s SimpleACS Our solution
distance solution without with
optimization optimization
a280.tsp 2579 27,918% 8,996% 20,512% 3,722%
berlin52.tsp 7542 7,385% 2,731% 6,855% 4,773%
bier127.tsp 118282 15,324% 6,149% 11,234% 3,515%
ch130.tsp 6110 24,157% 4,157% 16,678% 3,912%
d1655.tsp 62128 41,835%
d198.tsp 15780 18,916% 9,867% 2,205% 1,502%
d657.tsp 48912 52,327% 25,386% 5,655%
eil101.tsp 629 18,76% 3,975% 18,919% 3,657%
eil51.tsp 426 7,981% 1,643% 10,094% 0,469%
eil76.tsp 538 12,082% 1,673% 14,312% 0,929%
fl1400.tsp 20127 20,296%
gil262.tsp 2378 42,473% 11,018% 18,713% 5,887%
kroA100.tsp 21282 19,002% 1,424% 19,444% 3,181%
kroA150.tsp 26524 30,772% 4,064% 19,175% 5,934%
pr1002.tsp 259045 29,658%
u724.tsp 41910 33,102%
Table 6.3: The deviation of the different applications from the optimal distance.
Looking at table 6.3 the deviations from the optimal solutions can be seen, giving
a better view of how close we actually are compared to the other two programs.
The SimpleACS is 4-18 percentage points better than our non-optimized pro-
gram except for the d198 instance, where we actually have an improvement
of app. 7 percentage points. With Chirico’s original program it’s a different
story; here we are between 0,5 and 24 percentage points better, except for the
kroA100 and eilXXX instances, where he is between app. 0,2 and 2 percentage
points better. So even if we at times get worse results that Chirico’s program,
our improved instances compensate greatly. On the other hand we are lacking
in ability to come up with as many solutions as Chirico, and as seen back in
table 6.1 we still spend extra time on getting to our results. In figure 6.7 we
have put the three programs’ performances into a chart, where we are using our
37
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
CHAPTER 6. EXPERIMENTS Computer Science, RUC
Figure 6.7: Our un-optimized preformance as index 100 compared to the optimal
solution, Chirico’s application and SimpleACS.
Looking at the deviations of our program with optimization activated, the dif-
ferences in the deviations between our and the other programs are more striking,
considering that we even get better results than most of those of the SimpleACS;
only three instances (berlin52, kroA100 and kroA150) are solved better by Sim-
pleACS than by ours (if one chooses to disregard the fact that SimpleACS is
able to handle four instances that ours can not), with a difference that varies be-
tween 1,5 and 2 percentage points. Those we solve better are in an interval from
app. 0,2 to 20 percentage points. Comparing with Chirico’s original program
we are only getting better results than his, all ranging from 3 to 47 percentage
points. Unlike when running the program without the optimization, we also
have a great time saving compared to his. On figure 6.9 the performances and
optimal solution can be seen with ours as index 100. As it can be seen in 6.10
our time consumption has dropped greatly, being at par - if not better - with
SimpleACS.
38
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
Computer Science, RUC CHAPTER 6. EXPERIMENTS
Figure 6.8: Our time consumption without optimization as index 100 compared
to Chirico’s application and SimpleACS.
Figure 6.9: Our optimized preformance as index 100 compared to the optimal
solution, Chirico’s application and SimpleACS.
39
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
CHAPTER 6. EXPERIMENTS Computer Science, RUC
Figure 6.10: Our time consumption with optimization as index 100 compared
to Chirico’s application and SimpleACS.
40
7 Discussion
Taking our assumption from the introduction, one could question the reasons
why we chose to apply the changes to the original framework. By making
changes on the framework we are giving it settings so that several applications
can be easily implemented without ruining its ability to solve a combinatorial
problem using ants. We changed e.g. the graph because when using the graph
we wanted to keep track of the nodes’ coordinates. However, it could have
been possible to have only the node IDs as integers as it would have lowered
the required space and possibly sped up the algorithms. Meanwhile, we are
convinced that it is better to use a node structure as it contains necessary
information, as we accessed the node list to compute the nearest neighbor tour
length used by the graph to compute τ0 .
We considered implementing a framework for the TSP in the ACO framework,
but we realised that having a framework for the TSP which is using an ACO
structure is very similar to an ACO framework. The most important methods
needed by a TSP framework are the pheromone updating rules and the state
transition rule. Both are already defined in the ACO framework, so building a
framework for the TSP would be like building the ACO framework once again.
We are not convinced that the framework can handle all ant colony algorithms,
as we found out that the computation for η (see chapter 3) is not the same
for the TSP and QAP10 . In fact, our heurisitic desirability is expressed as the
inverse of a distance matrix, whereas in the QAP it is expressed as the heuristic
matrix made from the product of the distance and flow matrices. A way to
handle this is to override the graph object in the framework by a new method
that will be required for the computation of such heuristic desirability.
From the above analysis, we are still questioning ourselves about using a frame-
work instead of a specialized implementation in terms of speed. As the figures
6.8 and 6.10 show, if one’s primary focus is on the speed of computation, then a
framework is not the best choice. Instead one should focus on creating a special-
ized implementation with a single goal in mind. An example is an application
of a framework on a routing system, the figures 6.8 and 6.10 will be able to give
an idea of what could happen to the speed of the transmissions on the network.
However, one shouldn’t neglect the importance a framework has as a data struc-
ture, which can be used to model other kinds of data.
41
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
CHAPTER 7. DISCUSSION Computer Science, RUC
42
8 Conclusion
We took Chirico’s original program and changed it so it supports node objects
instead of integers, and we applied a few changes in the structure based on
Dorigo’s implementation of the TSP. Unfortunately we did not have time for
testing different combinations of the program’s parameters, trying to find a
golden combination that would give us a a better result than other combinations,
and instead we decided to go with values recommended by Dorigo. This resulted
in slightly better results than Chirico’s original program with about half of the
tested cases, however at the cost of longer run times. Our results deviated 2-20%
from the optimal solutions.
When applying the 2-opt and 2,5-opt algorithms, we made the program decrease
its computation times with over 97% while improving the results by 0,6-13,9%.
These results were all better than Chirico’s original program, and compared to
a specialized program not based on a framework, most of the results were better
or similar. Our results when using optimization deviated from less than 0,5%
to 6%, unfortunately they never reached the optimal solution. The time spent
calculating the results were on a par with those of the specialized program, while
the times for Chirico’s program were now 35-65 times higher.
We added a GUI which gave the user an easy-to-use interface, where he or
she could find and choose what instance he wanted to test, and change the
parameters. We also added a graphical view of the tour, giving the user the
opportunity to see how a tour looked when it had been created.
Consequently we feel that we have answered satisfactory on our problem formu-
lation; our test results show that our program is slightly better than Chirico’s
when not using optimization, and when using optimization, the program com-
petes well with other TSP implementations.
43
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
CHAPTER 8. CONCLUSION Computer Science, RUC
44
9 Perspectives
We feel that using Chirico’s original application by expanding it with TSP
and optimization algorithms, its status as a framework has been upheld. The
changes made in Chirico’s original version are mostly directed inwards at its
internal structure, not affecting the public access points, albeit some of them
have been undergoing changes to support the use of Node objects. We are quite
satisfied with what we have done with the program, but nothing is perfect, so
if our application should have had an overhaul done, several possibilities would
be available:
• Implementing support for more than just the EU C 2D cases. This could
be done by adding functionality into the InputFile class that checked the
file’s type and reacted accordingly.
The framework already has the basics done for working on a network, as the
graph is serialized and the ants are threads. But moving the framework from
a single machine to a large network would still require a certain amount of
tweaking and adjustment, and it would also require implementation of various
network interfaces (sockets and/or RMI). Depending on the effectiveness of the
network implementation and the bandwidth of the network itself, it might be
possible to achieve better results than those we have because of the greater
amount of available computing power. Doing this for only small instances will
probably not be worth the trouble, as the network bandwidth will be the major
bottleneck, so the goal of the network implementation would be able to solve
very large instances. This could be done by splitting up the instances into
smaller ones, thereby giving each involved computer a small(er) instance to
solve. But this would then require implementation of algorithms that optimally
can split and combine the instances without loss of distance quality.
45
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
CHAPTER 9. PERSPECTIVES Computer Science, RUC
46
Bibliography
[BDDW02] Mikkel Bundgaard, Troels C. Damgaard, Federico De-
cara, and Jacob W. Winther. Ant routing sys-
tem, 2002. Can be found together with its code on
http://www.itu.dk/people/mikkelbu/projects/ars.html.
[BDT99] Eric Bonabeau, Marco Dorigo, and Guy Theraulaz. Swarm Intel-
ligence - From Natural to Artificial Systems, chapter 2. Oxford
University Press, 1999.
[BT00] Eric Bonabeau and Guy Théraulaz. Swarm smarts. Scientific Amer-
ican, Inc., pages 72–79, March 2000.
[Chi04] Ugo Chirico. A java framework for ant colony systems. Technical
report, Siemens Informatica S.p.A, 2004.
[DG97] Marco Dorigo and Luca Maria Gambardella. Ant colony system: A
cooperative learning approach to the traveling salesman problem.
IEEE Transactions on Evolutionary Computation, 1(1), 1997.
[DS04] Marco Dorigo and Thomas Stützle. Ant Colony Optimization. The
MIT Press, 2004.
[ERV06] Matthias Englert, Heiko Röglin, and Berthold Vöcking. Worst case
and probabilistic analysis of the 2-opt algorithm for the TSP. Tech-
nical report, Department of Computer Science, RWTH Aachen,
Germany, July 2006. We used a shortened version of the document,
app. 10 pages compared to the full version’s 50.
47
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
BIBLIOGRAPHY Computer Science, RUC
[JM03] Uffe Thomas Volmer Jankvist and Magnus Kaas Meinild. Myrein-
telligens, 2003.
[Nil03] Christian Nilsson. Heuristics for the traveling salesman problem.
Technical report, Linköping University, 2003.
[OMI99] Hiroyuki Okano, Shinji Misono, and Kazuo Iwano. New TSP con-
struction heuristics and their relationships to the 2-opt. Journal of
Heuristics, (5):71–88, 1999.
[Rei95] Gerhard Reinelt. Tsplib 95. Technical report, Institut für Ange-
wandte Mathematik, 1995.
[Sed90] Robert Sedgewick. Algorithms in C++. Addison-Wesley Publishing
Company, 1990.
[ZMH06] Salah Zidi, Salah Maouche, and Slim Hammadi. Ant colony with
dynamic local search for the time scheduling of transport networks.
International Journal of Computers, Communications & Control,
1(4):110–125, 2006.
48
A Screenshots
49
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
APPENDIX A. SCREENSHOTS Computer Science, RUC
Figure A.2: The open file dialog box when locating an instance to run.
50
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
Computer Science, RUC APPENDIX A. SCREENSHOTS
51
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
APPENDIX A. SCREENSHOTS Computer Science, RUC
52
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
Computer Science, RUC APPENDIX A. SCREENSHOTS
53
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
APPENDIX A. SCREENSHOTS Computer Science, RUC
54
B Contents on the CD
We have enclosed a CD containing a few things we felt would be convenient for
the reader to have access to.
The root consists of four folders; Report, JavaDoc, Code and TSPFiles.
• The Report folder contains the report in a PDF file format.
• The JavaDoc folder provides the Java documentation written in our ap-
plication’s code.
• The folder TSPFiles contains the tsp files of the type Eucledian 2D which
we have used for benchmarking.
• The code folder contains a TSP.jar file (which is our application), and
three other folders; TSP, SimpleACS and Chirico.
– The TSP folder contains our program, including both java and class
files.
– The SimpleACS folder contains the SimpleACS program.
– In the Chirico folder you can find Chirico’s original program.
55
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
APPENDIX B. CONTENTS ON THE CD Computer Science, RUC
56
C Code for SimpleACS
This program has been handed to us by our supervisor, which has been taken
from a former project he has been supervising.
C.1 Loader.java
1 import java . u t i l . ∗ ;
2 import java . i o . ∗ ;
3
4 p u b l i c c l a s s Loader {
5
6 i n t n u m Ci t i e s = 0 ;
7 S t r i n g wo r k S t r = ” ” ;
8
9 p u b l i c i n t [ ] [ ] l o a d D a t a ( S t r i n g path )
10 {
11 S t r i n g T o k e n i z e r st r To k ;
12 i f ( path != n u l l )
13 {
14 BufferedReader reader ;
15 try
16 {
17 r e a d e r = new B u f f e r e d R e a d e r ( new F i l e R e a d e r ( path ) ) ;
18 wh i l e ( r e a d e r . ready ( ) )
19 wo r k S t r += r e a d e r . r e a d L i n e ()+”\n ” ;
20 }
21 catch ( FileNotFoundException e )
22 {
23 System . e r r . p r i n t l n ( e +
24 ”\ n F i l e n b l e v i k k e f u n d e t . ” +
25 ” I n d t a s t nyt f i l n a v n og p r v i g e n . ” ) ;
26 }
27 catch ( IOException e )
28 {
29 System . e r r . p r i n t l n ( e +
30 ”\ n H a r d w a r e f e j l u n d e r l s n i n g . ” +
31 ” I n d t a s t nyt f i l n a v n og p r v i g e n . ” ) ;
32 }
33 }
34 n u m Ci t i e s = g e t N u m b e r O f Ci t i e s ( new S t r i n g T o k e n i z e r ( workStr , ” \n\ t \ r \ f ” ) ) ;
35 r e t u r n b u i l d D i s t M a t r i x ( new S t r i n g T o k e n i z e r ( workStr , ” \n\ t \ r \ f ” ) ) ;
36 }
37
38 p r i v a t e i n t g e t N u m b e r O f Ci t i e s ( S t r i n g T o k e n i z e r st r To k )
39 {
40 S t r i n g tempStr = ” ” ;
41 while ( true )
42 {
43 tempStr = st r To k . nextToken ( ) ;
44 i f ( tempStr . e q u a l s ( ”DIMENSION” ) )
45 {
46 st r To k . nextToken ( ) ;
47 tempStr = st r To k . nextToken ( ) ;
48 r e t u r n I n t e g e r . p a r s e I n t ( tempStr ) ;
49 }
50 e l s e i f ( tempStr . e q u a l s ( ”DIMENSION : ” ) )
51 {
52 tempStr = st r To k . nextToken ( ) ;
53 r e t u r n I n t e g e r . p a r s e I n t ( tempStr ) ;
54 }
55 }
57
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
APPENDIX C. CODE FOR SIMPLEACS Computer Science, RUC
56 }
57
58 p r i v a t e i n t [ ] [ ] b u i l d D i s t M a t r i x ( S t r i n g T o k e n i z e r st r To k )
59 {
60 S t r i n g tempStr = ” ” ;
61 S t r i n g edgeWeightType = ”UNKNOWN” ;
62
63 while ( true )
64 {
65 tempStr = st r To k . nextToken ( ) ;
66 i f ( tempStr . e q u a l s ( ”EDGE WEIGHT TYPE” ) )
67 {
68 st r To k . nextToken ( ) ;
69 tempStr = st r To k . nextToken ( ) ;
70 edgeWeightType = tempStr ;
71 i f ( edgeWeightType . e q u a l s ( ” EXPLICIT” ) )
72 {
73 r e t u r n buildDistMatrixEXPLICIT ( new S t r i n g T o k e n i z e r (
74 workStr , ” \n\ t \ r \ f ” ) ) ;
75 }
76 else
77 {
78 r e t u r n buildDistMatrixEUC 2D ( new S t r i n g T o k e n i z e r (
79 workStr , ” \n\ t \ r \ f ” ) ) ;
80 }
81 }
82 e l s e i f ( tempStr . e q u a l s ( ”EDGE WEIGHT TYPE : ” ) )
83 {
84 tempStr = st r To k . nextToken ( ) ;
85 edgeWeightType = tempStr ;
86 i f ( edgeWeightType . e q u a l s ( ” EXPLICIT” ) )
87 {
88 r e t u r n buildDistMatrixEXPLICIT ( new S t r i n g T o k e n i z e r (
89 workStr , ” \n\ t \ r \ f ” ) ) ;
90 }
91 else
92 {
93 r e t u r n buildDistMatrixEUC 2D ( new S t r i n g T o k e n i z e r (
94 workStr , ” \n\ t \ r \ f ” ) ) ;
95 }
96 }
97 }
98 }
99
100 p r i v a t e i n t [ ] [ ] buildDistMatrixEUC 2D ( S t r i n g T o k e n i z e r st r To k )
101 {
102 fi na l int X = 0;
103 fi na l int Y = 1;
104 i n t tempMatrix [ ] [ ] = new i n t [ n u m Ci t i e s ] [ n u m Ci t i e s ] ;
105 S t r i n g tempStr = ” ” ;
106 double x , y = 0 . 0 ;
107 int counter = 0;
108 d o u b l e c o o r d s [ ] [ ] = new d o u b l e [ n u m Ci t i e s ] [ 2 ] ;
109 int dist = 0;
110 while ( true )
111 {
112 tempStr = st r To k . nextToken ( ) ;
113 i f ( tempStr . e q u a l s ( ”NODE COORD SECTION” ) )
114 {
115
116 w h i l e ( ! st r To k . nextToken ( ) . e q u a l s ( ”EOF” ) )
117 {
118 c o o r d s [ c o u n t e r ] [ X ] = Double . p a r s e D o u b l e ( st r To k . nextToken ( ) ) ;
119 c o o r d s [ c o u n t e r ] [ Y ] = Double . p a r s e D o u b l e ( st r To k . nextToken ( ) ) ;
120 c o u n t e r++;
121 }
122 break ;
123 }
124 }
125 f o r ( i n t j = 0 ; j < c o o r d s . l e n g t h ; j ++)
126 {
127 f o r ( i n t i = j ; i < c o o r d s . l e n g t h ; i ++)
128 {
129 d i s t = ( i n t ) Math . f l o o r ( . 5 + Math . s q r t (
58
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
Computer Science, RUC APPENDIX C. CODE FOR SIMPLEACS
C.2 SimpleACS.java
1 import java . i o . ∗ ;
2 import java . u t i l . ∗ ;
3
4 p u b l i c c l a s s SimpleACS {
5 s t a t i c f i n a l d o u b l e BETA = 2 ,
6 GAMMA = 0 . 1 ,
7 qZERO = 0 . 9 ,
8 Q = 1.0;
9 static fi nal int M = 2 ,
10 TMAX = 5 0 0 0 0 ;
11 s t a t i c f i n a l Random random = new Random ( ) ;
12
13 i n t CITIES ;
14 d o u b l e TAUZERO;
15 int distances [ ] [ ] ;
16 double v i s i b i l i t y [ ] [ ] ;
17 d o u b l e pheromones [ ] [ ] ;
18 i n t b e st To u r [ ] ;
19 i n t b e s t L e n g t h = I n t e g e r .MAX VALUE ;
20 b o o l e a n tabu [ ] ;
21
59
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
APPENDIX C. CODE FOR SIMPLEACS Computer Science, RUC
22 p u b l i c s t a t i c v o i d main ( S t r i n g a r g s [ ] ) {
23 L o a d e r l = new L o a d e r ( ) ;
24 SimpleACS main = new SimpleACS ( l . l o a d D a t a ( ” e i l 5 1 ” + ” . t s p ” ) ) ;
25 }
26
27 SimpleACS ( i n t d i s t a n c e s [ ] [ ] ) {
28 this . distances = distances ;
29 CITIES = d i s t a n c e s . l e n g t h ;
30 b e st To u r = new i n t [ CITIES ] ;
31 tabu = new b o o l e a n [ CITIES ] ;
32 initialize ();
33 run ( ) ;
34 System . o u t . p r i n t l n ( b e s t L e n g t h ) ;
35 f o r ( i n t i = 0 ; i < CITIES + 1 ; i ++)
36 System . o u t . p r i n t ( b e st To u r [ i ]+ ” ” ) ;
37 }
38
39 p u b l i c void i n i t i a l i z e ( ) {
40 i n t NNTour [ ] = new i n t [ CITIES + 1 ] ;
41 pheromones = new d o u b l e [ CITIES ] [ CITIES ] ;
42 v i s i b i l i t y = new d o u b l e [ CITIES ] [ CITIES ] ;
43
44 NNTour [ 0 ] = NNTour [ CITIES ] = 0 ;
45 tabu [ 0 ] = t r u e ;
46 f o r ( i n t i = 1 ; i < CITIES ; i ++) {
47 int nearest = 0;
48 f o r ( i n t j = 0 ; j < CITIES ; j ++)
49 i f ( ! tabu [ j ] &&
50 ( n e a r e s t == 0 | |
51 d i s t a n c e s [ NNTour [ i − 1 ] ] [ j ] < d i s t a n c e s [ i − 1 ] [ n e a r e s t ] ) )
52 nearest = j ;
53 NNTour [ i ] = n e a r e s t ;
54 tabu [ n e a r e s t ] = t r u e ;
55 }
56 b e st To u r = NNTour ;
57 b e s t L e n g t h = computeLength ( NNTour ) ;
58 TAUZERO = 1 . 0 / ( CITIES ∗ b e s t L e n g t h ) ;
59 System . o u t . p r i n t l n ( ”NN = ” + b e s t L e n g t h ) ;
60 f o r ( i n t i = 0 ; i < CITIES ; i ++)
61 f o r ( i n t j = 0 ; j < CITIES ; j ++)
62 pheromones [ i ] [ j ] = TAUZERO;
63 f o r ( i n t i = 0 ; i < CITIES ; i ++)
64 f o r ( i n t j = 0 ; j < CITIES ; j ++)
65 v i s i b i l i t y [ i ] [ j ] = Math . pow ( d i s t a n c e s [ i ] [ j ] , −BETA ) ;
66 }
67
68 p u b l i c v o i d run ( ) {
69 f o r ( i n t t = 0 ; t < TMAX; t++) {
70 i f ( t % 100 == 0 )
71 System . o u t . p r i n t l n ( ” I t e r a t i o n ” + t ) ;
72 f o r ( i n t k = 0 ; k < M; k++)
73 buildTour ( ) ;
74 f o r ( i n t i = 0 ; i < CITIES ; i ++)
75 pheromones [ b e st To u r [ i ] ] [ b e st To u r [ i + 1 ] ] =
76 pheromones [ b e st To u r [ i + 1 ] ] [ b e st To u r [ i ] ] =
77 ( 1 − GAMMA) ∗ pheromones [ b e st To u r [ i ] ] [ b e st To u r [ i + 1 ] ] +
78 GAMMA ∗ (Q / b e s t L e n g t h ) ;
79 }
80 }
81
82 p u b l i c void buildTour ( ) {
83 i n t tempTour [ ] = new i n t [ CITIES + 1 ] ;
84 i n t tempLength ;
85 d o u b l e w e i g h t s [ ] = new d o u b l e [ CITIES ] ;
86 d o u b l e si g m a W e i g h t s ;
87 d o u b l e q , tempWeight , t a r g e t ;
88 i n t l a s t , next ;
89
90 f o r ( i n t i = 0 ; i < CITIES ; i ++)
91 tabu [ i ] = f a l s e ;
92 l a s t = tempTour [ 0 ] = tempTour [ CITIES ] = random . n e x t I n t ( CITIES ) ;
93 tabu [ l a s t ] = t r u e ;
94 f o r ( i n t i = 1 ; i < CITIES ; i ++) {
95 f o r ( i n t j = 0 ; j < CITIES ; j ++)
60
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
Computer Science, RUC APPENDIX C. CODE FOR SIMPLEACS
96 w e i g h t s [ j ] = tabu [ j ] ? 0 :
97 pheromones [ l a s t ] [ j ] ∗ v i s i b i l i t y [ l a s t ] [ j ] ;
98 q = random . n e x t D o u b l e ( ) ;
99 next = 0 ;
100 i f ( q <= qZERO) {
101 tempWeight = 0 ;
102 f o r ( i n t j = 0 ; j < CITIES ; j ++) {
103 i f ( w e i g h t s [ j ] > tempWeight) {
104 tempWeight = w e i g h t s [ j ] ;
105 next = j ;
106 }
107 }
108 } else {
109 sigmaWeights = 0 ;
110 f o r ( i n t j = 0 ; j < CITIES ; j ++)
111 s i g m a W e i g h t s += w e i g h t s [ j ] ;
112 t a r g e t = random . n e x t D o u b l e ( ) ∗ s i g m a W e i g h t s ;
113 tempWeight = 0 ;
114 f o r ( i n t j = 0 ; j < CITIES ; j ++) {
115 tempWeight += w e i g h t s [ j ] ;
116 i f ( tempWeight >= t a r g e t ) {
117 next = j ;
118 break ;
119 }
120 }
121 }
122 i f ( tabu [ n e x t ] ) { System . o u t . p r i n t l n ( ”TABU\n” + n e x t ) ; System . e x i t ( 0 ) ; }
123 pheromones [ l a s t ] [ n e x t ] = pheromones [ n e x t ] [ l a s t ] =
124 ( 1 − GAMMA) ∗ pheromones [ l a s t ] [ n e x t ] + GAMMA ∗ TAUZERO;
125 tempTour [ i ] = l a s t = n e x t ;
126 tabu [ l a s t ] = t r u e ;
127 }
128 tempLength = computeLength ( tempTour ) ;
129 i f ( tempLength < b e s t L e n g t h ) {
130 b e st To u r = tempTour ;
131 b e s t L e n g t h = tempLength ;
132 System . o u t . p r i n t l n ( ” Be st = ” + b e s t L e n g t h ) ;
133 }
134 }
135
136 i n t computeLength ( i n t t o u r [ ] ) {
137 int length = 0;
138 f o r ( i n t i = 0 ; i < CITIES ; i ++)
139 l e n g t h += d i s t a n c e s [ t o u r [ i ] ] [ t o u r [ i + 1 ] ] ;
140 return length ;
141 }
142 }
61
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
APPENDIX C. CODE FOR SIMPLEACS Computer Science, RUC
62
D Chirico’s original program
D.1 Ant4TSP.java
1 /∗∗
2 ∗ Ant4TSP . j a v a
3 ∗
4 ∗ @author Cr e a t e d by Omnicore CodeGuide
5 ∗/
6
7 p a c k a g e com . u g o s . a c s . t s p ;
8 i m p o r t com . u g o s . a c s . ∗ ;
9
10 import java . u t i l . ∗ ;
11
12
13 public class Ant4TSP e x t e n d s Ant
14 {
15 private static final double B = 2;
16 private static final d o u b l e Q0 = 0.8;
17 private static final double R = 0.1;
18
19 private static f i n a l Random s r a n d Ge n = new Random ( System . c u r r e n t T i m e M i l l i s ( ) ) ;
20
21 p r o t e c t e d H a s h t a b l e m n o d e sTo V i si t Tb l ;
22
23 p u b l i c Ant4TSP( i n t s t a r t N o d e , O b se r v e r o b s e r v e r )
24 {
25 super ( startNode , observer ) ;
26 }
27
28 p u b l i c void i n i t ( )
29 {
30 super . i n i t ( ) ;
31
32 f i n a l AntGraph g r a p h = s a n t C o l o n y . getGraph ( ) ;
33
34 // i n i z i a l i z z a l ’ a r r a y d i c i t t da v i s i t a r e
35 m n o d e sTo V i si t Tb l = new H a s h t a b l e ( g r a p h . n o d e s ( ) ) ;
36 f o r ( i n t i = 0 ; i < g r a p h . n o d e s ( ) ; i ++)
37 m n o d e sTo V i si t Tb l . put ( new I n t e g e r ( i ) , new I n t e g e r ( i ) ) ;
38
39 // Rimuove l a c i t t c o r r e n t e
40 m n o d e sTo V i si t Tb l . remove ( new I n t e g e r ( m nStartNode ) ) ;
41
42 // nExplore = 0 ;
43 }
44
45 p u b l i c i n t s t a t e T r a n s i t i o n R u l e ( i n t nCurNode)
46 {
47 f i n a l AntGraph g r a p h = s a n t C o l o n y . getGraph ( ) ;
48
49 // g e n e r a t e a random number
50 double q = s r a n d Ge n . n e x t D o u b l e ( ) ;
51 i n t nMaxNode = −1;
52
53 i f ( q <= Q0 ) // E x p l o i t a t i o n
54 {
55 // System . o u t . p r i n t ( ” E x p l o i t a t i o n : ”);
56 d o u b l e dMaxVal = −1;
57 d o u b l e dVal ;
58 i n t nNode ;
59
60 // s e a r c h t h e max o f t h e v a l u e a s d e f i n e d i n Eq . a )
61 Enumeration enum1 = m n o d e sTo V i si t Tb l . e l e m e n t s ( ) ;
63
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
APPENDIX D. CHIRICO’S ORIGINAL PROGRAMComputer Science, RUC
62 w h i l e ( enum1 . hasMoreElements ( ) )
63 {
64 // s e l e c t a node
65 nNode = ( ( I n t e g e r ) enum1 . n e x t E l e m e n t ( ) ) . i n t V a l u e ( ) ;
66
67 // c h e c k on t a u
68 i f ( g r a p h . t a u ( nCurNode , nNode ) == 0 )
69 throw new Ru n t i m e E x ce pti o n ( ” t a u = 0 ” ) ;
70
71 // g e t t h e v a l u e
72 dVal = g r a p h . t a u ( nCurNode , nNode ) ∗ Math . pow ( g r a p h . e t h a (
73 nCurNode , nNode ) , B ) ;
74
75 // c h e c k i f i t i s t h e max
76 i f ( dVal > dMaxVal)
77 {
78 dMaxVal = dVal ;
79 nMaxNode = nNode ;
80 }
81 }
82 }
83 else // E x p l o r a t i o n
84 {
85 // System . o u t . p r i n t l n ( ” E x p l o r a t i o n ” ) ;
86 d o u b l e dSum = 0 ;
87 i n t nNode = −1;
88
89 // g e t t h e sum a t d e n o m i n a t o r
90 Enumeration enum1 = m n o d e sTo V i si t Tb l . e l e m e n t s ( ) ;
91 w h i l e ( enum1 . hasMoreElements ( ) )
92 {
93 nNode = ( ( I n t e g e r ) enum1 . n e x t E l e m e n t ( ) ) . i n t V a l u e ( ) ;
94 i f ( g r a p h . t a u ( nCurNode , nNode ) == 0 )
95 throw new Ru n t i m e E x ce pti o n ( ” t a u = 0 ” ) ;
96
97 // Update t h e sum
98 dSum += g r a p h . t a u ( nCurNode , nNode ) ∗ Math . pow ( g r a p h . e t h a (
99 nCurNode , nNode ) , B ) ;
100 }
101
102 i f ( dSum == 0 )
103 throw new Ru n t i m e E x c ept io n ( ”SUM = 0 ” ) ;
104
105 // g e t t h e e v e r a g e v a l u e
106 d o u b l e dAverage = dSum / ( d o u b l e ) m n o d e sTo V i si t Tb l . s i z e ( ) ;
107
108 // s e a r c h t h e node i n a g r e e m e n t wi t h eq . b )
109 enum1 = m n o d e sTo V i si t Tb l . e l e m e n t s ( ) ;
110 w h i l e ( enum1 . hasMoreElements ( ) && nMaxNode < 0 )
111 {
112 nNode = ( ( I n t e g e r ) enum1 . n e x t E l e m e n t ( ) ) . i n t V a l u e ( ) ;
113
114 // g e t t h e v a l u e o f p a s d i f i n e d i n eq . b )
115 double p =
116 ( g r a p h . t a u ( nCurNode , nNode ) ∗ Math . pow ( g r a p h . e t h a (
117 nCurNode , nNode ) , B) ) / dSum ;
118
119 // i f t h e v a l u e o f p i s g r e a t e r t h e t h e a v e r a g e v a l u e
120 // t h e node i s good
121 i f ( ( g r a p h . t a u ( nCurNode , nNode ) ∗ Math . pow ( g r a p h . e t h a (
122 nCurNode , nNode ) , B) ) > dAverage )
123 {
124 // System . o u t . p r i n t l n ( ” Found ” ) ;
125 nMaxNode = nNode ;
126 }
127 }
128
129 i f ( nMaxNode == −1)
130 nMaxNode = nNode ;
131 }
132
133 i f ( nMaxNode < 0 )
134 throw new Ru n t i m e E x c ept io n ( ” maxNode = −1”);
135
64
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
Computer Science, RUCAPPENDIX D. CHIRICO’S ORIGINAL PROGRAM
D.2 Ant.java
1 /∗∗
2 ∗ Ant . j a v a
3 ∗
4 ∗ @author Cr e a t e d by Omnicore CodeGuide
5 ∗/
6
7 p a c k a g e com . u g o s . a c s ;
8
9 import java . u t i l . ∗ ;
10 import java . i o . ∗ ;
11
12 p u b l i c a b s t r a c t c l a s s Ant e x t e n d s O b s e r v a b l e i m p l e m e n t s Runnable
13 {
14 p r i v a t e i n t m nAntID ;
15
16 protected int [ ] [ ] m path ;
17 protected int m nCurNode ;
18 protected int m nStartNode ;
19 protected double m dPathValue ;
20 p r o t e c t e d O b se r v e r m observer ;
21 p r o t e c t e d Vector m pathVect ;
22
23 private s t a t i c i n t s n A n t I D Co u n ter = 0 ;
24 private s t a t i c PrintStream s ou ts ;
25
26 protected s t a t i c AntColony s a n t C o l o n y ;
27
28 public s t a t i c double s d B e s t P a t h V a l u e = Double .MAX VALUE ;
29 public s t a t i c Vector s bestPathVect = n u l l ;
30 public st atic int [ ] [ ] s bestPath = null ;
31 public st atic int s nLastBestPathIteration = 0;
32
33 p u b l i c s t a t i c v o i d se t A n t Co l o n y ( AntColony a n t Co l o n y )
34 {
35 s a n t C o l o n y = a n t Co l o n y ;
36 }
37
38 public st atic void r e s e t ( )
39 {
65
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
APPENDIX D. CHIRICO’S ORIGINAL PROGRAMComputer Science, RUC
66
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
Computer Science, RUCAPPENDIX D. CHIRICO’S ORIGINAL PROGRAM
114 {
115 // a p p l y t h e L o c a l Updating Rule
116 l o c a l U p d a t i n g R u l e ( m nCurNode , nNewNode ) ;
117 }
118
119 // u p d a t e t h e c u r r e n t node
120 m nCurNode = nNewNode ;
121 }
122
123 s y n c h r o n i z e d ( graph )
124 {
125 // u p d a t e t h e b e s t t o u r v a l u e
126 i f ( b e t t e r ( m dPathValue , s d B e s t P a t h V a l u e ) )
127 {
128 s dBestPathValue = m dPathValue ;
129 s bestPath = m path ;
130 s bestPathVect = m pathVect ;
131 s n L a s t Be s t P a t h I t e r a t io n = s antColony . g e t I t e r a t i o n C o u n t e r ( ) ;
132
133 s o u t s . p r i n t l n ( ” Ant + ” + m nAntID + ” , ” + s d B e s t P a t h V a l u e +
134 ” ,” + s nLastBe stP athIte ration + ” ,” +
135 s bestPathVect . s i z e () + ” ,” + s bestPathVect ) ;
136 }
137 }
138
139 // u p d a t e t h e o b s e r v e r
140 m observer . update ( t h i s , null );
141
142 i f ( s a n t C o l o n y . done ( ) )
143 s outs . close ( ) ;
144 }
145
146 protected a b s t r a c t b o o l e a n b e t t e r ( d o u b l e dPathValue , d o u b l e d Be st P a t h V a l ue ) ;
147
148 public abstract int stateTransitionRule ( int r ) ;
149
150 p u b l i c ab st r ac t void localUpdatingRule ( i n t r , int s );
151
152 p u b l i c a b s t r a c t b o o l e a n end ( ) ;
153
154 p u b l i c s t a t i c i n t [ ] getBestPath ( )
155 {
156 i n t nBestPathArray [ ] = new i n t [ s b e s t P a t h V e c t . s i z e ( ) ] ;
157 f o r ( i n t i = 0 ; i < s b e s t P a t h V e c t . s i z e ( ) ; i ++)
158 {
159 nBestPathArray [ i ] = ( ( I n t e g e r ) s b e s t P a t h V e c t . e l e m e n t A t ( i ) ) . i n t V a l u e ( ) ;
160 }
161
162 r e t u r n nBestPathArray ;
163 }
164
165 public String toString ()
166 {
167 r e t u r n ”Ant ” + m nAntID + ” : ” + m nCurNode ;
168 }
169 }
D.3 AntColony4TSP.java
1 /∗∗
2 ∗ Pure Java c o n s o l e a p p l i c a t i o n .
3 ∗ Th i s a p p l i c a t i o n d e m o n s t r a t e s c o n s o l e I /O.
4 ∗
5 ∗ Th i s f i l e was a u t o m a t i c a l l y g e n e r a t e d by
6 ∗ Omnicore CodeGuide .
7 ∗/
8 p a c k a g e com . u g o s . a c s . t s p ;
9 i m p o r t com . u g o s . a c s . ∗ ;
10
11 import java . u t i l . ∗ ;
12 import java . i o . ∗ ;
67
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
APPENDIX D. CHIRICO’S ORIGINAL PROGRAMComputer Science, RUC
13
14 p u b l i c c l a s s AntColony4TSP e x t e n d s AntColony
15 {
16 protected s t a t i c f i n a l double A = 0 . 1 ;
17
18 p u b l i c AntColony4TSP ( AntGraph graph , i n t ants , int iterations )
19 {
20 s u p e r ( graph , a n t s , i t e r a t i o n s ) ;
21 }
22
23 p r o t e c t e d Ant [ ] c r e a t e A n t s ( AntGraph graph , i n t nAnts )
24 {
25 Random r a n = new Random ( System . c u r r e n t T i m e M i l l i s ( ) ) ;
26 Ant4TSP . r e s e t ( ) ;
27 Ant4TSP . se t A n t Co l o n y ( t h i s ) ;
28 Ant4TSP a n t [ ] = new Ant4TSP [ nAnts ] ;
29 f o r ( i n t i = 0 ; i < nAnts ; i ++)
30 {
31 a n t [ i ] = new Ant4TSP ( ( i n t ) ( g r a p h . n o d e s ( ) ∗ r a n . n e x t D o u b l e ( ) ) , this );
32 }
33
34 r e t u r n ant ;
35 }
36
37 protected void globalUpdatingRule ( )
38 {
39 double dEvaporation = 0 ;
40 double dDeposition = 0;
41
42 f o r ( i n t r = 0 ; r < m graph . n o d e s ( ) ; r++)
43 {
44 f o r ( i n t s = 0 ; s < m graph . n o d e s ( ) ; s++)
45 {
46 i f ( r != s )
47 {
48 // g e t t h e v a l u e f o r d e l t a t a u
49 d o u b l e d e l t a Ta u = // Ant4TSP . s d B e s t P a t h V a l u e ∗
50 // ( d o u b l e ) Ant4TSP . s b e s t P a t h [ r ] [ s ] ;
51 ( ( d o u b l e ) 1 / Ant4TSP . s d B e s t P a t h V a l u e ) ∗
52 ( d o u b l e ) Ant4TSP . s b e s t P a t h [ r ] [ s ] ;
53
54 // g e t t h e v a l u e f o r phermone e v a p o r a t i o n a s d e f i n e d i n eq . d )
55 d E v a p o r a t i o n = ( ( d o u b l e ) 1 − A) ∗ m graph . t a u ( r , s ) ;
56 // g e t t h e v a l u e f o r phermone d e p o s i t i o n a s d e f i n e d i n eq . d )
57 d D e p o s i t i o n = A ∗ d e l t a Ta u ;
58
59 // u p d a t e t a u
60 m graph . updateTau ( r , s , d E v a p o r a t i o n + d D e p o s i t i o n ) ;
61 }
62 }
63 }
64 }
65 }
D.4 AntColony.java
1 /∗∗
2 ∗ Pure Java c o n s o l e a p p l i c a t i o n .
3 ∗ Th i s a p p l i c a t i o n d e m o n s t r a t e s c o n s o l e I /O.
4 ∗
5 ∗ Th i s f i l e was a u t o m a t i c a l l y g e n e r a t e d by
6 ∗ Omnicore CodeGuide .
7 ∗/
8
9 p a c k a g e com . u g o s . a c s ;
10
11 import java . u t i l . ∗ ;
12 import java . i o . ∗ ;
13
14
15 public abstract c l a s s AntColony i m p l e m e n t s O b se r v e r
68
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
Computer Science, RUCAPPENDIX D. CHIRICO’S ORIGINAL PROGRAM
16 {
17 p r o t e c t e d P r i n t S t r e a m m outs ;
18
19 p r o t e c t e d AntGraph m graph ;
20 p r o t e c t e d Ant [ ] m ants ;
21 protected int m nAnts ;
22 protected int m nAntCounter ;
23 protected int m nIterCounter ;
24 protected int m nIterations ;
25
26 private int m nID ;
27
28 private static i n t s n I D Co u n t e r = 0 ;
29
30 p u b l i c AntColony ( AntGraph graph , i n t nAnts , int nIterations )
31 {
32 m graph = g r a p h ;
33 m nAnts = nAnts ;
34 m nIterations = nIterations ;
35 s n I D Co u n t e r ++;
36 m nID = s n I D Co u n t e r ;
37 }
38
39 p u b l i c synchronized void s t a r t ( )
40 {
41 // c r e a t e s a l l a n t s
42 m ants = c r e a t e A n t s ( m graph , m nAnts ) ;
43
44 m nIterCounter = 0 ;
45 try
46 {
47 m outs = new P r i n t S t r e a m ( new F i l e O u t p u t S t r e a m ( ” c : \ \ temp \\” + m nID +
48 ” ” + m graph . n o d e s ( ) + ”x ” + m ants . l e n g t h + ” x ” +
49 m nIterations + ” colony . txt ” ) ) ;
50 }
51 c a t c h ( E x c e p t i o n ex )
52 {
53 ex . p r i n t S t a c k T r a c e ( ) ;
54 }
55
56 // l o o p f o r a l l i t e r a t i o n s
57 while ( m nIterCounter < m n I t e r a t i o n s )
58 {
59 // run an i t e r a t i o n
60 iteration ();
61 try
62 {
63 wait ( ) ;
64 }
65 c a t c h ( I n t e r r u p t e d E x c e p t i o n ex )
66 {
67 ex . p r i n t S t a c k T r a c e ( ) ;
68 }
69
70 // s y n c h r o n i z e t h e a c c e s s t o t h e g r a p h
71 s y n c h r o n i z e d ( m graph )
72 {
73 // a p p l y g l o b a l u p d a t i n g r u l e
74 globalUpdatingRule ( ) ;
75 }
76 }
77
78 i f ( m n I t e r C o u n t e r == m n I t e r a t i o n s )
79 {
80 m outs . c l o s e ( ) ;
81 }
82 }
83
84 p r i v at e void i t e r a t i o n ( )
85 {
86 m nAntCounter = 0 ;
87 m n I t e r C o u n t e r++;
88 m outs . p r i n t ( m n I t e r C o u n t e r ) ;
89 f o r ( i n t i = 0 ; i < m ants . l e n g t h ; i ++)
69
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
APPENDIX D. CHIRICO’S ORIGINAL PROGRAMComputer Science, RUC
90 {
91 m ants [ i ] . s t a r t ( ) ;
92 }
93 }
94
95 p u b l i c AntGraph getGraph ( )
96 {
97 r e t u r n m graph ;
98 }
99
100 p u b l i c i n t getAnts ( )
101 {
102 r e t u r n m ants . l e n g t h ;
103 }
104
105 public int getIterations ()
106 {
107 return m nIterations ;
108 }
109
110 public int getIterationCounter ()
111 {
112 return m nIterCounter ;
113 }
114
115 p u b l i c i n t getID ( )
116 {
117 r e t u r n m nID ;
118 }
119
120 p u b l i c s y n c h r o n i z e d v o i d u p d a t e ( O b s e r v a b l e ant , O b j e c t o b j )
121 {
122 // m outs . p r i n t ( ” ; ” + ( ( Ant ) a n t ) . m dPathValue ) ;
123 m nAntCounter++;
124
125 i f ( m nAntCounter == m ants . l e n g t h )
126 {
127 m outs . p r i n t l n ( ” ; ” + Ant . s d B e s t P a t h V a l u e + ” ; ” + m graph . a v e r a g e Ta u ( ) ) ;
128
129 // System . o u t . p r i n t l n(”−−−−−−−−−−−−−−−−−−−−−−−−−−−”);
130 // System . o u t . p r i n t l n ( m i t e r C o u n t e r + ” − Be st Path : ” +
131 // Ant . s d B e s t P a t h V a l u e ) ;
132 // System . o u t . p r i n t l n(”−−−−−−−−−−−−−−−−−−−−−−−−−−−”);
133
134
135
136 notify ( ) ;
137
138 }
139 }
140
141 p u b l i c double getBestPathValue ( )
142 {
143 r e t u r n Ant . s d B e s t P a t h V a l u e ;
144 }
145
146 p u b l i c i n t [ ] getBestPath ( )
147 {
148 r e t u r n Ant . g e t B e s t P a t h ( ) ;
149 }
150
151 p u b l i c Vector getBestPathVector ( )
152 {
153 r e t u r n Ant . s b e s t P a t h V e c t ;
154 }
155
156 public int getLastBestPathIteration ()
157 {
158 r e t u r n Ant . s n L a s t B e s t P a t h I t e r a t i o n ;
159 }
160
161 p u b l i c b o o l e a n done ( )
162 {
163 r e t u r n m n I t e r C o u n t e r == m n I t e r a t i o n s ;
70
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
Computer Science, RUCAPPENDIX D. CHIRICO’S ORIGINAL PROGRAM
164 }
165
166 protected a b s t r a c t Ant [ ] c r e a t e A n t s ( AntGraph graph , i n t ants ) ;
167
168 protected ab st r ac t void globalUpdatingRule ( ) ;
169 }
D.5 AntGraph.java
1 /∗∗
2 ∗ AntGraph . j a v a
3 ∗
4 ∗ @author Cr e a t e d by Omnicore CodeGuide
5 ∗/
6 p a c k a g e com . u g o s . a c s ;
7
8 import java . i o . ∗ ;
9
10 p u b l i c c l a s s AntGraph i m p l e m e n t s S e r i a l i z a b l e
11 {
12 p r i v at e double [ ] [ ] m delta ;
13 p r i v a t e d o u b l e [ ] [ ] m tau ;
14 private int m nNodes ;
15 p r i v at e double m dTau0 ;
16
17 p u b l i c AntGraph ( i n t nNodes , d o u b l e [ ] [ ] d e l t a , d o u b l e [ ] [ ] t a u )
18 {
19 i f ( d e l t a . l e n g t h != nNodes )
20 throw new I l l e g a l A r g u m e n t E x c e p t i o n ( ” The number o f n o d e s doesn ’ t match
21 wi t h t h e d i m e n s i o n o f d e l t a m a t r i x ” ) ;
22
23 m nNodes = nNodes ;
24 m delta = de lta ;
25 m tau = tau ;
26 }
27
28 p u b l i c AntGraph ( i n t nodes , d o u b l e [ ] [ ] d e l t a )
29 {
30 t h i s ( nodes , d e l t a , new d o u b l e [ n o d e s ] [ n o d e s ] ) ;
31
32 resetTau ( ) ;
33 }
34
35 p u b l i c synchronized double d e l t a ( i n t r , int s )
36 {
37 return m delta [ r ] [ s ] ;
38 }
39
40 p u b l i c s y n c h r o n i z e d double tau ( i n t r , int s )
41 {
42 r e t u r n m tau [ r ] [ s ] ;
43 }
44
45 p u b l i c synchronized double etha ( i n t r , int s )
46 {
47 return ( ( double ) 1) / d e l t a ( r , s ) ;
48 }
49
50 p u b l i c s y n c h r o n i z e d i n t nodes ( )
51 {
52 r e t u r n m nNodes ;
53 }
54
55 p u b l i c s y n c h r o n i z e d double tau0 ( )
56 {
57 r e t u r n m dTau0 ;
58 }
59
60 p u b l i c s y n c h r o n i z e d v o i d updateTau ( i n t r , i n t s , double value )
61 {
62 m tau [ r ] [ s ] = v a l u e ;
71
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
APPENDIX D. CHIRICO’S ORIGINAL PROGRAMComputer Science, RUC
63 }
64
65 p u b l i c void resetTau ( )
66 {
67 d o u b l e dAverage = a v e r a g e D e l t a ( ) ;
68
69 m dTau0 = ( d o u b l e ) 1 / ( ( d o u b l e ) m nNodes ∗ ( 0 . 5 ∗ dAverage ) ) ;
70
71 System . o u t . p r i n t l n ( ” Average : ” + dAverage ) ;
72 System . o u t . p r i n t l n ( ” Tau0 : ” + m dTau0 ) ;
73
74 f o r ( i n t r = 0 ; r < n o d e s ( ) ; r++)
75 {
76 f o r ( i n t s = 0 ; s < n o d e s ( ) ; s++)
77 {
78 m tau [ r ] [ s ] = m dTau0 ;
79 }
80 }
81 }
82
83 p u b l i c double averageDelta ( )
84 {
85 return average ( m delta ) ;
86 }
87
88 p u b l i c d o u b l e a v e r a g e Ta u ( )
89 {
90 r e t u r n a v e r a g e ( m tau ) ;
91 }
92
93 public String toString ()
94 {
95 String str = ””;
96 String str1 = ””;
97
98
99 f o r ( i n t r = 0 ; r < n o d e s ( ) ; r++)
100 {
101 f o r ( i n t s = 0 ; s < n o d e s ( ) ; s++)
102 {
103 s t r += d e l t a ( r , s ) + ”\ t ” ;
104 s t r 1 += t a u ( r , s ) + ”\ t ” ;
105 }
106
107 s t r+= ”\ n ” ;
108 }
109
110 return s t r + ”\ n\n\n” + s t r 1 ;
111 }
112
113 p r i v a t e double average ( double matrix [ ] [ ] )
114 {
115 d o u b l e dSum = 0 ;
116 f o r ( i n t r = 0 ; r < m nNodes ; r++)
117 {
118 f o r ( i n t s = 0 ; s < m nNodes ; s++)
119 {
120 dSum += m a t r i x [ r ] [ s ] ;
121 }
122 }
123
124 d o u b l e dAverage = dSum / ( d o u b l e ) ( m nNodes ∗ m nNodes ) ;
125
126 r e t u r n dAverage ;
127 }
128 }
D.6 TSPTest.java
1 /∗∗
2 ∗ AntApplication . java
72
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
Computer Science, RUCAPPENDIX D. CHIRICO’S ORIGINAL PROGRAM
3 ∗
4 ∗ @author Cr e a t e d by Omnicore CodeGuide
5 ∗/
6
7 import java . u t i l . ∗ ;
8 import java . i o . ∗ ;
9 import com . u g o s . a c s . t s p . ∗ ;
10 import com . u g o s . a c s . ∗ ;
11
12 p u b l i c c l a s s TSPTest
13 {
14 p r i v a t e s t a t i c Random s r a n = new Random ( System . c u r r e n t T i m e M i l l i s ( ) ) ;
15
16 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s )
17 {
18 // P r i n t a p p l i c a t i o n prompt t o c o n s o l e .
19 System . o u t . p r i n t l n ( ” AntColonySystem f o r TSP ” ) ;
20
21 i f ( args . length < 8)
22 {
23 System . o u t . p r i n t l n ( ” Wrong number o f p a r a m e t e r s ” ) ;
24 return ;
25 }
26
27 i n t nAnts = 0 ;
28 i n t nNodes = 0 ;
29 int nIterations = 0;
30 int nRepetitions = 0;
31
32 f o r ( i n t i = 0 ; i < a r g s . l e n g t h ; i +=2)
33 {
34 i f ( a r g s [ i ] . e q u a l s (”−a ” ) )
35 {
36 nAnts = I n t e g e r . p a r s e I n t ( a r g s [ i + 1 ] ) ;
37 System . o u t . p r i n t l n ( ” Ants : ” + nAnts ) ;
38 }
39 e l s e i f ( a r g s [ i ] . e q u a l s (”−n ” ) )
40 {
41 nNodes = I n t e g e r . p a r s e I n t ( a r g s [ i + 1 ] ) ;
42 System . o u t . p r i n t l n ( ” Nodes : ” + nNodes ) ;
43 }
44 e l s e i f ( a r g s [ i ] . e q u a l s (”− i ” ) )
45 {
46 nIte rations = Integer . parseInt ( args [ i + 1 ] ) ;
47 System . o u t . p r i n t l n ( ” I t e r a t i o n s : ” + n I t e r a t i o n s ) ;
48 }
49 e l s e i f ( a r g s [ i ] . e q u a l s (”− r ” ) )
50 {
51 nRepetitions = Integer . parseInt ( args [ i + 1 ] ) ;
52 System . o u t . p r i n t l n ( ” R e p e t i t i o n s : ” + n R e p e t i t i o n s ) ;
53 }
54 }
55
56 i f ( nAnts == 0 | | nNodes == 0 | | n I t e r a t i o n s == 0 | | n R e p e t i t i o n s == 0 )
57 {
58 System . o u t . p r i n t l n ( ” One o f t h e p a r a m e t e r s i s wrong ” ) ;
59 return ;
60 }
61
62
63 d o u b l e d [ ] [ ] = new d o u b l e [ nNodes ] [ nNodes ] ;
64 // d o u b l e t [ ] [ ] = new d o u b l e [ nNodes ] [ nNodes ] ;
65
66 f o r ( i n t i = 0 ; i < nNodes ; i ++)
67 f o r ( i n t j = i + 1 ; j < nNodes ; j ++)
68 {
69 d [ i ] [ j ] = s r a n . nextDouble ( ) ;
70 d[ j ][ i ] = d[ i ][ j ];
71 // t [ i ] [ j ] = 1 ; / / ( d o u b l e ) 1 / ( d o u b l e ) ( nNodes ∗ 1 0 ) ;
72 // t[ j ][ i ] = t[ i ][ j ];
73 }
74
75 AntGraph g r a p h = new AntGraph ( nNodes , d ) ;
76
73
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
APPENDIX D. CHIRICO’S ORIGINAL PROGRAMComputer Science, RUC
77 try
78 {
79 ObjectOutputStream o u t s = new ObjectOutputStream (
80 new F i l e O u t p u t S t r e a m ( ” c : \ \ temp \\” +
81 nNodes + ” a n t g r a p h . b i n ” ) ) ;
82 outs . wr i t e O b j e c t ( graph ) ;
83 outs . c l o s e ( ) ;
84
85 // O b j e c t I n p u t S t r e a m i n s = new O b j e c t I n p u t S t r e a m (
86 // new F i l e I n p u t S t r e a m ( ” c : \ \ temp \\” +
87 // nNodes + ” a n t g r a p h . b i n ” ) ) ;
88 // g r a p h = ( AntGraph ) i n s . r e a d O b j e c t ( ) ;
89 // ins . close ( ) ;
90
91 F i l e O u t p u t S t r e a m o u t s 1 = new F i l e O u t p u t S t r e a m ( ” c : \ \ temp \\” +
92 nNodes + ” a n t g r a p h . t x t ” ) ;
93
94 f o r ( i n t i = 0 ; i < nNodes ; i ++)
95 {
96 f o r ( i n t j = 0 ; j < nNodes ; j ++)
97 {
98 outs1 . wr i t e ( ( graph . d e l t a ( i , j ) + ” , ” ) . getBytes ( ) ) ;
99 }
100 outs1 . write ( ’\ n ’ ) ;
101 }
102
103 outs1 . c l o s e ( ) ;
104
105 P r i n t S t r e a m o u t s 2 = new P r i n t S t r e a m ( new F i l e O u t p u t S t r e a m ( ” c : \ \ temp \\” +
106 nNodes + ” x ” + nAnts + ” x ” + n I t e r a t i o n s + ” r e s u l t s . t x t ” ) ) ;
107
108 f o r ( i n t i = 0 ; i < n R e p e t i t i o n s ; i ++)
109 {
110 graph . resetTau ( ) ;
111 AntColony4TSP a n t Co l o n y = new AntColony4TSP ( graph , nAnts , n I t e r a t i o n s ) ;
112 a n t Co l o n y . s t a r t ( ) ;
113 o u t s 2 . p r i n t l n ( i + ” , ” + a n t Co l o n y . g e t B e s t P a t h V a l u e ( ) + ” , ” +
114 a n t Co l o n y . g e t L a s t B e s t P a t h I t e r a t i o n ( ) ) ;
115 }
116 outs2 . c l o s e ( ) ;
117 }
118 c a t c h ( E x c e p t i o n ex )
119 {}
120 }
121 }
74
E Code
E.1 AntColonyForTSP.java
1 package t s p ;
2
3 i m p o r t framework . a c o s . ∗ ;
4 import java . u t i l . ∗ ;
5 i m p o r t Node . Node ;
6
7 /∗∗
8 ∗ The a n t c o l o n y f o r a TSP s o l u t i o n .
9 ∗ Extends t h e a n t c o l o n y from t h e ACS framework , and d e f i n e s t h e
10 ∗ g l o b a l u p d a t i n g r u l e and t h e way t h e a n t s a r e c r e a t e d .
11 ∗ @author Jakob K i e r k e g a a r d & Jean−Luc Ngassa
12 ∗/
13 p u b l i c c l a s s AntColonyForTSP e x t e n d s AntColonyFramework {
14 /∗∗
15 ∗ The r h o v a l u e , r e c e i v e d from t h e i n p u t i n t h e GUI by t h e u s e r .
16 ∗/
17 p r o t e c t e d s t a t i c f i n a l d o u b l e RHO = Main . GUI . getRho ( ) ;
18 /∗∗
19 ∗ The W v a l u e , r e c e i v e d from t h e i n p u t i n t h e GUI by t h e u s e r .
20 ∗/
21 p r o t e c t e d s t a t i c f i n a l i n t W = Main . GUI . getW ( ) ;
22 /∗∗
23 ∗ An a r r a y c o n t a i n i n g t h e b e s t path y e t .
24 ∗/
25 i n t [ ] b e s t P a t h = new i n t [ m graph . n o d e s ( ) ] ;
26
27 /∗∗
28 ∗ The c o n s t r u c t o r c a l l s i t s s u p e r c l a s s ’ c o n s t r u c t o r u s i n g t h e
29 ∗ given parameters .
30 ∗ @param g r a p h The g r a p h t h e a n t s a r e t o u s e .
31 ∗ @param a n t s The number o f a n t s .
32 ∗ @param i t e r a t i o n s The number o f i t e r a t i o n s
33 ∗/
34 p u b l i c AntColonyForTSP ( AntGraphFramework graph , i n t a n t s , i n t i t e r a t i o n s ) {
35 s u p e r ( graph , a n t s , i t e r a t i o n s ) ;
36 }
37
38 /∗∗
39 ∗ Th i s method c r e a t e s a l l t h e a n t s f o r t h e program .
40 ∗ I t r e s e t s t h e b e s t v a l u e s , d e f i n e s t h e a n t c o l o n y , and d e s t r i b u t e s
41 ∗ t h e a n t s e v e n l y o u t on t h e n o d e s ( no randomness ; t h e s t a r t i n g node
42 ∗ i s antID%numberOfNodes ) . The a n t s a r e r e t u r n e d i n an a r r a y .
43 ∗ @param g r a p h The g r a p h t h e a n t s a r e u s i n g .
44 ∗ @param nAnts The number o f a n t s .
45 ∗ @ r e t u r n Re t u r n s an a r r a y o f o b j e c t s o f t h e t y p e AntForTSP ; t h e
46 ∗ a n t s t h a t a r e t o f i n d t h e t o u r s on t h e g r a p h .
47 ∗/
48 p r o t e c t e d AntFramework [ ] c r e a t e A n t s ( AntGraphFramework graph , i n t nAnts ) {
49 AntForTSP . r e s e t ( ) ;
50 AntForTSP . se t A n t Co l o n y ( t h i s ) ;
51 AntForTSP a n t [ ] = new AntForTSP [ nAnts ] ;
52 f o r ( i n t i = 0 ; i < nAnts ; i ++)
53 a n t [ i ] = new AntForTSP ( ( i % g r a p h . n o d e s ( ) ) , t h i s ) ;
54 r e t u r n ant ;
55 }
56
57 /∗∗
58 ∗ The g l o b a l u p d a t i n g r u l e .
59 ∗ The a l g o r i t h m s f o r c a l c u l a t i n g t h e e v a p o r a t i o n and d e p o s i t i o n o f
60 ∗ t h e pheromone on t h e e d g e s t h a t a r e p a r t o f t h e b e s t t o u r s o f a r ,
61 ∗ r e i n f o r c i n g i t s edges .
75
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
APPENDIX E. CODE Computer Science, RUC
62 ∗/
63 protected void globalUpdatingRule ( ) {
64 double dEvaporation ;
65 double dDeposition ;
66 b e s t P a t h = AntForTSP . g e t B e s t P a t h ( ) ;
67
68 f o r ( i n t r = 0 ; r < m graph . n o d e s ( ) ; r++) {
69 f o r ( i n t s = r + 1 ; s < m graph . n o d e s ( ) ; s++) {
70 d o u b l e d e l t a Ta u = (W / AntForTSP . s d Be st P a t h L e n g t h ) ;
71
72 d E v a p o r a t i o n = ( ( d o u b l e ) 1 − RHO) ∗ m graph . t a u ( b e s t P a t h [ r ] , b e s t P a t h [ s ] ) ;
73
74 d D e p o s i t i o n = RHO ∗ d e l t a Ta u ;
75
76 // u p d a t e t a u
77 m graph . updateTau ( b e s t P a t h [ r ] , b e s t P a t h [ s ] , d E v a p o r a t i o n + d D e p o s i t i o n ) ;
78 m graph . updateTau ( b e s t P a t h [ s ] , b e s t P a t h [ r ] , d E v a p o r a t i o n + d D e p o s i t i o n ) ;
79 }
80 }
81 }
82
83 /∗∗
84 ∗ R e t r i e v e s t h e b e s t t o u r r e p r e s e n t e d by a L i n k e d L i s t o f node o b j e c t s .
85 ∗ @ r e t u r n A l i n k e d l i s t o f node o b j e c t s .
86 ∗/
87 p u b l i c L i n k e d L i s t <Node> g e t Be st To u r N o d e s ( ) {
88 r e t u r n nodesTour ( AntFramework . s b e s t T o u r ) ;
89 }
90
91 /∗∗
92 ∗ Re t u r n s t h e b e s t t o u r r e p r e s e n t e d by an A r r a y L i s t o f integers
93 ∗ a s t h e nodes ’ IDs .
94 ∗ @ r e t u r n An A r r a y L i s t o f i n t e g e r s .
95 ∗/
96 p u b l i c A r r a y L i s t <I n t e g e r > g e t Be st To u r ( ) {
97 r e t u r n t o u r ( AntFramework . s b e s t T o u r ) ;
98 }
99
100 /∗∗
101 ∗ Co n v e r t s an A r r a y L i s t o f i n t e g e r s ( node IDs ) t o a L i n k e d L i s t o f
102 ∗ node o b j e c t s . I t d o e s t h i s by g o i n g t h r o u g h t h e A r r a y L i s t , and i f
103 ∗ i t f i n d s a node wi t h a s i m i l a r ID , i t c r e a t e s a new node and
104 ∗ i n s e r t s i t i n to the LinkedList being returned .
105 ∗ @param t o u r An A r r a y L i s t o f i n t e g e r s .
106 ∗ @ r e t u r n A L i n k e d L i s t o f node o b j e c t s .
107 ∗/
108 p u b l i c L i n k e d L i s t <Node> nodesTour ( A r r a y L i s t <I n t e g e r > t o u r ) {
109 L i n k e d L i s t <Node> myTour = new L i n k e d L i s t <Node > ( ) ;
110
111 f o r ( I n t e ge r i : tour ) {
112 f o r ( Node n : m graph . g e t N o d e L i s t ( ) ) {
113 i f ( n . nodeID + 1 == i )
114 myTour . add ( new Node ( n . nodeID + 1 , n . x , n . y ) ) ;
115 }
116 }
117 r e t u r n myTour ;
118 }
119
120 /∗∗
121 ∗ I n t h e program t h e node IDs a r e g o i n g from 0 , but u s e r s need t o
122 ∗ s e e them g o i n g from 1 . Th i s method adds one t o a l l t h e node IDs .
123 ∗ @param t o u r The A r r a y L i s t wi t h t h e I n t e g e r s t h a t a r e t o be i n c r e a s e d .
124 ∗ @ r e t u r n An A r r a y L i s t wi t h t h e node IDs g o i n g from 1 .
125 ∗/
126 p r i v a t e s t a t i c A r r a y L i s t <I n t e g e r > t o u r ( A r r a y L i s t <I n t e g e r > t o u r ) {
127 f o r ( i n t i = 0 ; i < t o u r . s i z e ( ) ; i ++) {
128 tour . se t ( i , tour . get ( i ) + 1 ) ;
129 }
130 return tour ;
131 }
132 }
76
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
Computer Science, RUC APPENDIX E. CODE
E.2 AntColonyFramework.java
1 p a c k a g e framework . a c o s ;
2
3 import java . u t i l . ∗ ;
4 import java . i o . ∗ ;
5
6 /∗∗
7 ∗ The AntColony k e e p s t r a c k o f t h e a n t s on t h e graph , s t a r t i n g t h e
8 ∗ a n t s f o r e a c h i t e r a t i o n , and a p p l i e s t h e g l o b a l u p d a t i n g r u l e .
9 ∗ As t h e a n t s a r e t h r e a d s , t h e a n t c o l o n y i m p l e m e n t s t h e O b se r v e r i n t e r f a c e .
10 ∗
11 ∗ @author Jakob K i e r k e g a a r d & Jean−Luc Ngassa
12 ∗/
13 p u b l i c a b s t r a c t c l a s s AntColonyFramework i m p l e m e n t s O b se r v e r {
14
15 /∗∗
16 ∗ The p r i n t s t r e a m i f t h e u s e r wants t h e i n t e r m e d i a t e r e s u l t s w r i t t e n
17 ∗ to f i l e s .
18 ∗/
19 p r i v a t e P r i n t S t r e a m m outs ;
20 /∗∗
21 ∗ The g r a p h i n u s e .
22 ∗/
23 p r o t e c t e d f i n a l AntGraphFramework m graph ;
24 /∗∗
25 ∗ An a r r a y o f a l l t h e a n t s .
26 ∗/
27 p r o t e c t e d AntFramework [ ] m ants ;
28 /∗∗
29 ∗ The number o f a n t s .
30 ∗/
31 p r o t e c t e d f i n a l i n t m nAnts ;
32 /∗∗
33 ∗ The a n t c o u n t e r .
34 ∗/
35 p r o t e c t e d i n t m nAntCounter ;
36 /∗∗
37 ∗ The i t e r a t i o n c o u n t e r .
38 ∗/
39 protected i n t m nIterCounter ;
40 /∗∗
41 ∗ The number o f i t e r a t i o n s .
42 ∗/
43 protected f i n a l int m nIterations ;
44 /∗∗
45 ∗ The ID o f t h e c o l o n y .
46 ∗/
47 p r i v a t e f i n a l i n t m nID ;
48 /∗∗
49 ∗ The c o l o n y c o u n t e r − o n l y r e l e v a n t i f more than one c o l o n y i s
50 ∗ used , which we do n o t .
51 ∗/
52 p r i v a t e s t a t i c i n t s n I D Co u n t e r = 0 ;
53
54 /∗∗
55 ∗ I n i t i a l i z e s the l o c a l v a l u e s r e q u i r e d f o r running the ant colony .
56 ∗
57 ∗ @param g r a p h The g r a p h u se d .
58 ∗ @param nAnts The number o f a n t s u se d .
59 ∗ @param n I t e r a t i o n s The number o f i t e r a t i o n s u se d .
60 ∗/
61 p u b l i c AntColonyFramework ( AntGraphFramework graph , i n t nAnts , i n t n I t e r a t i o n s ) {
62 m graph = g r a p h ;
63 m nAnts = nAnts ;
64 m nIterations = nIterations ;
65 s n I D Co u n t e r ++;
66 m nID = s n I D Co u n t e r ;
67 }
68
69 /∗∗
70 ∗ C r e a t e s t h e a n t s , and a f t e r e a c h i t e r a t i o n t h e g l o b a l u p d a t i n g r u l e
71 ∗ i s a p p l i e d t o t h e e d g e s on t h e g r a p h .
77
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
APPENDIX E. CODE Computer Science, RUC
72 ∗/
73 p u b l i c synchronized void s t a r t ( ) {
74 // c r e a t e s a l l a n t s
75 m ants = c r e a t e A n t s ( m graph , m nAnts ) ;
76
77 m nIterCounter = 0 ;
78
79 if ( Main . GUI . makeOutput ( ) ) {
80 try {
81 m outs = new P r i n t S t r e a m ( new F i l e O u t p u t S t r e a m ( Main . GUI . getOutputPath ( ) +
82 m nID + ” ” + m graph . n o d e s ( ) + ” x ” + m ants . l e n g t h + ” x” +
83 m nIterations + ” colony . txt ” ) ) ;
84 }
85 catch ( Exception e ) {
86 e . printStackTrace ( ) ;
87 }
88 }
89
90 // l o o p f o r a l l i t e r a t i o n s
91 while ( m nIterCounter < m n I t e r a t i o n s ) {
92 i f ( m n I t e r C o u n t e r % 5 == 0 )
93 System . o u t . p r i n t l n ( ” I t e r a t i o n : ” + ( m n I t e r C o u n t e r + 1 ) ) ;
94
95 // run an i t e r a t i o n
96 iteration ();
97
98 try {
99 wait ( ) ;
100
101 }
102 c a t c h ( I n t e r r u p t e d E x c e p t i o n ex ) {
103 ex . p r i n t S t a c k T r a c e ( ) ;
104
105 }
106
107 // s y n c h r o n i z e t h e a c c e s s t o t h e g r a p h
108 s y n c h r o n i z e d ( m graph ) {
109 // a p p l y g l o b a l u p d a t i n g r u l e
110 globalUpdatingRule ( ) ;
111 }
112 }
113 if ( Main . GUI . makeOutput ( ) ) {
114 i f ( m n I t e r C o u n t e r == m n I t e r a t i o n s ) {
115 m outs . c l o s e ( ) ;
116 }
117 }
118 }
119
120 /∗∗
121 ∗ Ca l l e d f o r each i t e r a t i o n ; r e s e t s the ant counter , i n c r e a s e s the
122 ∗ i t e r a t i o n c o u n t e r , and c r e a t e s new a n t s ( t h r e a d s ) f o r t h e new i t e r a t i o n .
123 ∗/
124 p r i v at e void i t e r a t i o n ( ) {
125 m nAntCounter = 0 ;
126 m n I t e r C o u n t e r++;
127 f o r ( AntFramework a n t : m ants )
128 ant . createThread ( ) ;
129 }
130
131 /∗∗
132 ∗ R e t u r n s t h e g r a p h u se d by t h e a n t s
133 ∗ @ r e t u r n The g r a p h
134 ∗/
135 p u b l i c AntGraphFramework getGraph ( ) {
136 r e t u r n m graph ;
137 }
138
139 /∗∗
140 ∗ R e t u r n s t h e number o f a n t s u se d .
141 ∗ @ r e t u r n The l e n g t h o f t h e a r r a y wi t h a n t framework o b j e c t s , i . e . the
142 ∗ number o f a n t s .
143 ∗/
144 p u b l i c i n t getAnts ( ) {
145 r e t u r n m ants . l e n g t h ;
78
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
Computer Science, RUC APPENDIX E. CODE
146 }
147
148 /∗∗
149 ∗ The method g e t s t h e number o f i t e r a t i o n s t h e program s h o u l d run .
150 ∗ @ r e t u r n The number o f i t e r a t i o n s .
151 ∗/
152 public int getIterations () {
153 return m nIterations ;
154 }
155
156 /∗∗
157 ∗ The method g e t s t h e c u r r e n t i t e r a t i o n number .
158 ∗ @ r e t u r n The c u r r e n t i t e r a t i o n ID .
159 ∗/
160 public int getIterationCounter () {
161 return m nIterCounter ;
162 }
163
164 /∗∗
165 ∗ Re t u r n s t h e ID o f t h e Colony ( most u s e f u l i f more than one i s u se d )
166 ∗ @return The AntColony ID .
167 ∗/
168 public int getID ( ) {
169 return m nID ;
170 }
171
172 /∗∗
173 ∗ Gets t h e c u r r e n t ant ’ s ID .
174 ∗ @ r e t u r n The c u r r e n t v a l u e o f t h e a n t c o u t e r , i . e . t h e c u r r e n t ant ’ s ID .
175 ∗/
176 p u b l i c i n t getAntID ( ) {
177 r e t u r n m nAntCounter ;
178 }
179
180 /∗∗
181 ∗ The u p d a t e method r e q u i r e d when i m p l e m e n t i n g t h e O b se r v e r i n t e f a c e .
182 ∗ I t w a i t s u n t i l a l l a n t s have r e p o r t e d back , a f t e r which i t n o t i f i e s
183 ∗ them , s t a r t i n g them on a new i t e r a t i o n t h e i t e r a t i o n c o u n t e r hasn ’ t
184 ∗ r e a c h e d t h e t o t a l number o f i t e r a t i o n s .
185 ∗ @param a n t The a n t r e p o r t i n g back
186 ∗ @param o b j N/A
187 ∗/
188 p u b l i c s y n c h r o n i z e d v o i d u p d a t e ( O b s e r v a b l e ant , O b j e c t o b j ) {
189 m nAntCounter++;
190
191 if ( m nAntCounter == m ants . l e n g t h ) {
192 i f ( Main . GUI . makeOutput ( ) )
193 m outs . p r i n t l n ( ” ; ” + AntFramework . s d Be st P a t h L e n g t h ) ;
194 notify ( ) ;
195 }
196 }
197
198 /∗∗
199 ∗ Gets t h e b e s t path d i s t a n c e f o r a l l t h e i t e r a t i o n s .
200 ∗ @ r e t u r n The b e s t t o u r d i s t a n c e .
201 ∗/
202 p u b l i c d o u b l e g e t Be st P a t h L e n g t h ( ) {
203 r e t u r n AntFramework . s d Be st P a t h L e n g t h ;
204 }
205
206 /∗∗
207 ∗ Gets t h e i t e r a t i o n ID we h e r e t h e b e s t t o u r d i s t a n c e was a c h i e v e d .
208 ∗ @ r e t u r n The ID o f t h e b e s t i t e r a t i o n .
209 ∗/
210 public int getLastBestPathIteration () {
211 r e t u r n AntFramework . s n L a s t B e s t P a t h I t e r a t i o n ;
212 }
213
214 /∗∗
215 ∗ Checks i f a n t s have run t h r o u g h a l l t h e i t e r a t i o n s .
216 ∗ @ r e t u r n True i f t h e y a r e done , f a l s e i f t h e y need t o c o n t i n u e .
217 ∗/
218 p u b l i c f i n a l b o o l e a n done ( ) {
219 r e t u r n m n I t e r C o u n t e r == m n I t e r a t i o n s ;
79
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
APPENDIX E. CODE Computer Science, RUC
220 }
221
222 /∗∗
223 ∗ A b s t r a c t method f o r i m p l e m e n t i n g t h e f u n c t i o n a l i t y f o r c r e a t i n g t h e a n t s .
224 ∗ @param g r a p h The g r a p h on which t h e a n t s a r e r u n n i n g .
225 ∗ @param a n t s The number o f a n t s .
226 ∗ @ r e t u r n An a r r a y f i l l e d wi t h o b j e c t s o f t h e t y p e AntFramework .
227 ∗/
228 p r o t e c t e d a b s t r a c t AntFramework [ ] c r e a t e A n t s ( AntGraphFramework graph , i n t a n t s ) ;
229
230 /∗∗
231 ∗ A b s t r a c t method g l o b a l u p d a t i n g r u l e .
232 ∗/
233 protected ab st r ac t void globalUpdatingRule ( ) ;
234 }
E.3 AntForTSP.java
1 package t s p ;
2
3 import framework . a c o s . ∗ ;
4 import java . u t i l . ∗ ;
5 import Node . ∗ ;
6 import Node . N e i g h b o r ;
7
8 /∗∗
9 ∗ Th i s c l a s s i s t h e a n t f o r t h e TSP s o l u t i o n .
10 ∗ The p a r a m e t e r s a l f a , b e t a , Q0 and k s i a r e d e f i n e d by t h e u s e r i n
11 ∗ t h e GUI . The HashMap i s a map f o r e a c h o f t h e a n t s t o s e e what n o d e s
12 ∗ t h a t n e e d s t o be v i s i t e d on t h e t o u r .
13 ∗ @author Jakob K i e r k e g a a r d & Jean−Luc Ngassa
14 ∗/
15 p u b l i c c l a s s AntForTSP e x t e n d s AntFramework {
16
17 /∗∗
18 ∗ The a l f a v a l u e , r e c e i v e d from t h e i n p u t i n t h e GUI by t h e u s e r .
19 ∗/
20 p r i v a t e s t a t i c f i n a l d o u b l e A = Main . GUI . g e t A l f a ( ) ;
21 /∗∗
22 ∗ The b e t a v a l u e , r e c e i v e d from t h e i n p u t i n t h e GUI by t h e u s e r .
23 ∗/
24 p r i v a t e s t a t i c f i n a l d o u b l e B = Main . GUI . g e t B e t a ( ) ;
25 /∗∗
26 ∗ The Q0 v a l u e , r e c e i v e d from t h e i n p u t i n t h e GUI by t h e u s e r .
27 ∗/
28 p r i v a t e s t a t i c f i n a l d o u b l e Q0 = Main . GUI . getQ0 ( ) ;
29 /∗∗
30 ∗ The k s i v a l u e , r e c e i v e d from t h e i n p u t i n t h e GUI by t h e u s e r .
31 ∗/
32 p r i v a t e s t a t i c f i n a l d o u b l e KSI = Main . GUI . g e t K s i ( ) ;
33 /∗∗
34 ∗ A random number t o d e t e r m i n e wh e t h e r t h e a n t s h o u l d e x p l o i t o r
35 ∗ explore .
36 ∗/
37 p r i v a t e s t a t i c f i n a l Random s r a n d Ge n = new Random ( 7 ) ;
38 /∗∗
39 ∗ A HashMap o f t h e n o d e s t h a t t h e a n t h a s n o t v i s i t e d y e t .
40 ∗/
41 p r o t e c t e d HashMap<I n t e g e r , I n t e g e r > m n o d e sTo V i si t Tb l e ;
42
43 p u b l i c i n t nNode ;
44 p u b l i c double p r ob ab i l i t y , balance ;
45
46 /∗∗
47 ∗ C r e a t e s an AntForTSP o b j e c t by c a l l i n g t h e s u p e r c o n s t r u c t o r .
48 ∗ @param s t a r t N o d e The ID o f t h e node where t h e a n t s t a r t s .
49 ∗ @param o b s e r v e r The o b s e r v e r , which i s t h e c o l o n y .
50 ∗/
51 p u b l i c AntForTSP( i n t s t a r t N o d e , O b se r v e r o b s e r v e r ) {
52 super ( startNode , observer ) ;
53 }
80
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
Computer Science, RUC APPENDIX E. CODE
54
55 /∗∗
56 ∗ I n i t i a t e s t h e a n t by c a l l i n g t h e s u p e r method , f o l l o w e d by
57 ∗ i n i t i a l i z i n g t h e HashMap , f i l l i n g i t wi t h a l l t h e nodes , and
58 ∗ r e m o v i n g t h e node where t h e a n t s t a r t s .
59 ∗/
60 p u b l i c void i n i t ( ) {
61 super . i n i t ( ) ;
62
63 f i n a l AntGraphFramework g r a p h = s a n t C o l o n y . getGraph ( ) ;
64
65 m n o d e sTo V i si t Tb l e = new HashMap<I n t e g e r , I n t e g e r >( g r a p h . n o d e s ( ) ) ;
66 f o r ( i n t i = 0 ; i < g r a p h . n o d e s ( ) ; i ++)
67 m n o d e sTo V i si t Tb l e . put ( i , i ) ;
68
69 m n o d e sTo V i si t Tb l e . remove ( new I n t e g e r ( m nStartNode ) ) ;
70 }
71
72 /∗∗
73 ∗ I f i t i s the f i r s t i t e r a t i o n , the f i r s t ant performs a neighborhood
74 ∗ s e a r c h t o d e p o s i t a b a s i c amount o f pheromone between t h e n o d e s .
75 ∗ O t h e r w i s e Q0 i s d e p e n d e n t on a random d o u b l e which d e r t e r m i n e s i f t h e
76 ∗ ant should expore or e x p l o i t .
77 ∗ I n t h e end t h e n e x t node i s removed from t h e l i s t o f n o d e s t h a t need
78 ∗ visiting .
79 ∗ @param nCurNode The node where t h e a n t c u r r e n t l y i s l o c a t e d .
80 ∗ @ r e t u r n Re t u r n s t h e ID o f t h e n e x t node .
81 ∗/
82 p u b l i c s y n c h r o n i z e d i n t s t a t e T r a n s i t i o n R u l e ( i n t nCurNode) {
83 i f ( ( s a n t C o l o n y . g e t I t e r a t i o n C o u n t e r ( ) == 1 ) && ( s a n t C o l o n y . getAntID ( ) == 0 ) ) {
84
85 f i n a l AntGraphFramework g r a p h = s a n t C o l o n y . getGraph ( ) ;
86 A r r a y L i s t <Node> myNodeList = g r a p h . g e t N o d e L i s t ( ) ;
87 L i n k e d L i s t <Node> myNodes = new L i n k e d L i s t <Node>(myNodeList ) ;
88 myNodeList . g e t ( nCurNode ) . s e t N e i g h b o r s ( myNodes ) ;
89 f o r ( N e i g h b o r nabo : myNodeList . g e t ( nCurNode ) . n e i g h b o r s ) {
90 i f ( m n o d e sTo V i si t Tb l e . c o n t a i n s K e y ( nabo . toNode . nodeID ) ) {
91 nNode = nabo . toNode . nodeID ;
92 break ;
93 }
94 }
95
96 m n o d e sTo V i si t Tb l e . remove ( new I n t e g e r ( nCurNode ) ) ;
97 r e t u r n nNode ;
98
99 }
100 else {
101 f i n a l AntGraphFramework g r a p h = s a n t C o l o n y . getGraph ( ) ;
102
103 // g e n e r a t e a random number
104 d o u b l e q = s r a n d Ge n . n e x t D o u b l e ( ) ;
105 i n t nMaxNode = −1;
106
107 if ( q <= Q0 ) {
108 // E x p l o i t a t i o n
109 d o u b l e dMaxVal = −1;
110 d o u b l e dVal ;
111 i n t nNode ;
112
113 S e t k e y S e t = m n o d e sTo V i si t Tb l e . k e y S e t ( ) ;
114
115 f o r ( O b j e c t node : k e y S e t ) {
116 // s e l e c t a node
117 nNode = ( I n t e g e r ) node ;
118
119 // g e t t h e v a l u e
120 dVal = g r a p h . t a u ( nCurNode , nNode ) ∗
121 Math . pow ( g r a p h . e t h a ( nCurNode , nNode ) , B ) ;
122
123 // c h e c k i f i t i s t h e max
124 i f ( dVal > dMaxVal ) {
125 dMaxVal = dVal ;
126 nMaxNode = nNode ;
127 }
81
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
APPENDIX E. CODE Computer Science, RUC
128 }
129 }
130 else {
131 // E x p l o r a t i o n
132 d o u b l e dSum = 0 ;
133 i n t nNode ;
134
135 // g e t t h e sum a t d e n o m i n a t o r
136 S e t k e y S e t = m n o d e sTo V i si t Tb l e . k e y S e t ( ) ;
137
138 f o r ( O b j e c t node : k e y S e t ) {
139 nNode = ( I n t e g e r ) node ;
140
141 // Update t h e sum
142 dSum += Math . pow ( g r a p h . t a u ( nCurNode , nNode ) , A) ∗
143 Math . pow ( g r a p h . e t h a ( nCurNode , nNode ) , B ) ;
144 }
145 balance = 0;
146
147 // s e a r c h t h e node i n a g r e e m e n t wi t h eq . b )
148 k e y S e t = m n o d e sTo V i si t Tb l e . k e y S e t ( ) ;
149 f o r ( O b j e c t node : k e y S e t ) {
150 nNode = ( I n t e g e r ) node ;
151 p r o b a b i l i t y = Math . pow ( g r a p h . t a u ( nCurNode , nNode ) , A) ∗
152 Math . pow ( g r a p h . e t h a ( nCurNode , nNode ) , B) / dSum ;
153
154
155 if ( p r o b a b i l i t y >= b a l a n c e ) {
156 nMaxNode = nNode ;
157 balance = p robability ;
158 }
159 }
160 }
161
162 // d e l e t e t h e s e l e c t e d node from t h e l i s t o f n o d e s t o visit
163 m n o d e sTo V i si t Tb l e . remove ( new I n t e g e r ( nMaxNode ) ) ;
164
165 r e t u r n nMaxNode ;
166 }
167 }
168
169 /∗∗
170 ∗ The s t r i n g r e p r e s e n t a t i o n o f t h e AntForTSP o b j e c t .
171 ∗ C a l l s t h e su p e r ’ s t o S t r i n g ( ) method .
172 ∗ @ r e t u r n The s t r i n g r e p r e s e n t a t i o n o f t h e AntForTSP o b j e c t .
173 ∗/
174 public String toString () {
175 String retValue ;
176
177 retValue = super . t o S t r i n g ( ) ;
178 return retValue ;
179 }
180
181 /∗∗
182 ∗ Updates t h e pheromone v a l u e o f t h e e d g e between t h e c u r r e n t and
183 ∗ n e x t node where t h e a n t i s l o c a t e d .
184 ∗ I t u s e s f o r m u l a 3 . 1 2 f o u n d i n DS04 on page 7 8 .
185 ∗ @param nCurNode The node t h e a n t c u r r e n t l y i s a t .
186 ∗ @param nNextNode The node t h e a n t w i l l be g o i n g t o .
187 ∗/
188 p u b l i c v o i d l o c a l U p d a t i n g R u l e ( i n t nCurNode , i n t nNextNode ) {
189 f i n a l AntGraphFramework g r a p h = s a n t C o l o n y . getGraph ( ) ;
190
191 d o u b l e v a l = ( ( d o u b l e ) 1 − KSI ) ∗ g r a p h . t a u ( nCurNode , nNextNode ) +
192 ( KSI ∗ ( g r a p h . t a u 0 ( ) ) ) ;
193
194 g r a p h . updateTau ( nCurNode , nNextNode , val ) ;
195 }
196
197 /∗∗
198 ∗ Compares two d i s t a n c e s , and c h e c k s which one o f them i s less ( better )
199 ∗ @param dPathValue1 F i r s t d i s t a n c e .
200 ∗ @param dPathValue2 Second d i s t a n c e .
201 ∗ @ r e t u r n Re t u r n s t r u e i f t h e f i r s t i s l e s s , e l s e f a l s e .
82
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
Computer Science, RUC APPENDIX E. CODE
202 ∗/
203 p u b l i c b o o l e a n b e t t e r ( d o u b l e dPathValue1 , d o u b l e dPathValue2 ) {
204 r e t u r n dPathValue1 < dPathValue2 ;
205 }
206
207 /∗∗
208 ∗ Checks t o s e e i f t h e a n t i s done wi t h t h e t o u r be c h e c k i n g i s there
209 ∗ a r e more n o d e s i n i t s HashMap .
210 ∗ @ r e t u r n True i f t h e r e a r e no more n o d e s t o v i s i t .
211 ∗/
212 p u b l i c b o o l e a n end ( ) {
213 r e t u r n m n o d e sTo V i si t Tb l e . isEmpty ( ) ;
214 }
215 }
E.4 AntFramework.java
1 p a c k a g e framework . a c o s ;
2
3 import java . u t i l . ∗ ;
4 import java . i o . ∗ ;
5
6 /∗∗
7 ∗ The a n t framework .
8 ∗ As e v e r y a n t i s a t h r e a d i n i t s e l f , t h e c l a s s i m p l e m e n t s r u n n a b l e .
9 ∗ The a n t i s o b s e r v e d by t h e c o l o n y , meaning t h a t t h e a n t e x t e n d s t h e
10 ∗ observable c la s s .
11 ∗ @author Jakob K i e r k e g a a r d & Jean−Luc Ngassa
12 ∗/
13 p u b l i c a b s t r a c t c l a s s AntFramework e x t e n d s O b s e r v a b l e i m p l e m e n t s Runnable {
14 /∗∗
15 ∗ The ant ’ s ID .
16 ∗/
17 p r i v a t e f i n a l i n t m nAntID ;
18 /∗∗
19 ∗ A m a t r i x t o k e e p t r a c k o f where t h e a n t h a s been ; when an e d g e i s
20 ∗ v i s i t e d , a 1 i s entered in the appropriate spot .
21 ∗/
22 p r o t e c t e d i n t [ ] [ ] m path ;
23 /∗∗
24 ∗ The ID o f t h e node where t h e a n t i s r i g h t now .
25 ∗/
26 p r o t e c t e d i n t m nCurNode ;
27 /∗∗
28 ∗ The ID o f t h e ant ’ s s t a r t node .
29 ∗/
30 p r o t e c t e d f i n a l i n t m nStartNode ;
31 /∗∗
32 ∗ The l e n g t h o f t h e t o u r t h a t h a s been t r a v e l l e d .
33 ∗/
34 p r o t e c t e d d o u b l e m dPathLength ;
35 /∗∗
36 ∗ The o b s e r v e r o f t h e a n t ( t h e c o l o n y ) .
37 ∗/
38 p r o t e c t e d f i n a l O b se r v e r m o b s e r v e r ;
39 /∗∗
40 ∗ The t o u r r e p r e s e n t e d by an A r r a y L i s t o f i n t e g e r s .
41 ∗/
42 p r o t e c t e d A r r a y L i s t <I n t e g e r > m tour ;
43 /∗∗
44 ∗ The ID c o u n t e r . The c u r r e n t v a l u e o f t h e c o u n t e r becomes t h e ant ’ s
45 ∗ ID .
46 ∗/
47 p r i v a t e s t a t i c i n t s n A n t I D Co u n t er = 0 ;
48 /∗∗
49 ∗ The p r i n t s t r e a m i f t h e u s e r wants i n t e r m e d i a t e r e s u l t s w r i t t e n t o
50 ∗ files .
51 ∗/
52 p rivate s t a t i c PrintStream s ou ts ;
53 /∗∗
54 ∗ The ant ’ s c o l o n y .
83
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
APPENDIX E. CODE Computer Science, RUC
55 ∗/
56 p r o t e c t e d s t a t i c AntColonyFramework s a n t C o l o n y ;
57 /∗∗
58 ∗ The b e s t ( s h o r t e s t ) l e n g t h a c h i e v e d s o f a r . S e t t o max v a l u e s o
59 ∗ improvement i s a l wa y s g u a r a n t e e d a t l e a s t o n c e .
60 ∗/
61 p u b l i c s t a t i c d o u b l e s d Be st P a t h L e n g t h = Double .MAX VALUE ;
62 /∗∗
63 ∗ The b e s t t o u r s o f a r r e p r e s e n t e d by an A r r a y L i s t o f i n t e g e r s .
64 ∗/
65 p u b l i c s t a t i c A r r a y L i s t <I n t e g e r > s b e s t T o u r = n u l l ;
66 /∗∗
67 ∗ The i t e r a t i o n where t h e b e s t t o u r was a c c o m p l i s h e d .
68 ∗/
69 public s t a t i c int s nLastBestPathIteration = 0;
70
71 /∗∗
72 ∗ C r e a t e s a new a n t .
73 ∗ @param n S t a r t N o d e The ID o f t h e s t a r t i n g node o f t h e a n t .
74 ∗ @param o b s e r v e r The o b s e r v e r b e i n g t h e a n t c o l o n y .
75 ∗/
76 p u b l i c AntFramework ( i n t nStartNode , O b se r v e r o b s e r v e r ) {
77 s n A n t I D Co u n t er++;
78 m nAntID = s n A n t I D Co u n t er ;
79 m nStartNode = n S t a r t N o d e ;
80 m observer = observer ;
81 }
82
83 /∗∗
84 ∗ S e t s t h e a n t c o l o n y t h a t i s t o be u se d by t h e a n t .
85 ∗ @param a n t Co l o n y The a n t c o l o n y t h a t i s t o be u se d .
86 ∗/
87 p u b l i c s t a t i c v o i d se t A n t Co l o n y ( AntColonyFramework a n t Co l o n y ) {
88 s a n t C o l o n y = a n t Co l o n y ;
89 }
90
91 /∗∗
92 ∗ R e s e t s a l l t h e v a r i a b l e s f o r t h e ant , enabling a clean restart .
93 ∗/
94 p u b l i c s t a t i c void r e s e t ( ) {
95 s d Be st P a t h L e n g t h = Double .MAX VALUE ;
96 s bestTour = n u l l ;
97 s nLastBestPathIteration = 0;
98 i f ( Main . GUI . makeOutput ( ) )
99 s outs = null ;
100 }
101
102 /∗∗
103 ∗ I n i t i a l i z e s a l l t h e v a r i a b l e s r e q u i r e d t o be an a n t ; t h e graph ,
104 ∗ c u r r e n t node , t o u r l i s t e t c .
105 ∗/
106 p u b l i c void i n i t ( ) {
107 i f ( Main . GUI . makeOutput ( ) ) {
108 i f ( s o u t s == n u l l ) {
109 try {
110 s o u t s = new P r i n t S t r e a m ( new F i l e O u t p u t S t r e a m ( Main . GUI . getOutputPath ( ) +
111 s a n t C o l o n y . g e t I D ( ) + ” ” + s a n t C o l o n y . getGraph ( ) . n o d e s ( ) +
112 ” x” + s a n t C o l o n y . g e t A n t s ( ) + ” x ” + s a n t C o l o n y . g e t I t e r a t i o n s ( ) +
113 ” ants . txt ” ) ) ;
114 }
115 c a t c h ( E x c e p t i o n ex ) {
116 ex . p r i n t S t a c k T r a c e ( ) ;
117 }
118 }
119 }
120
121 f i n a l AntGraphFramework g r a p h = s a n t C o l o n y . getGraph ( ) ;
122 m nCurNode = m nStartNode ;
123
124 m path = new i n t [ g r a p h . n o d e s ( ) ] [ g r a p h . n o d e s ( ) ] ;
125 m tour = new A r r a y L i s t <I n t e g e r >(g r a p h . n o d e s ( ) ) ;
126
127 m tour . add ( m nStartNode ) ;
128 m dPathLength = 0 ;
84
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
Computer Science, RUC APPENDIX E. CODE
129 }
130
131 /∗∗
132 ∗ I n i t i a l i z e s t h e ant , and c r e a t e s and s t a r t s a new t h r e a d .
133 ∗ The t h r e a d i s b a se d on t h i s a n t .
134 ∗/
135 p u b l i c void createThread ( ) {
136 init ();
137 new Thread ( t h i s , ”Ant ” + m nAntID ) . s t a r t ( ) ;
138 }
139
140 /∗∗
141 ∗ The run method f o r t h e a n t . The a n t w i l l be r u n n i n g a s l o n g a s t h e
142 ∗ end c o n d i t i o n i s n ’ t met . I t r e t r i e v e s i t s new node by u s i n g t h e
143 ∗ s t a t e T r a n s i t i o n R u l e method , adds t h e new node t o i t s t o u r l i s t .
144 ∗ A f t e r w a r d s i t u p d a t e s t h e pheromone on t h e e d g e ( u s i n g t h e
145 ∗ l o c a l U p d a t i n g R u l e ) and c a l c u l a t e s i t s t o u r ’ s new d i s t a n c e . I n t h e
146 ∗ end i t c h e c k s i f t h e new v a l u e s a r e b e t t e r than t h e o l d o n e s ; i f
147 ∗ t h i s i s t h e c a s e , t h e o l d o n e s a r e r e p l a c e d by t h e new o n e s .
148 ∗/
149 p u b l i c v o i d run ( ) {
150 f i n a l AntGraphFramework g r a p h = s a n t C o l o n y . getGraph ( ) ;
151
152 // r e p e a t w h i l e End o f A c t i v i t y Rule r e t u r n s f a l s e
153 w h i l e ( ! end ( ) ) {
154 i n t nNewNode ;
155
156 // s y n c h r o n i z e t h e a c c e s s t o t h e g r a p h
157 s y n c h r o n i z e d ( graph ) {
158 // a p p l y t h e S t a t e T r a n s i t i o n Rule
159 nNewNode = s t a t e T r a n s i t i o n R u l e ( m nCurNode ) ;
160
161 // u p d a t e t h e l e n g t h o f t h e path
162 i f ( m nCurNode != nNewNode)
163 m dPathLength += g r a p h . d e l t a ( m nCurNode , nNewNode ) ;
164
165 }
166 if ( m nCurNode != nNewNode) {
167 // add t h e c u r r e n t node t h e l i s t o f v i s i t e d nodes
168 m tour . add ( nNewNode ) ;
169 m path [ m nCurNode ] [ nNewNode ] = 1 ;
170
171 s y n c h r o n i z e d ( graph ) {
172 // a p p l y t h e L o c a l Updating Rule
173 l o c a l U p d a t i n g R u l e ( m nCurNode , nNewNode ) ;
174 }
175
176 // u p d a t e t h e c u r r e n t node
177 m nCurNode = nNewNode ;
178 }
179 }
180 m dPathLength += g r a p h . d e l t a ( m nCurNode , m nStartNode ) ;
181
182 s y n c h r o n i z e d ( graph ) {
183 // u p d a t e t h e b e s t t o u r v a l u e
184 i f ( b e t t e r ( m dPathLength , s d Be st P a t h L e n g t h ) ) {
185 s d Be st P a t h L e n g t h = m dPathLength ;
186 s b e s t T o u r = m tour ;
187 s n L a s t Be s t P a t h I t e r a t io n = s antColony . g e t I t e r a t i o n C o u n t e r ( ) ;
188
189 if ( Main . GUI . makeOutput ( ) )
190 s o u t s . p r i n t l n ( ” Ant + ” + m nAntID + ” , ” + s d Be st P a t h L e n g t h + ” , ” +
191 s nLastBe stP athIte ration + ” ,” + s bestTour . s i z e () +
192 ” ,” + s bestTour ) ;
193 }
194 }
195 // u p d a t e t h e o b s e r v e r
196 m observer . update ( t h i s , n u l l ) ;
197 i f ( Main . GUI . makeOutput ( ) ) {
198 i f ( s a n t C o l o n y . done ( ) )
199 s outs . close ( ) ;
200 }
201 }
202
85
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
APPENDIX E. CODE Computer Science, RUC
203 /∗∗
204 ∗ F i n d s t h e b e t t e r d i s t a n c e among t h e two p a r a m e t e r s .
205 ∗ @param dPathValue The f i r s t d i s t a n c e t o be compared .
206 ∗ @param d Be st P a t h V a l ue The s e c o n d s d i s t a n c e t o be compared .
207 ∗ @ r e t u r n True o r f a l s e .
208 ∗/
209 p r o t e c t e d a b s t r a c t b o o l e a n b e t t e r ( d o u b l e dPathValue , d o u b l e d Be st P a t h V a l ue ) ;
210
211 /∗∗
212 ∗ The a b s t r a c t method d e f i n i n g t h e s t a t e t r a n s i t i o n rule . calculating
213 ∗ t h e n e x t node f o r t h e a n t .
214 ∗ @param r The ID o f t h e c u r r e n t node o f t h e a n t .
215 ∗ @ r e t u r n The ID o f t h e n e x t node .
216 ∗/
217 public abstract int stateTransitionRule ( int r ) ;
218
219 /∗∗
220 ∗ The a b s t r a c t method h a n d l i n g t h e l o c a l u p d a t i n g r u l e , u p d a t i n g t h e
221 ∗ pheromone on t h e e d g e between node r and s .
222 ∗ @param r The ID o f t h e node a t one end o f t h e e d g e .
223 ∗ @param s The ID o f t h e node a t t h e o t h e r end o f t h e e d g e .
224 ∗/
225 public abstract void localUpdatingRule( i n t r , int s ) ;
226
227 /∗∗
228 ∗ The a b s t r a c t method , d e f i n i n g t h e end c o n d i t i o n f o r t h e a n t .
229 ∗ @ r e t u r n True i f t h e a n t s h o u l d s t o p .
230 ∗/
231 p u b l i c a b s t r a c t b o o l e a n end ( ) ;
232
233 /∗∗
234 ∗ R e t r i e v e s an Array o f i n t s ( node IDs ) , r e t r i e v i n g them from t h e
235 ∗ ArrayList s bestTour .
236 ∗ @ r e t u r n Array o f i n t s .
237 ∗/
238 p u b l i c s t a t i c i n t [ ] getBestPath ( ) {
239
240 i n t nBestTourArray [ ] = new i n t [ s b e s t T o u r . s i z e ( ) ] ;
241 f o r ( i n t i = 0 ; i < s b e s t T o u r . s i z e ( ) ; i ++) {
242 nBestTourArray [ i ] = ( s b e s t T o u r . g e t ( i ) ) ;
243 }
244
245 r e t u r n nBestTourArray ;
246 }
247
248 /∗∗
249 ∗ The s t r i n g r e p r e s e n t a t i o n o f an a n t ; r e t u r n i n g t h e ant ’ s ID and
250 ∗ i t s c u r r e n t node .
251 ∗ @ r e t u r n The s t r i n g r e p r e s e n t a t i o n o f t h e a n t .
252 ∗/
253 public String toString () {
254 r e t u r n ”Ant ” + m nAntID + ” : ” + m nCurNode ;
255 }
256 }
E.5 AntGraphFramework.java
1 p a c k a g e framework . a c o s ;
2
3 import java . u t i l . ∗ ;
4 import java . i o . ∗ ;
5
6 /∗∗
7 ∗ The a n t framework .
8 ∗ As e v e r y a n t i s a t h r e a d i n i t s e l f , t h e c l a s s i m p l e m e n t s r u n n a b l e .
9 ∗ The a n t i s o b s e r v e d by t h e c o l o n y , meaning t h a t t h e a n t e x t e n d s t h e
10 ∗ observable c l as s .
11 ∗ @author Jakob K i e r k e g a a r d & Jean−Luc Ngassa
12 ∗/
13 p u b l i c a b s t r a c t c l a s s AntFramework e x t e n d s O b s e r v a b l e i m p l e m e n t s Runnable {
14 /∗∗
86
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
Computer Science, RUC APPENDIX E. CODE
15 ∗ The ant ’ s ID .
16 ∗/
17 p r i v a t e f i n a l i n t m nAntID ;
18 /∗∗
19 ∗ A m a t r i x t o k e e p t r a c k o f where t h e a n t h a s been ; when an e d g e i s
20 ∗ v i s i t e d , a 1 i s entered in the appropriate spot .
21 ∗/
22 p r o t e c t e d i n t [ ] [ ] m path ;
23 /∗∗
24 ∗ The ID o f t h e node where t h e a n t i s r i g h t now .
25 ∗/
26 p r o t e c t e d i n t m nCurNode ;
27 /∗∗
28 ∗ The ID o f t h e ant ’ s s t a r t node .
29 ∗/
30 p r o t e c t e d f i n a l i n t m nStartNode ;
31 /∗∗
32 ∗ The l e n g t h o f t h e t o u r t h a t h a s been t r a v e l l e d .
33 ∗/
34 p r o t e c t e d d o u b l e m dPathLength ;
35 /∗∗
36 ∗ The o b s e r v e r o f t h e a n t ( t h e c o l o n y ) .
37 ∗/
38 p r o t e c t e d f i n a l O b se r v e r m o b s e r v e r ;
39 /∗∗
40 ∗ The t o u r r e p r e s e n t e d by an A r r a y L i s t o f i n t e g e r s .
41 ∗/
42 p r o t e c t e d A r r a y L i s t <I n t e g e r > m tour ;
43 /∗∗
44 ∗ The ID c o u n t e r . The c u r r e n t v a l u e o f t h e c o u n t e r becomes t h e ant ’ s
45 ∗ ID .
46 ∗/
47 p r i v a t e s t a t i c i n t s n A n t I D Co u n t er = 0 ;
48 /∗∗
49 ∗ The p r i n t s t r e a m i f t h e u s e r wants i n t e r m e d i a t e r e s u l t s w r i t t e n t o
50 ∗ files .
51 ∗/
52 p rivate s t a t i c PrintStream s ou ts ;
53 /∗∗
54 ∗ The ant ’ s c o l o n y .
55 ∗/
56 p r o t e c t e d s t a t i c AntColonyFramework s a n t C o l o n y ;
57 /∗∗
58 ∗ The b e s t ( s h o r t e s t ) l e n g t h a c h i e v e d s o f a r . S e t t o max v a l u e s o
59 ∗ improvement i s a l wa y s g u a r a n t e e d a t l e a s t o n c e .
60 ∗/
61 p u b l i c s t a t i c d o u b l e s d Be st P a t h L e n g t h = Double .MAX VALUE;
62 /∗∗
63 ∗ The b e s t t o u r s o f a r r e p r e s e n t e d by an A r r a y L i s t o f i n t e g e r s .
64 ∗/
65 p u b l i c s t a t i c A r r a y L i s t <I n t e g e r > s b e s t T o u r = n u l l ;
66 /∗∗
67 ∗ The i t e r a t i o n where t h e b e s t t o u r was a c c o m p l i s h e d .
68 ∗/
69 public s ta ti c int s nLastBestPathIteration = 0;
70
71 /∗∗
72 ∗ C r e a t e s a new a n t .
73 ∗ @param n S t a r t N o d e The ID o f t h e s t a r t i n g node o f t h e a n t .
74 ∗ @param o b s e r v e r The o b s e r v e r b e i n g t h e a n t c o l o n y .
75 ∗/
76 p u b l i c AntFramework ( i n t nStartNode , O b se r v e r o b s e r v e r ) {
77 s n A n t I D Co u n t er++;
78 m nAntID = s n A n t I D Co u n t er ;
79 m nStartNode = n S t a r t N o d e ;
80 m observer = observer ;
81 }
82
83 /∗∗
84 ∗ S e t s t h e a n t c o l o n y t h a t i s t o be u se d by t h e a n t .
85 ∗ @param a n t Co l o n y The a n t c o l o n y t h a t i s t o be u s e d .
86 ∗/
87 p u b l i c s t a t i c v o i d se t A n t Co l o n y ( AntColonyFramework a n t Co l o n y ) {
88 s a n t C o l o n y = a n t Co l o n y ;
87
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
APPENDIX E. CODE Computer Science, RUC
89 }
90
91 /∗∗
92 ∗ R e s e t s a l l t h e v a r i a b l e s f o r t h e ant , enabling a clean restart .
93 ∗/
94 p u b l i c s t a t i c void r e s e t ( ) {
95 s d Be st P a t h L e n g t h = Double .MAX VALUE ;
96 s bestTour = n u l l ;
97 s nLastBestPathIteration = 0;
98 i f ( Main . GUI . makeOutput ( ) )
99 s outs = null ;
100 }
101
102 /∗∗
103 ∗ I n i t i a l i z e s a l l t h e v a r i a b l e s r e q u i r e d t o be an a n t ; t h e graph ,
104 ∗ c u r r e n t node , t o u r l i s t e t c .
105 ∗/
106 p u b l i c void i n i t ( ) {
107 i f ( Main . GUI . makeOutput ( ) ) {
108 i f ( s o u t s == n u l l ) {
109 try {
110 s o u t s = new P r i n t S t r e a m ( new F i l e O u t p u t S t r e a m ( Main . GUI . getOutputPath ( ) +
111 s a n t C o l o n y . g e t I D ( ) + ” ” + s a n t C o l o n y . getGraph ( ) . n o d e s ( ) +
112 ” x” + s a n t C o l o n y . g e t A n t s ( ) + ” x ” + s a n t C o l o n y . g e t I t e r a t i o n s ( ) +
113 ” ants . txt ” ) ) ;
114 }
115 c a t c h ( E x c e p t i o n ex ) {
116 ex . p r i n t S t a c k T r a c e ( ) ;
117 }
118 }
119 }
120
121 f i n a l AntGraphFramework g r a p h = s a n t C o l o n y . getGraph ( ) ;
122 m nCurNode = m nStartNode ;
123
124 m path = new i n t [ g r a p h . n o d e s ( ) ] [ g r a p h . n o d e s ( ) ] ;
125 m tour = new A r r a y L i s t <I n t e g e r >(g r a p h . n o d e s ( ) ) ;
126
127 m tour . add ( m nStartNode ) ;
128 m dPathLength = 0 ;
129 }
130
131 /∗∗
132 ∗ I n i t i a l i z e s t h e ant , and c r e a t e s and s t a r t s a new t h r e a d .
133 ∗ The t h r e a d i s b a se d on t h i s a n t .
134 ∗/
135 p u b l i c void createThread ( ) {
136 init ();
137 new Thread ( t h i s , ” Ant ” + m nAntID ) . s t a r t ( ) ;
138 }
139
140 /∗∗
141 ∗ The run method f o r t h e a n t . The a n t w i l l be r u n n i n g a s l o n g a s t h e
142 ∗ end c o n d i t i o n i s n ’ t met . I t r e t r i e v e s i t s new node by u s i n g t h e
143 ∗ s t a t e T r a n s i t i o n R u l e method , adds t h e new node t o i t s t o u r l i s t .
144 ∗ A f t e r w a r d s i t u p d a t e s t h e pheromone on t h e e d g e ( u s i n g t h e
145 ∗ l o c a l U p d a t i n g R u l e ) and c a l c u l a t e s i t s t o u r ’ s new d i s t a n c e . I n t h e
146 ∗ end i t c h e c k s i f t h e new v a l u e s a r e b e t t e r than t h e o l d o n e s ; i f
147 ∗ t h i s i s t h e c a s e , t h e o l d o n e s a r e r e p l a c e d by t h e new o n e s .
148 ∗/
149 p u b l i c v o i d run ( ) {
150 f i n a l AntGraphFramework g r a p h = s a n t C o l o n y . getGraph ( ) ;
151
152 // r e p e a t w h i l e End o f A c t i v i t y Rule r e t u r n s false
153 w h i l e ( ! end ( ) ) {
154 i n t nNewNode ;
155
156 // s y n c h r o n i z e t h e a c c e s s t o t h e g r a p h
157 s y n c h r o n i z e d ( graph ) {
158 // a p p l y t h e S t a t e T r a n s i t i o n Rule
159 nNewNode = s t a t e T r a n s i t i o n R u l e ( m nCurNode ) ;
160
161 // u p d a t e t h e l e n g t h o f t h e path
162 i f ( m nCurNode != nNewNode)
88
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
Computer Science, RUC APPENDIX E. CODE
89
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
APPENDIX E. CODE Computer Science, RUC
E.6 GUI.java
1 p a c k a g e Main ;
2
3 import IO . ∗ ;
4 import Node . Node ;
5 import framework . a c o s . ∗ ;
6 import tsp . ∗ ;
7 import tsp . optimization . ∗ ;
8 import java . u t i l . ∗ ;
9 import java . i o . ∗ ;
10 import j a v a . awt . ∗ ;
11 import j a v a . awt . e v e n t . ∗ ;
12 import j a v a x . swi n g . ∗ ;
13 import j a v a x . swi n g . b o r d e r . ∗ ;
14
15 /∗∗
16 ∗ The GUI c l a s s , which r e t r i e v e s t h e p a r a m e t e r s a l f a , b e t a , rho , k s i ,
17 ∗ W and Q0 from t h e u s e r . I t a l s o l e t s t h e u s e r c h o o s e wh e t h e r o r n o t
18 ∗ he / s h e wants p r e l i m i n a r y r e s u l t s p r i n t e d t o f i l e s i n a f o l d e r c h o s e n
19 ∗ by t h e u s e r , and t h e i n s t a n c e ( . t s p f i l e ) on which t h e program s h o u l d
20 ∗ use .
21 ∗ @author Jakob K i e r k e g a a r d & Jean−Luc Ngassa
22 ∗/
23 p u b l i c c l a s s GUI e x t e n d s JFrame i m p l e m e n t s A c t i o n L i s t e n e r {
24
25 private s t a t i c AntColonyForTSP a n t Co l o n y ;
26 public s t a t i c TSPCanvas c a n v a s = new TSPCanvas ( ) ;
27 private s t a t i c J T e x t F i e l d f i l e P a t h , outputPath , nuOfAnts , n u O f I t e r a t i o n s , r e s u l t ;
28 private Button runButton , d e f a u l t B u t t o n , c l e a r B u t t o n , l o c a t e T s p F i l e B u t t o n ;
29 private Button l o c a t e O u t p u t F o l d e r B u t t o n ;
30 private s t a t i c JCheckBox g i v e O u t p u t ;
31 private s t a t i c JCheckBox doTwoOpt , doTwoHOpt , doOpt ;
32 private JPanel canvasJPanel ;
33 private s t a t i c J S p i n n e r a l f a S p i n n e r , b e t a S p i n n e r , wSpinner , q 0 S p i n n e r ;
34 private s t a t i c JSpinner ksiSpinner , rhoSpinner ;
35 private s t a t i c JLabel s t a t u s J L a b e l , tourLengthJLabel , totalTimeJLabel ;
36
37 p r i v a t e s t a t i c f i n a l S t r i n g ALFA = ”\ u03B1 ” ;
38 p r i v a t e s t a t i c f i n a l S t r i n g BETA = ”\ u03B2 ” ;
39 p r i v a t e s t a t i c f i n a l S t r i n g RHO = ”\ u03C1 ” ;
40 p r i v a t e s t a t i c f i n a l S t r i n g KSI = ”\u03BE ” ;
41 p r i v a t e s t a t i c f i n a l i n t WINDOW WIDTH = 1 0 0 0 ;
42 p r i v a t e s t a t i c f i n a l i n t WINDOW HEIGHT = 8 0 0 ;
43 p u b l i c s t a t i c f i n a l i n t CANVAS WIDTH = WINDOW WIDTH / 2 − 4 0 ;
44 p u b l i c s t a t i c f i n a l i n t CANVAS HEIGHT = WINDOW HEIGHT − 2 0 0 ;
45
46 /∗∗
47 ∗ The c o n s t r u c t o r calls t h e d i sp l a y GU I method .
48 ∗/
49 p u b l i c GUI ( ) {
90
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
Computer Science, RUC APPENDIX E. CODE
50 d i sp l a y GU I ( ) ;
51 }
52
53 /∗∗
54 ∗ The d i sp l a y GU I method c r e a t e s and d i s p l a y s t h e e n t i r e GUI . I t
55 ∗ a l s o adds a c t i o n L i s t e n e r s where r e q u i r e d ( b u t t o n s and c h e c k b o x e s ) .
56 ∗/
57 p r i v a t e v o i d d i sp l a y GU I ( ) {
58 J P a n e l p a r a m e t e r J P a n e l , b u t t o n J P a n e l , numberJPanel , o p t i m i z a t i o n J P a n e l ;
59 JPanel f i l e J P a n e l , extraJPanel , s t a t u s J P a n e l , v i s u a l J P a n e l , dataJPanel ;
60 JPanel innerPJPanel ;
61 S p i n n e r M o d e l a l f a S p i n n e r M o d e l , b e t a S p i n n e r M o d e l , wSpinnerModel ;
62 SpinnerModel rhoSpinnerModel , ksiSpinnerModel , q0SpinnerModel ;
63 JTextArea r e s u l t A r e a ;
64 JScrollPane scrollPane ;
65
66 s e t S i z e ( new Dimension (WINDOW WIDTH, WINDOW HEIGHT ) ) ;
67 s e t T i t l e ( ”TSP o u t p u t ” ) ;
68 s e t D e f a u l t C l o s e O p e r a t i o n (EXIT ON CLOSE ) ;
69 s e t L a y o u t ( new GridLayout ( 1 , 2 ) ) ;
70
71 // The c a n v a s J P a n e l
72 v i s u a l J P a n e l = new J P a n e l ( ) ;
73 v i s u a l J P a n e l . s e t L a y o u t ( new Bo r d e r L a y o u t ( ) ) ;
74
75 c a n v a s J P a n e l = new J P a n e l ( new Bo r d e r L a y o u t ( ) ) ;
76 c a n v a s J P a n e l . s e t B o r d e r ( B o r d e r F a c t o r y . c r e a t e B e v e l B o r d e r ( B e v e l B o r d e r . RAISED ) ) ;
77 c a n v a s J P a n e l . add ( new L a b e l ( ” V i s u a l r e p r e s e n t a t i o n o f t h e TSP” ,
78 L a b e l .CENTER) , ” North ” ) ;
79
80 d a t a J P a n e l = new J P a n e l ( ) ;
81 d a t a J P a n e l . s e t L a y o u t ( new GridLayout ( 2 , 1 ) ) ;
82 d a t a J P a n e l . s e t B o r d e r ( B o r d e r F a c t o r y . c r e a t e B e v e l B o r d e r ( B e v e l B o r d e r . RAISED ) ) ;
83
84 t o u r L e n g t h J L a b e l = new J L a b e l ( ) ;
85 r e s u l t = new J T e x t F i e l d ( 4 0 ) ;
86 r e s u l t A r e a = new JTextArea ( 1 , 4 0 ) ;
87 resultArea . setEditable ( f a ls e ) ;
88 resu lt . setEditable ( f a l s e ) ;
89
90 s c r o l l P a n e = new J S c r o l l P a n e ( ) ;
91 scrollPane . setVerticalScrollBarPolicy (
92 S c r o l l P a n e C o n s t a n t s . VERTICAL SCROLLBAR NEVER ) ;
93 scrollPane . setHorizontalScrollBarPolicy(
94 S c r o l l P a n e C o n s t a n t s . HORIZONTAL SCROLLBAR ALWAYS) ;
95 s c r o l l P a n e . setColumnHeaderView ( r e s u l t ) ;
96
97 d a t a J P a n e l . add ( t o u r L e n g t h J L a b e l ) ;
98 d a t a J P a n e l . add ( s c r o l l P a n e ) ;
99
100 v i s u a l J P a n e l . add ( c a n v a s J P a n e l ) ;
101 v i s u a l J P a n e l . add ( d a t a J P a n e l , ” South ” ) ;
102
103 // The p a r a m e t e r J P a n e l
104 p a r a m e t e r J P a n e l = new J P a n e l ( new Bo r d e r L a y o u t ( ) ) ;
105 p a r a m e t e r J P a n e l . s e t B o r d e r ( B o r d e r F a c t o r y . c r e a t e B e v e l B o r d e r ( B e v e l B o r d e r . RAISED ) ) ;
106 i n n e r P J P a n e l = new J P a n e l ( new GridLayout ( 3 , 1 ) ) ;
107 p a r a m e t e r J P a n e l . add ( new L a b e l ( ” P a r a m e t e r s ” , L a b e l .CENTER) , ” North ” ) ;
108
109 // The b u t t o n J P a n e l
110 b u t t o n J P a n e l = new J P a n e l ( new FlowLayout ( ) ) ;
111 buttonJPanel . se tBorde r ( BorderFactory . createEtchedBorder ( ) ) ;
112 runButton = new Button ( ”RUN” ) ;
113 c l e a r B u t t o n = new Button ( ” C l e a r s e t t i n g s ” ) ;
114 d e f a u l t B u t t o n = new Button ( ” Use d e f a u l t v a l u e s ” ) ;
115
116 runButton . a d d A c t i o n L i s t e n e r ( t h i s ) ;
117 clearButton . addActionListener ( t h i s ) ;
118 defaultButton . addActionListener ( t h i s ) ;
119
120 b u t t o n J P a n e l . add ( runButton ) ;
121 b u t t o n J P a n e l . add ( c l e a r B u t t o n ) ;
122 b u t t o n J P a n e l . add ( d e f a u l t B u t t o n ) ;
123
91
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
APPENDIX E. CODE Computer Science, RUC
92
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
Computer Science, RUC APPENDIX E. CODE
198 f i l e J P a n e l . add ( g i v e O u t p u t ) ;
199 f i l e J P a n e l . add ( l o c a t e O u t p u t F o l d e r B u t t o n ) ;
200 f i l e J P a n e l . add ( o u t p u t P a t h ) ;
201
202 // The o p t i m i z a t i o n c h o i c e s
203 o p t i m i z a t i o n J P a n e l = new J P a n e l ( new GridLayout ( 2 , 2 ) ) ;
204 optimizationJPanel . setBorder ( BorderFactory . c r e a t e T i t l e d B o r d er (” Optimization ” ) ) ;
205 doOpt = new JCheckBox ( ” Use l o c a l s e a r c h o p t i m i z a t i o n ” , t r u e ) ;
206 doTwoOpt = new JCheckBox ( ” Use 2−o p t ” , t r u e ) ;
207 doTwoHOpt = new JCheckBox ( ” Use 2 −o p t ” , t r u e ) ;
208 doOpt . a d d A c t i o n L i s t e n e r ( t h i s ) ;
209
210 o p t i m i z a t i o n J P a n e l . add ( doOpt ) ;
211 o p t i m i z a t i o n J P a n e l . add ( new J L a b e l ( ) ) ;
212 o p t i m i z a t i o n J P a n e l . add ( doTwoOpt ) ;
213 o p t i m i z a t i o n J P a n e l . add ( doTwoHOpt ) ;
214
215 // The s t a t u s p a n e l
216 s t a t u s J P a n e l = new J P a n e l ( new GridLayout ( 2 , 1 ) ) ;
217 statusJPanel . setBorder ( BorderFactory . c r e a t e T i t l e d B o r d er (” Status ” ) ) ;
218 s t a t u s J L a b e l = new J L a b e l ( ” ” , S wi n g Co n st a n t s .CENTER) ;
219 statusJLabel . s e t V i s i b l e ( true ) ;
220 t o t a l T i m e J L a b e l = new J L a b e l ( ” ” , S wi n g Co n st a n t s .CENTER) ;
221 totalTimeJLabel . s e t V i s i b l e ( true ) ;
222
223 s t a t u s J P a n e l . add ( s t a t u s J L a b e l ) ;
224 s t a t u s J P a n e l . add ( t o t a l T i m e J L a b e l ) ;
225
226 // Adding e v e r y t h i n g
227 e x t r a J P a n e l = new J P a n e l ( new GridLayout ( 2 , 1));
228 e x t r a J P a n e l . add ( o p t i m i z a t i o n J P a n e l ) ;
229 e x t r a J P a n e l . add ( s t a t u s J P a n e l ) ;
230
231 i n n e r P J P a n e l . add ( numberJPanel ) ;
232 i n n e r P J P a n e l . add ( f i l e J P a n e l ) ;
233 i n n e r P J P a n e l . add ( e x t r a J P a n e l ) ;
234 p a r a m e t e r J P a n e l . add ( b u t t o n J P a n e l , ” South ” ) ;
235 p a r a m e t e r J P a n e l . add ( i n n e r P J P a n e l ) ;
236
237 t h i s . add ( p a r a m e t e r J P a n e l ) ;
238 t h i s . add ( v i s u a l J P a n e l ) ;
239 this . s et Vi s ib le ( true ) ;
240 canvas . r e p a i n t ( ) ;
241 }
242
243 /∗∗
244 ∗ The a c t i o n p e r f o r m e d method h a n d l e s a l l a c t i o n s when t h e u s e r
245 ∗ i n t e r a c t s wi t h t h e GUI .
246 ∗ @param e The e v e n t .
247 ∗/
248 p u b l i c void actionPerformed ( ActionEvent e ) {
249 JFileChooser fc ;
250 S t r i n g missingParameters ;
251 d o u b l e st a r t Ti m e , endTime , t o t a l T i m e ;
252
253 if ( e . g e t S o u r c e ( ) == doOpt ) {
254 i f ( doOpt . i s S e l e c t e d ( ) ) {
255 doTwoOpt . s e t E n a b l e d ( t r u e ) ;
256 doTwoHOpt . s e t E n a b l e d ( t r u e ) ;
257 }
258 else {
259 doTwoOpt . s e t E n a b l e d ( f a l s e ) ;
260 doTwoHOpt . s e t E n a b l e d ( f a l s e ) ;
261 }
262 }
263 e l s e i f ( e . g e t S o u r c e ( ) == g i v e O u t p u t ) {
264 i f ( giveOutput . i s S e l e c t e d ( ) ) {
265 locateOutputFolderButton . setEnabled ( true ) ;
266 outputPath . setEnabled ( t r u e ) ;
267 }
268 else {
269 locateOutputFolderButton . setEnabled ( f a l s e ) ;
270 outputPath . setEnabled ( f a l s e ) ;
271 }
93
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
APPENDIX E. CODE Computer Science, RUC
272 }
273 e l s e i f ( e . g e t S o u r c e ( ) == runButton ) {
274 missingParameters = ” ” ;
275 /∗∗
276 ∗ Checks i f a l l t h e r e q u i r e d f i e l d s have g o t t e n v a l u e s .
277 ∗ i f t h i s i s n ’ t t h e c a s e , a wa r n i n g m e ssa g e comes up t o i n f o r m
278 ∗ t h e u s e r a b o u t what i s m i s s i n g .
279 ∗/
280 i f ( nuOfAnts . g e t Te x t ( ) . e q u a l s ( ” ” ) | |
281 n u O f I t e r a t i o n s . g e t Te x t ( ) . e q u a l s ( ” ” ) | |
282 f i l e P a t h . g e t Te x t ( ) . e q u a l s ( ” ” ) | |
283 ( g i v e O u t p u t . i s S e l e c t e d ( ) && o u t p u t P a t h . g e t Te x t ( ) . e q u a l s ( ” ” ) ) | |
284 ( doOpt . i s S e l e c t e d ( ) && ( ! doTwoOpt . i s S e l e c t e d ( ) &&
285 ! doTwoHOpt . i s S e l e c t e d ( ) ) ) ) {
286 i f ( nuOfAnts . g e t Te x t ( ) . e q u a l s ( ” ” ) )
287 m i s s i n g P a r a m e t e r s += ”Number o f a n t s \n ” ;
288 i f ( n u O f I t e r a t i o n s . g e t Te x t ( ) . e q u a l s ( ” ” ) )
289 m i s s i n g P a r a m e t e r s += ”Number o f i t e r a t i o n s \n ” ;
290 i f ( f i l e P a t h . g e t Te x t ( ) . e q u a l s ( ” ” ) )
291 m i s s i n g P a r a m e t e r s += ”The t s p f i l e \n ” ;
292 i f ( g i v e O u t p u t . i s S e l e c t e d ( ) && o u t p u t P a t h . g e t Te x t ( ) . e q u a l s ( ” ” ) )
293 m i s s i n g P a r a m e t e r s += ”The path where you want y o u r p r e l i m i n a r y
294 o u t p u t \n ” ;
295 i f ( doOpt . i s S e l e c t e d ( ) && ( ! doTwoOpt . i s S e l e c t e d ( ) | |
296 ! doTwoHOpt . i s S e l e c t e d ( ) ) )
297 m i s s i n g P a r a m e t e r s += ”The t y p e o f l o c a l s e a r c h o p t i m i z a t i o n \n ” ;
298 JOptionPane . s h o wM e s s a g e D i a l o g ( t h i s ,
299 ” P l e a s e f i l l o u t a l l t h e p a r a m e t e r s . \ n\nYou a r e m i s s i n g t h e
300 f o l l o w i n g : \ n” +
301 m i s s i n g P a r a m e t e r s , ” Warning ” , JOptionPane .WARNING MESSAGE ) ;
302 }
303 else {
304 /∗∗
305 ∗ I f t h e u s e r wants i n t e r m e d i a t e r e s u l t s p r i n t e d t o f i l e s ,
306 ∗ he / s h e i s warned t h a t t h e program w i l l r e q u i r e much
307 ∗ more t i m e t o run . I f t h e u s e r a c c e p t s , t h e t i m e i s
308 ∗ r e g i s t e r e d and t h e runProgram method i s c a l l e d . When
309 ∗ done , t h e t i m e i s r e g i s t e r e d a g a i n , and t h e t o t a l run
310 ∗ t i m e i s f o u n d and p r i n t e d .
311 ∗/
312 i n t n = JOptionPane . YES OPTION ;
313 i f ( giveOutput . i s S e l e c t e d ( ) ) {
314 n = JOptionPane . sh o wCo n f i r m D i a l o g ( t h i s ,
315 ” I t w i l l t a k e an e x t e n d e d amount o f t i m e \ n t o p r i n t t h e
316 r e s u l t s t o f i l e s . \ n\n
317 Do you want t o c o n t i n u e ? ” , ” Warning ” , JOptionPane . YES NO OPTION ,
318 JOptionPane .WARNING MESSAGE ) ;
319 }
320 i f ( n == JOptionPane . YES OPTION) {
321 s t a t u s J L a b e l . s e t T e x t ( ” Working . . . ” ) ;
322 totalTimeJLabel . setText ( ” ” ) ;
323
324 s t a r t T i m e = System . c u r r e n t T i m e M i l l i s ( ) ;
325
326 runProgram ( ) ;
327
328 endTime = System . c u r r e n t T i m e M i l l i s ( ) ;
329 t o t a l T i m e = endTime − s t a r t T i m e ;
330
331 s t a t u s J L a b e l . s e t T e x t ( ” Done ! ” ) ;
332 statusJLabel . repaint ( ) ;
333
334 t o t a l T i m e J L a b e l . s e t T e x t ( ” I t t o o k ” + t o t a l T i m e / 1000 +
335 ” s e c o n d s t o compute t h e r e s u l t ” ) ;
336 totalTimeJLabel . r e p a i n t ( ) ;
337
338 c a n v a s J P a n e l . add ( c a n v a s , ” Ce n t e r ” ) ;
339 canvas . r e p a i n t ( ) ;
340 }
341 }
342 }
343 e l s e i f ( e . g e t S o u r c e ( ) == c l e a r B u t t o n ) {
344 nuOfAnts . s e t T e x t ( ” ” ) ;
345 n u O f I t e r a t i o n s . setText ( ” ” ) ;
94
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
Computer Science, RUC APPENDIX E. CODE
346 f i l e P a t h . setText ( ” ” ) ;
347 outputPath . setText ( ” ” ) ;
348 giveOutput . s e t S e l e c t e d ( f a l s e ) ;
349 locateOutputFolderButton . setEnabled ( f a l s e ) ;
350 outputPath . setEnabled ( f a l s e ) ;
351 alfaSpinner . setValue ( 0 ) ;
352 betaSpinner . setValue ( 1 ) ;
353 wSpinner . s e t V a l u e ( 1 ) ;
354 q0Spinner . setValue ( 0 ) ;
355 rhoSpinner . setValue ( 0 ) ;
356 doOpt . s e t S e l e c t e d ( f a l s e ) ;
357 doTwoOpt . s e t S e l e c t e d ( f a l s e ) ;
358 doTwoHOpt . s e t S e l e c t e d ( f a l s e ) ;
359 doTwoOpt . s e t E n a b l e d ( f a l s e ) ;
360 doTwoHOpt . s e t E n a b l e d ( f a l s e ) ;
361 }
362 e l s e i f ( e . g e t S o u r c e ( ) == d e f a u l t B u t t o n ) {
363 nuOfAnts . s e t T e x t ( ” 5 1 ” ) ;
364 n u O f I t e r a t i o n s . setText ( ” 1 0 0 ” ) ;
365 outputPath . setText ( ” ” ) ;
366 giveOutput . s e t S e l e c t e d ( f a l s e ) ;
367 locateOutputFolderButton . setEnabled ( f a l s e ) ;
368 outputPath . setEnabled ( f a l s e ) ;
369 alfaSpinner . setValue ( 0 . 1 ) ;
370 betaSpinner . setValue ( 2 ) ;
371 wSpinner . s e t V a l u e ( 1 ) ;
372 q0Spinner . setValue ( 0 . 8 ) ;
373 rhoSpinner . setValue ( 0 . 1 ) ;
374 doOpt . s e t S e l e c t e d ( t r u e ) ;
375 doTwoOpt . s e t S e l e c t e d ( t r u e ) ;
376 doTwoHOpt . s e t S e l e c t e d ( t r u e ) ;
377 doTwoOpt . s e t E n a b l e d ( t r u e ) ;
378 doTwoHOpt . s e t E n a b l e d ( t r u e ) ;
379 }
380 e l s e i f ( e . g e t S o u r c e ( ) == l o c a t e T s p F i l e B u t t o n ) {
381 f c = new J F i l e C h o o s e r ( ) ;
382
383 T S P F i l e F i l t e r f i l t e r = new T S P F i l e F i l t e r ( ) ;
384 fc . setFileFilter ( f i l t e r );
385
386 i n t r e t u r n V a l u e = f c . showOpenDialog ( t h i s ) ;
387 i f ( r e t u r n V a l u e == J F i l e C h o o s e r .APPROVE OPTION) {
388 File f i l e = fc . getSelectedFile ( ) ;
389 f i l e P a t h . setText ( f i l e . g e t A b s o l u t e F i l e ( ) . t o S t r i n g ( ) ) ;
390 }
391 }
392 e l s e i f ( e . g e t S o u r c e ( ) == l o c a t e O u t p u t F o l d e r B u t t o n ) {
393 f c = new J F i l e C h o o s e r ( ) ;
394 f c . s e t F i l e S e l e c t i o n M o d e ( J F i l e C h o o s e r . DIRECTORIES ONLY ) ;
395
396 i n t r e t u r n V a l u e = f c . showOpenDialog ( t h i s ) ;
397 i f ( r e t u r n V a l u e == J F i l e C h o o s e r .APPROVE OPTION) {
398 File f i l e = fc . getSelectedFile ( ) ;
399 outputPath . setText ( f i l e . g e t A b s o l u t e F i l e ( ) . t o S t r i n g ( ) ) ;
400 }
401 }
402 }
403
404 /∗∗
405 ∗ A s m a l l method t o s i m p l i f y a d d i n g t h e s p i n n e r s t o t h e GUI , a s i t
406 ∗ can be a f a i r l y complex o p e r a t i o n . I t adds t h e s p i n n e r s t o g e t h e r
407 ∗ wi t h a s m a l l a s s o c i a t e d s t r i n g t o e x p l a i n what v a l u e i s s e t u s i n g
408 ∗ that s p e c i f i c spinner .
409 ∗ @param c The c o n t a i n e r which i s t o h o l d t h e s p i n n e r .
410 ∗ @param l a b e l The l a b e l t h a t h o l d s t h e e x p l a n i t o r y t e x t .
411 ∗ @param model The model o f t h e s p i n n e r .
412 ∗ @ r e t u r n The J S p i n n e r wi t h t h e a p p l i e d model .
413 ∗/
414 p r i v a t e J S p i n n e r a d d S p i n n e r ( C o n t a i n e r c , S t r i n g l a b e l , S p i n n e r M o d e l model ) {
415 J L a b e l l = new J L a b e l ( l a b e l ) ;
416 c . add ( l ) ;
417 J S p i n n e r s p i n n e r = new J S p i n n e r ( model ) ;
418 ( ( J S p i n n e r . D e f a u l t E d i t o r ) s p i n n e r . g e t E d i t o r ( ) ) . g e t T e x t F i e l d ( ) . se t Co l u m n s ( 1 0 ) ;
419 l . setLabelFor ( spinner ) ;
95
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
APPENDIX E. CODE Computer Science, RUC
420 c . add ( s p i n n e r ) ;
421 return spinner ;
422 }
423
424 /∗∗
425 ∗ The method t h a t s t a r t s t h e c a l c u l a t i o n o f t h e b e s t t o u r .
426 ∗ I t r e t r i e v e s an I n p u t F i l e , from which i t a c q u i r e s t h e n o d e s and
427 ∗ c r e a t e s t h e d e l t a m a t r i x b a se d on t h e s e n o d e s and t h e i r d i s t a n c e s
428 ∗ t o e a c h o t h e r . A new g r a p h i s c r e a t e d u s i n g t h i s m a t r i x , and t h e
429 ∗ g r a p h i s u se d f o r c r e a t i n g a new c o l o n y .
430 ∗ O p t i m i z a t i o n i s done a c c o r d i n g l y t o t h e u s e r ’ s w i s h e s , and t h e
431 ∗ f i n a l r e s u l t i s p r i n t e d t o t h e GUI i n t h e r e s p e c t i v e p l a c e s .
432 ∗/
433 p r i v a t e v o i d runProgram ( ) {
434 i n t nNodes , nAnts , n I t e r a t i o n s ;
435 A r r a y L i s t <Node> n o d e s ;
436 TwoOpt twoOpt ;
437 TwohOpt twohOpt ;
438
439 try {
440 new I n p u t F i l e ( f i l e P a t h . g e t Te x t ( ) ) ;
441 }
442 catch ( Exception e ) {
443 System . o u t . p r i n t l n ( ” F i l e e r r o r : ” + e ) ;
444 }
445
446 n o d e s = I n p u t F i l e . getNode ( ) ;
447 nNodes = I n p u t F i l e . getNode ( ) . s i z e ( ) ;
448 nAnts = I n t e g e r . p a r s e I n t ( nuOfAnts . g e t Te x t ( ) ) ;
449 n I t e r a t i o n s = I n t e g e r . p a r s e I n t ( n u O f I t e r a t i o n s . g e t Te x t ( ) ) ;
450
451 d o u b l e d e l t a [ ] [ ] = new d o u b l e [ nNodes ] [ nNodes ] ;
452 f o r ( i n t i = 0 ; i < nNodes ; i ++) {
453 f o r ( i n t j = i + 1 ; j < nNodes ; j ++) {
454 double ix , iy , jx , j y ;
455 i x = nodes . g e t ( i ) . x ;
456 i y = nodes . g e t ( i ) . y ;
457 j x = nodes . g e t ( j ) . x ;
458 j y = nodes . g e t ( j ) . y ;
459
460 d e l t a [ j ] [ i ] = d e l t a [ i ] [ j ] = d i s t a n c e ( ix , iy , jx , jy ) ;
461 }
462 }
463 AntGraphFramework g r a p h = new AntGraphFramework ( nodes , delta ) ;
464
465 try {
466 i f ( makeOutput ( ) ) {
467 ObjectOutputStream o u t s = new ObjectOutputStream ( new
468 F i l e O u t p u t S t r e a m ( getOutputPath ( ) + nNodes + ” a n t g r a p h . b i n ” ) ) ;
469 outs . wr i t e O b j e c t ( graph . t o S t r i n g ( ) ) ;
470 outs . c l o s e ( ) ;
471
472
473 F i l e O u t p u t S t r e a m o u t s 1 = new F i l e O u t p u t S t r e a m ( getOutputPath ( ) +
474 nNodes + ” a n t g r a p h . t x t ” ) ;
475
476 f o r ( i n t i = 0 ; i < nNodes ; i ++) {
477 f o r ( i n t j = 0 ; j < nNodes ; j ++) {
478 outs1 . wr i t e ( ( graph . d e l t a ( i , j ) + ” , ” ) . getBytes ( ) ) ;
479 }
480 outs1 . write ( ’\ n ’ ) ;
481 }
482 outs1 . c l o s e ( ) ;
483 }
484
485 if ( makeOutput ( ) ) {
486 P r i n t S t r e a m o u t s 2 = new P r i n t S t r e a m ( new F i l e O u t p u t S t r e a m ( getOutputPath ( ) +
487 nNodes + ”x ” + nAnts + ”x ” + n I t e r a t i o n s + ” r e s u l t s . t x t ” ) ) ;
488 graph . resetTau ( ) ;
489 a n t Co l o n y = new AntColonyForTSP ( graph , nAnts , n I t e r a t i o n s ) ;
490 a n t Co l o n y . s t a r t ( ) ;
491
492 o u t s 2 . p r i n t l n ( 1 + ” , ” + a n t Co l o n y . g e t Be st P a t h L e n g t h ( ) + ” , ” +
493 a n t Co l o n y . g e t L a s t B e s t P a t h I t e r a t i o n ( ) ) ;
96
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
Computer Science, RUC APPENDIX E. CODE
494 outs2 . c l o s e ( ) ;
495 }
496 else {
497 graph . resetTau ( ) ;
498 a n t Co l o n y = new AntColonyForTSP ( graph , nAnts , nIterations );
499 a n t Co l o n y . s t a r t ( ) ;
500 }
501 }
502 catch ( Exception e ) {
503 System . o u t . p r i n t l n ( e + ” no f i l e output ” ) ;
504 }
505
506 c a n v a s J P a n e l . remove ( c a n v a s ) ;
507 i f ( ! doOpt . i s S e l e c t e d ( ) ) {
508 t o u r L e n g t h J L a b e l . s e t T e x t ( S t r i n g . v a l u e O f ( a n t Co l o n y . g e t Be st P a t h L e n g t h ( ) ) ) ;
509 r e s u l t . s e t T e x t ( a n t Co l o n y . g e t Be st To u r ( ) . t o S t r i n g ( ) ) ;
510 c a n v a s = new TSPCanvas ( a n t Co l o n y . g e t Be st To u r N o d e s ( ) ) ;
511 }
512 else {
513 i f ( ! doTwoHOpt . i s S e l e c t e d ( ) ) {
514 twoOpt = new TwoOpt( a n t Co l o n y . nodesTour ( a n t Co l o n y . g e t Be s t To u r ( ) ,
515 a n t Co l o n y . g e t Be st P a t h L e n g t h ( ) ) ;
516 t o u r L e n g t h J L a b e l . s e t T e x t ( S t r i n g . v a l u e O f ( twoOpt . b e s t L e n g t h ) ) ;
517 r e s u l t . s e t T e x t ( twoOpt . p r i n t T o u r ( twoOpt . nodeTour ) ) ;
518 c a n v a s = new TSPCanvas ( twoOpt ) ;
519 }
520 else {
521 i f ( ! doTwoOpt . i s S e l e c t e d ( ) ) {
522 twohOpt = new TwohOpt ( a n t Co l o n y . nodesTour ( a n t Co l o n y . g e t Be st To u r ( ) ,
523 a n t Co l o n y . g e t Be st P a t h L e n g t h ( ) ) ;
524 }
525 else {
526 twoOpt = new TwoOpt( a n t Co l o n y . nodesTour ( a n t Co l o n y . g e t Be st To u r ( ) ,
527 a n t Co l o n y . g e t Be st P a t h L e n g t h ( ) ) ;
528 twohOpt = new TwohOpt ( twoOpt . nodeTour , twoOpt . b e s t L e n g t h ) ;
529 }
530 t o u r L e n g t h J L a b e l . s e t T e x t ( S t r i n g . v a l u e O f ( twohOpt . b e s t L e n g t h ) ) ;
531 r e s u l t . s e t T e x t ( twohOpt . p r i n t T o u r ( twohOpt . nodeTour ) ) ;
532 c a n v a s = new TSPCanvas ( twohOpt ) ;
533 }
534 }
535 }
536
537 /∗∗
538 ∗ C a l c u l a t e s t h e d i s t a n c e between two n o d e s u s i n g p y t a g o r a s .
539 ∗ @param x X−c o o r d i n a t e o f t h e f i r s t node .
540 ∗ @param y Y−c o o r d i n a t e o f t h e f i r s t node .
541 ∗ @param a X−c o o r d i n a t e o f t h e s e c o n d node .
542 ∗ @param b Y−c o o r d i n a t e o f t h e s e c o n d node .
543 ∗ @ r e t u r n The d i s t a n c e a s an i n t .
544 ∗/
545 p r i v at e s t a t i c i n t d i st an c e ( double x , double y , double a , double b) {
546 r e t u r n ( i n t ) ( Math . s q r t ( Math . pow ( x − a , 2 ) + Math . pow ( y − b , 2 ) ) + 0 . 5 ) ;
547 }
548
549 /∗∗
550 ∗ The main method , c a l l i n g t h e c o n s t r u c t o r .
551 ∗ @param a r g s Arguments when r u n n i n g t h e program , n o t u se d .
552 ∗/
553 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
554 new GUI ( ) ;
555 }
556
557 /∗∗
558 ∗ Re tri e ve s the value se t in the beta spinner .
559 ∗ @ r e t u r n The b e t a v a l u e .
560 ∗/
561 p u b l i c s t a t i c double getBeta ( ) {
562 r e t u r n Double . p a r s e D o u b l e ( b e t a S p i n n e r . g e t V a l u e ( ) . t o S t r i n g ( ) ) ;
563 }
564
565 /∗∗
566 ∗ R e t r i e v e s the v a l u e s e t i n the rho sp i n n e r .
567 ∗ @ r e t u r n The r h o v a l u e .
97
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
APPENDIX E. CODE Computer Science, RUC
568 ∗/
569 p u b l i c s t a t i c d o u b l e getRho ( ) {
570 r e t u r n Double . p a r s e D o u b l e ( r h o S p i n n e r . g e t V a l u e ( ) . t o S t r i n g ( ) ) ;
571 }
572
573 /∗∗
574 ∗ R e t r i e v e s t h e v a l u e s e t i n t h e Q0 s p i n n e r .
575 ∗ @ r e t u r n The Q0 v a l u e .
576 ∗/
577 p u b l i c s t a t i c d o u b l e getQ0 ( ) {
578 r e t u r n Double . p a r s e D o u b l e ( q 0 S p i n n e r . g e t V a l u e ( ) . t o S t r i n g ( ) ) ;
579 }
580
581 /∗∗
582 ∗ Re tri e ve s the value se t in the W spinner .
583 ∗ @ r e t u r n The W v a l u e .
584 ∗/
585 p u b l i c s t a t i c i n t getW ( ) {
586 r e t u r n I n t e g e r . p a r s e I n t ( wSpinner . g e t V a l u e ( ) . t o S t r i n g ( ) ) ;
587 }
588
589 /∗∗
590 ∗ Re tri e ve s the value se t in the a l f a spinner .
591 ∗ @ r e t u r n The a l f a v a l u e .
592 ∗/
593 p u b l i c s t a t i c double getAlfa ( ) {
594 r e t u r n Double . p a r s e D o u b l e ( a l f a S p i n n e r . g e t V a l u e ( ) . t o S t r i n g ( ) ) ;
595 }
596
597 /∗∗
598 ∗ Re tri e ve s the value se t in the k s i spinner .
599 ∗ @ r e t u r n The k s i v a l u e .
600 ∗/
601 p u b l i c s t a t i c double getKsi ( ) {
602 r e t u r n Double . p a r s e D o u b l e ( k s i S p i n n e r . g e t V a l u e ( ) . t o S t r i n g ( ) ) ;
603 }
604
605 /∗∗
606 ∗ Checks i f t h e u s e r h a s a c c e p t e d t o g e t i n t e r m e d i a t e r e s u l t s printed
607 ∗ t o f i l e s d e f i n e d i n t h e o u t p u t path .
608 ∗ @ r e t u r n True i f t h e u s e r wants output , e l s e f a l s e .
609 ∗/
610 p u b l i c s t a t i c b o o l e a n makeOutput ( ) {
611 r e t u r n giveOutput . i s S e l e c t e d ( ) ;
612 }
613
614 /∗∗
615 ∗ Gets t h e path t o where t h e u s e r wants h i s files wi t h t h e
616 ∗ intermediate r e s u l t s written .
617 ∗ @ r e t u r n The c h o s e n path .
618 ∗/
619 p u b l i c s t a t i c S t r i n g getOutputPath ( ) {
620 r e t u r n o u t p u t P a t h . g e t Te x t ( ) + ” \ \ ” ;
621 }
622 }
E.7 InputFile.java
1 p a c k a g e IO ;
2
3 i m p o r t Node . Node ;
4 import java . i o . ∗ ;
5 import java . u t i l . ∗ ;
6
7 /∗∗
8 ∗ Th i s c l a s s r e t r i v e s an i n s t a n c e f i l e , and c o n v e r t s t h e d a t a i n t h e
9 ∗ f i l e t o a manageble A r r a y L i s t o f n o d e s .
10 ∗ @author Jakob K i e r k e g a a r d & Jean−Luc Ngassa
11 ∗/
12 public class InputFile {
13 p r i v a t e s t a t i c A r r a y L i s t <Node> n o d e L i s t = new A r r a y L i s t <Node > ( ) ;
98
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
Computer Science, RUC APPENDIX E. CODE
14
15 /∗∗
16 ∗ The c o n s t r u c t o r t a k e s a s t r i n g wi t h t h e name and f i l e n a m e o f t h e
17 ∗ f i l e c o n t a i n i n g t h e i n s t a n c e , c r e a t e s n o d e s b a se d on t h e d a t a
18 ∗ r e t r i v e d , and p u t s t h e n o d e s i n t o an A r r a y L i s t .
19 ∗ @param f i l e The path and f i l e n a m e o f t h e f i l e c o n t a i n g t h e i n s t a n c e .
20 ∗/
21 public InputFile ( String f i l e ) {
22 Scanner scan ;
23 BufferedReader in ;
24 String inputLine ;
25 i n t nodeId ;
26 double x , y ;
27
28 nodeList . c l e ar ( ) ;
29 try {
30 i n = new B u f f e r e d R e a d e r ( new F i l e R e a d e r ( f i l e ) ) ;
31 inputLine = in . readLine ( ) ;
32 w h i l e ( ! i n p u t L i n e . e q u a l s I g n o r e C a s e ( ”NODE COORD SECTION” ) ) {
33 inputLine = in . readLine ( ) ;
34 }
35 inputLine = in . readLine ( ) ;
36 w h i l e ( ! i n p u t L i n e . e q u a l s I g n o r e C a s e ( ”EOF” ) ) {
37 s c a n = new S c a n n e r ( i n p u t L i n e ) ;
38 nodeId = scan . n e x t I n t ( ) − 1 ;
39 x = scan . nextDouble ( ) ;
40 y = scan . nextDouble ( ) ;
41 n o d e L i s t . add ( new Node ( nodeId , x , y ) ) ;
42 inputLine = in . readLine ( ) ;
43 }
44 }
45 catch ( IOException e ) {
46 System . o u t . p r i n t l n ( ” F i l e n o t f o u n d ” + e ) ;
47 }
48 }
49
50 /∗∗
51 ∗ Re tri e ve s the ArrayList created using the i n stan c e file .
52 ∗ @ r e t u r n A r r a y L i s t o f node o b j e c t s .
53 ∗/
54 p u b l i c s t a t i c A r r a y L i s t <Node> getNode ( ) {
55 return nodeList ;
56 }
57 }
E.8 Neighbor.java
1 p a c k a g e Node ;
2
3 /∗∗
4 ∗ A n e i g h b o r i s a node wi t h t h a t node ’ s d i s t a n c e t o t h e node which a
5 ∗ n e i g h b o r l i s t b e l o n g s . I m p l e m e nt s c o m p a r a b l e s o t h a t t h e neighbors
6 ∗ can be s o r t e d by d i s t a n c e .
7 ∗ @author Jakob K i e r k e g a a r d & Jean−Luc Ngassa
8 ∗/
9 p u b l i c c l a s s N e i g h b o r i m p l e m e n t s Comparable<Neighbor > {
10
11 p u b l i c f i n a l Node toNode ;
12 p u b l i c f i n a l double d i st an c e ;
13
14 /∗∗
15 ∗ C r e a t e s a new d i s t a n c e u s i n g a node and d i s t a n c e .
16 ∗ @param toNode The node t h a t h a s t h e d i s t a n c e t o t h e node t o which
17 ∗ the neighbor belongs .
18 ∗ @param d i s t a n c e The d i s t a n c e t o t h e node from t h e node t o which t h e
19 ∗ neighbor belongs .
20 ∗/
21 p u b l i c N e i g h b o r ( Node toNode , d o u b l e d i s t a n c e ) {
22 t h i s . toNode = toNode ;
23 this . distance = distance ;
24 }
99
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
APPENDIX E. CODE Computer Science, RUC
25
26 /∗∗
27 ∗ The implemented compareTo method .
28 ∗ @param o t h e r Another n e i g h b o r .
29 ∗ @ r e t u r n Re t u r n s 1 i f t h i s n e i g h b o r i s f u r t h e r away , 0 i f i t i s
30 ∗ c l o s e r o r 0 i f t h e y a r e a t t h e same d i s t a n c e t o t h e node t h a t h a s
31 ∗ them a s n e i g h b o r s .
32 ∗/
33 p u b l i c i n t compareTo ( N e i g h b o r o t h e r ) {
34 double d i f f = d i st an c e − other . d i st an c e ;
35 r e t u r n d i f f > 0 ? 1 : d i f f == 0 ? 0 : −1;
36 }
37
38 /∗∗
39 ∗ Re t u r n s a s t r i n g r e p r e s e n t a t i o n o f t h e n e i g h b o r .
40 ∗ @ r e t u r n The s t r i n g r e p r e s e n t a t i o n o f t h e n e i g h b o r .
41 ∗/
42 public String toString () {
43 r e t u r n ” Node ID : ” + ( toNode . nodeID ) + ”\ t D i s t a n c e : ” + d i s t a n c e ;
44 }
45 }
E.9 Node.java
1 p a c k a g e Node ;
2
3 import java . u t i l . ∗ ;
4
5 /∗∗
6 ∗ The Node c l a s s h a n d l e s t h e n o d e s i n t h e program .
7 ∗ A node c o n t a i n s an ID , x and y c o o r d i n a t e s , and a p r i o r i t y queue o f
8 ∗ i t s neighbors .
9 ∗ @author Jakob K i e r k e g a a r d & Jean−Luc Ngassa
10 ∗/
11 p u b l i c c l a s s Node {
12
13 public f i n a l i n t nodeID ;
14 public f i n a l double x ;
15 public f i n a l double y ;
16 public P r i o r i t y Q u e u e <Neighbor > n e i g h b o r s = new P r i o r i t y Q u e u e <Neighbor > ( ) ;
17
18 /∗∗
19 ∗ The c o n s t r u c t o r c r e a t e s a new node b a se d on t h e ID and c o o r d i n a t e s
20 ∗ found i n the parameters .
21 ∗ @param nodeID The node ’ s ID .
22 ∗ @param x The node ’ s x c o o r d i n a t e .
23 ∗ @param y The node ’ s y c o o r d i n a t e .
24 ∗/
25 p u b l i c Node ( i n t nodeID , d o u b l e x , d o u b l e y ) {
26 t h i s . nodeID = nodeID ;
27 this .x = x;
28 this .y = y;
29 }
30
31 /∗∗
32 ∗ C a l c u l a t e s t h e d i s t a n c e between t h i s node and a n o t h e r node u s i n g
33 ∗ pytagorass
34 ∗ @param o t h e r The node t o which t h e d i s t a n c e i s c a l c u l a t e d .
35 ∗ @ r e t u r n A d i s t a n c e o f t h e t y p e i n t between t h e two n o d e s .
36 ∗/
37 p u b l i c i n t d i s t a n c e ( Node o t h e r ) {
38 r e t u r n ( i n t ) ( Math . s q r t ( Math . pow ( t h i s . x − o t h e r . x , 2 ) +
39 Math . pow ( t h i s . y − o t h e r . y , 2 ) ) + 0 . 5 ) ;
40 }
41
42 /∗∗
43 ∗ C r e a t e s a p r i o r i t y queue o f n e i g h b o r s , s o r t i n g them by d i s t a n c e from
44 ∗ low t o h i g h . Puts i n a l l o f t h e n o d e s from t h e p a r a m e t e r i n t o t h e
45 ∗ neighbor l i s t except f o r i t s e l f .
46 ∗ @param t h e N o d e s The l i s t o f n o d e s i n t h e i n s t a n c e .
47 ∗/
100
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
Computer Science, RUC APPENDIX E. CODE
48 p u b l i c v o i d s e t N e i g h b o r s ( L i n k e d L i s t <Node> t h e N o d e s ) {
49 A r r a y L i s t <Neighbor > n o d e s L i s t = new A r r a y L i s t <Neighbor > ( ) ;
50 f o r ( Node node : t h e N o d e s ) {
51 i f ( ! node . e q u a l s ( t h i s ) )
52 n o d e s L i s t . add ( new N e i g h b o r ( node , d i s t a n c e ( node ) ) ) ;
53 }
54 Col le ct i o ns . sor t ( nodesList ) ;
55 n e i g h b o r s = new P r i o r i t y Q u e u e <Neighbor >( n o d e s L i s t ) ;
56 }
57
58 /∗∗
59 ∗ Re t u r n s a s t r i n g r e p r e s e n t a t i o n o f t h e node .
60 ∗ @ r e t u r n The s t r i n g r e p r e s e n t a t i o n o f t h e node .
61 ∗/
62 public String toString () {
63 r e t u r n nodeID + ” , x : ” + x + ” , y : ” + y ;
64 }
65 }
E.10 TSPCanvas.java
1 p a c k a g e Main ;
2
3 import j a v a . awt . ∗ ;
4 import java . u t i l . ∗ ;
5 import tsp . optimization . ∗ ;
6 import Node . Node ;
7
8 /∗∗
9 ∗ Th i s i s o u r p e r s o n a l i z e d v e r s i o n o f a c a n v a s , which i m p l e m e n t s
10 ∗ f u n c t i o n a l i t y t h a t e n a b l e s i t t o p r i n t a t o u r ; e d g e s and n o d e s .
11 ∗ @author Jakob K i e r k e g a a r d & Jean−Luc Ngassa
12 ∗/
13 p u b l i c c l a s s TSPCanvas e x t e n d s Canvas {
14
15 p r i v a t e L i n k e d L i s t <Node> t o u r ;
16
17 private int length = 0;
18 p r i v a t e i n t greatestX , greatestY , smallestX , smallestY ;
19 p r i v at e double s c a l e = 0 . 0 ;
20 p r i v a t e i n t [ ] xCoords ;
21 p r i v a t e i n t [ ] yCoords ;
22
23 /∗∗
24 ∗ C r e a t e s an empty TSPCanvas wi t h a w h i t e b a c k g r o u n d .
25 ∗/
26 p u b l i c TSPCanvas ( ) {
27 t h i s . se t Ba c k g r o u n d ( C o l o r .WHITE ) ;
28 }
29
30 /∗∗
31 ∗ C r e a t e s a TSPCanvas b a se d on a L i n k e d L i s t o f n o d e s which r e p r e s e n t s
32 ∗ t h e t o u r . The s i z e i s d e p e n d e n t on t h e s i z e o f t h e window s i z e d e f i n e d
33 ∗ i n t h e GUI .
34 ∗ @param t The t o u r a s a L i n k e d L i s t
35 ∗/
36 p u b l i c TSPCanvas ( L i n k e d L i s t <Node> t ) {
37 t h i s . se t Ba c k g r o u n d ( C o l o r .WHITE ) ;
38 t h i s . tour = t ;
39 t h i s . s e t S i z e ( GUI .CANVAS WIDTH, GUI . CANVAS HEIGHT ) ;
40 length = tour . s i z e ( ) ;
41 scaleTour ( ) ;
42 }
43
44 /∗∗
45 ∗ The c o n s t r u c t o r t a k e s a TwoOpt o b j e c t , and t a k e s i t s tour ob j e c t
46 ∗ and p a s s e s i t on t o t h e c l a s s ’ o t h e r c o n s t r u c t o r .
47 ∗ @param t The TwoOpt o b j e c t .
48 ∗/
49 p u b l i c TSPCanvas ( TwoOpt t ) {
50 t h i s ( t . nodeTour ) ;
101
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
APPENDIX E. CODE Computer Science, RUC
51 }
52
53 /∗∗
54 ∗ The c o n s t r u c t o r t a k e s a TwohOpt o b j e c t , and t a k e s its tour ob j e c t
55 ∗ and p a s s e s i t on t o t h e c l a s s ’ o t h e r c o n s t r u c t o r .
56 ∗ @param t The TwohOpt o b j e c t .
57 ∗/
58 p u b l i c TSPCanvas ( TwohOpt t ) {
59 t h i s ( t . nodeTour ) ;
60 }
61
62 /∗∗
63 ∗ The p a i n t method o f t h e c a n v a s . I t p a i n t s t h e n o d e s a s s m a l l r e d
64 ∗ c i r c l e s , and t h e e d g e s a r e b l a c k l i n e s between them .
65 ∗ @param g The G r a p h i c s o b j e c t .
66 ∗/
67 p u b l i c void paint ( Graphics g ) {
68 g . s e t C o l o r ( C o l o r .RED ) ;
69 f o r ( i n t i = 0 ; i < l e n g t h ; i ++)
70 g . drawOval ( xCoords [ i ] − 2 , yCoords [ i ] − 2 , 4 , 4 ) ;
71 g . s e t C o l o r ( C o l o r .BLACK ) ;
72 g . d r a w P o l y l i n e ( xCoords , yCoords , l e n g t h ) ;
73 g . drawLine ( xCoords [ 0 ] , yCoords [ 0 ] , xCoords [ l e n g t h − 1 ] , yCoords [ l e n g t h − 1 ] ) ;
74 }
75
76 /∗∗
77 ∗ To make s u r e t h a t t h e g r a p h i c a l r e p r e s e n t a t i o n o f t h e t o u r f i l l s
78 ∗ o u t t h e c a n v a s ’ s p a c e ( and n o t j u s t s i t s i n a c o r n e r ) , we r e g u l a t e
79 ∗ t h e nodes ’ c o o r d i n a t e s , s o t h a t we e n l a r g e o r s h r i n k t h e t o u r s o
80 ∗ that i t f i t s to a l l s i d e s .
81 ∗ We do n o t s t r e t c h t h e t o u r .
82 ∗/
83 p r i v at e void scaleTour ( ) {
84 xCoords = new i n t [ l e n g t h ] ;
85 yCoords = new i n t [ l e n g t h ] ;
86
87 f o r ( i n t i = 0 ; i < l e n g t h ; i ++) {
88 xCoords [ i ] = ( i n t ) ( t o u r . g e t ( i ) . x ) ;
89 i f ( i == 0 )
90 g r e a t e s t X = s m a l l e s t X = xCoords [ i ] ;
91 i f ( xCoords [ i ] > g r e a t e s t X )
92 g r e a t e s t X = xCoords [ i ] ;
93 i f ( xCoords [ i ] < s m a l l e s t X )
94 s m a l l e s t X = xCoords [ i ] ;
95 yCoords [ i ] = ( i n t ) ( t o u r . g e t ( i ) . y ) ;
96 i f ( i == 0 )
97 g r e a t e s t Y = s m a l l e s t Y = yCoords [ i ] ;
98 i f ( yCoords [ i ] > g r e a t e s t Y )
99 g r e a t e s t Y = yCoords [ i ] ;
100 i f ( yCoords [ i ] < s m a l l e s t Y )
101 s m a l l e s t Y = yCoords [ i ] ;
102 }
103 adjustToCoordinates ( ) ;
104
105 d o u b l e s c a l e X = ( d o u b l e ) GUI . CANVAS WIDTH / ( d o u b l e ) g r e a t e s t X ;
106 d o u b l e s c a l e Y = ( d o u b l e ) GUI . CANVAS HEIGHT / ( d o u b l e ) g r e a t e s t Y ;
107
108 s c a l e = Math . min ( s c a l e X , s c a l e Y ) ;
109
110 adjustToScale ( ) ;
111 }
112
113 /∗∗
114 ∗ The s c a l e between t h e l a r g e s t x−c o o r d i n a t e and t h e wi d t h o f t h e
115 ∗ c a n v a s o r between t h e l a r g e s t y−c o o r d i n a t e and t h e h e i g h t o f t h e
116 ∗ c a n v a s ( d e p e n d i n g on which i s t h e s m a l l e s t ) i s a p p l i e d t o t h e nodes ’
117 ∗ coordinates , e n l a r g i n g / sh r i n k i n g the tour so i t f i t s .
118 ∗/
119 p r i v at e void adjustToScale ( ) {
120 f o r ( i n t i = 0 ; i < l e n g t h ; i ++) {
121 xCoords [ i ] = ( i n t ) ( ( xCoords [ i ] ∗ s c a l e ) + 0 . 5 ) ;
122 yCoords [ i ] = ( i n t ) ( ( yCoords [ i ] ∗ s c a l e ) + 0 . 5 ) ;
123 }
124 }
102
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
Computer Science, RUC APPENDIX E. CODE
125
126 /∗∗
127 ∗ Be c a u se o u r c a n v a s ’ l o w e s t v a l u e i n t h e c o o r d i n a t e sy st e m i s 0 , we
128 ∗ have t o r e g u l a t e t h e c o o r d i n a t e s , i f t h e r e a r e any b e l o w 0 . Th i s i s
129 ∗ s i m p l y done by a d d i n g t h e l o w e s t X t o a l l t h e x−c o o r d i n a t e s and
130 ∗ s i m i l a r wi t h t h e y c o o r d i n a t e s .
131 ∗ 5 i s added t o t h e c o o r d i n a t e s s o t h a t t h e r e i s a l i t t l e f r e e s p a c e
132 ∗ between t h e g r a p h i c a l r e p r e s e n t a t i o n and t h e c a n v a s ’ b o r d e r .
133 ∗/
134 p r i v a t e void adjustToCoordinates ( ) {
135 greatestX = greatestX − smallestX + 5;
136 greatestY = greatestY − smallestY + 5;
137 f o r ( i n t i = 0 ; i < l e n g t h ; i ++) {
138 xCoords [ i ] = xCoords [ i ] − s m a l l e s t X + 5 ;
139 yCoords [ i ] = yCoords [ i ] − s m a l l e s t Y + 5 ;
140 }
141 }
142 }
E.11 TSPFileFilter.java
1 /∗∗
2 ∗ Th i s c l a s s i s h e a v i l y i n s p i r e d by FileChooserDemo2 . j a v a
3 ∗ and E x a m p l e F i l e F i l t e r . j a v a t h a t can be f o u n d on Sun ’ s homepage .
4 ∗/
5
6 p a c k a g e Main ;
7
8 import java . i o . F i l e ;
9 i m p o r t j a v a x . swi n g . f i l e c h o o s e r . ∗ ;
10
11 /∗∗
12 ∗ Th i s c l a s s c r e a t e s a f i l e f i l t e r , which e n a b l e s us t o l i m i t what
13 ∗ f i l e t y p e s a e t o be s e e n when t h e u s e r wants t o f i n d a . t s p f i l e
14 ∗ when r u n n i n g t h e program .
15 ∗ @author Jakob K i e r k e g a a r d & Jean−Luc Ngassa
16 ∗/
17 p u b l i c f i n a l c l a s s TSPFileFilter extends F i l e F i l t e r {
18
19 /∗∗
20 ∗ The method g e t s t h e e x t e n s i o n o f t h e f i l e i n q u e s t i o n t o c h e c k i f
21 ∗ i t s h o u l d be v i s i b l e i n t h e f i l e c h o o s e r which a p p l i e s t h e f i l e
22 ∗ filter .
23 ∗ @param f i l e The path and f i l e n a m e o f t h e f i l e i n q u e s t i o n .
24 ∗ @ r e t u r n Re t u r n s t h e e x t e n s i o n o f t h e f i l e a s a s t r i n g .
25 ∗/
26 private s t a t i c String getExtension ( F il e f i l e ) {
27 i f ( f i l e != n u l l ) {
28 S t r i n g f i l e n a m e = f i l e . getName ( ) ;
29 int i = filename . lastIndexOf ( ” . ” ) ;
30 i f ( i > 0 && i < f i l e n a m e . l e n g t h ( ) − 1 )
31 r e t u r n f i l e n a m e . s u b s t r i n g ( i + 1 ) . toLowerCase ( ) ;
32 }
33 return null ;
34 }
35
36 /∗∗
37 ∗ Checks i f t h e f i l e p a s s e d a s a p a r a m e t e r s h o u l d be v i s i b l e i n t h e
38 ∗ f i l e c h o o s e r . I t a l s o l e t s f o l d e r s i n t h e f i l e c h o o s e r be v i s i b l e .
39 ∗ @param f i l e The path and f i l e n a m e o f t h e f i l e i n q u e s t i o n .
40 ∗ @ r e t u r n Re t u r n s t r u e i f i t s h o u l d be v i s i b l e i n t h e f i l e c h o o s e r .
41 ∗/
42 p u b l i c f i n a l boolean accept ( F i l e f i l e ) {
43 i f ( f i l e . isDirectory ())
44 return true ;
45 i f ( g e t E x t e n s i o n ( f i l e ) != n u l l ) {
46 i f ( getExtension ( f i l e ) . equals (” tsp ”))
47 return true ;
48 }
49 return f a l s e ;
50 }
103
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
APPENDIX E. CODE Computer Science, RUC
51
52 /∗∗
53 ∗ Gets t h e d e s c r i p t i o n o f what f i l e s a r e v i s i b l e .
54 ∗ @ r e t u r n The d e s c r i p t i o n o f what f i l e s a r e v i s i b l e .
55 ∗/
56 public f in al String getDescription () {
57 r e t u r n ”TSP f i l e s ” ;
58 }
59 }
E.12 TwohOpt.java
1 package t s p . o p t i m i z a t i o n ;
2
3 import java . u t i l . ∗ ;
4
5 i m p o r t Node . ∗ ;
6
7 /∗∗
8 ∗ Th i s c l a s s t a k e s a t o u r and d o e s a 2 −o p t l o c a l s e a r c h on i t .
9 ∗ @author Jakob K i e r k e g a a r d & Jean−Luc Ngassa
10 ∗/
11 p u b l i c c l a s s TwohOpt {
12
13 p u b l i c double bestLength ;
14 p r i v a t e Node t1 , t 3 ;
15 p u b l i c L i n k e d L i s t <Node> nodeTour = new L i n k e d L i s t <Node > ( ) ;
16
17 /∗∗
18 ∗ The c o n s t r u c t o r i n s t a n t i a t e s t h e d i s t a n c e o f t h e t o u r and t h e t o u r
19 ∗ itself .
20 ∗ @param t o u r The t o u r t h a t n e e d s o p t i m i z i n g .
21 ∗ @param b e s t L e n g t h The d i s t a n c e o f t h e t o u r t h a t n e e d s o p t i m i z i n g .
22 ∗/
23 p u b l i c TwohOpt ( L i n k e d L i s t <Node> t o u r , d o u b l e b e s t L e n g t h ) {
24 t h i s . bestLength = bestLength ;
25 t h i s . nodeTour = t o u r ;
26 twohOpt ( ) ;
27 }
28
29 /∗∗
30 ∗ Gets t h e node b e f o r e a s p e c i f i c node . I f t h e s p e c i f i c node i s i n
31 ∗ t h e bottom o f t h e l i s t , i t g e t s t h e l a s t i t e m i n t h e l i s t , e l s e i t
32 ∗ g e t s t h e node a t t h e i n d e x b e f o r e .
33 ∗ @param curNode The node t o which t h e f o u n d p r e v i o u s node b e l o n g s .
34 ∗ @ r e t u r n The p r e v i o u s node .
35 ∗/
36 p r i v a t e Node p r e d ( Node curNode ) {
37 i f ( nodeTour . i n d e x O f ( curNode ) == 0 )
38 r e t u r n nodeTour . g e t L a s t ( ) ;
39 else {
40 r e t u r n nodeTour . g e t ( nodeTour . i n d e x O f ( curNode ) − 1 ) ;
41 }
42 }
43
44 /∗∗
45 ∗ Gets t h e node a f t e r a s p e c i f i c node . Gets t h e node i n t h e i n d e x
46 ∗ a f t e r , and t h e modulo t a k e s c a r e o f t h e s c e n a r i o where t h e
47 ∗ s p e c i f i e d node i s i n t h e end o f t h e l i s t .
48 ∗ @param curNode The node t o which t h e f o u n d s u c c e e d i n g node b e l o n g s .
49 ∗ @ r e t u r n The s u c c e e d i n g node .
50 ∗/
51 p r i v a t e Node s u c ( Node curNode ) {
52 r e t u r n nodeTour . g e t ( ( nodeTour . i n d e x O f ( curNode ) + 1 ) % nodeTour . s i z e ( ) ) ;
53 }
54
55 /∗∗
56 ∗ The swap i s s i m p l y t h e movement o f a node ( T3 ) from any p l a c e i n
57 ∗ t h e t o u r an i n between T1 and T2 . When u s i n g a L i n k e d L i s t a s we a r e ,
58 ∗ t h i s i s s i m p l y done by r e m o v i n g i t from one p l a c e , and i n s e r t i n g i t
59 ∗ i n t o t h e i n d e x a f t e r t h e i n d e x o f T1 .
104
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
Computer Science, RUC APPENDIX E. CODE
60 ∗/
61 p r i v a t e v o i d swap ( ) {
62 nodeTour . remove ( t 3 ) ;
63 nodeTour . add ( nodeTour . i n d e x O f ( t 1 ) + 1 , t 3 ) ;
64 }
65
66 /∗∗
67 ∗ Gi v e s a s t r i n g r e p r e s e n t a t i o n o f t h e t o u r .
68 ∗ @param t o u r The t o u r a s a L i n k e d L i s t .
69 ∗ @ r e t u r n The s t r i n g r e p r e s e n t a t i o n o f t h e t o u r .
70 ∗/
71 p u b l i c S t r i n g p r i n t T o u r ( L i n k e d L i s t <Node> t o u r ) {
72 S t r i n g output = ” [ ” ;
73 f o r ( Node n : t o u r ) {
74 o u t p u t += ” ” + n . nodeID + ” , ” ;
75 }
76 o u t p u t += ” ] ” ;
77 r e t u r n output ;
78 }
79
80 /∗∗
81 ∗ The method g o e s t h r o u g h t h e e n t i r e t o u r t o l o o k f o r any f e a s i b l e
82 ∗ swaps . I t g e t s a node T1 , and l o o k s t h r o u g h i t s n e i g h b o r s t o s e e
83 ∗ i f t h e r e a r e any a d v a n t a g o u s swaps .
84 ∗ As t h e t o u r c h a n g e s a f t e r e a c h swap , we l e t i t s t a r t o v e r e v e r y
85 ∗ t i m e a swap i s made t o make s u r e we g e t a l l p o s s i b l e swaps .
86 ∗/
87 p r i v a t e v o i d twohOpt ( ) {
88 double gain ;
89 b o o l e a n improved ;
90 Node t2 , t4 , t 5 ;
91
92 Node f i r s t N o d e = t 1 = nodeTour . g e t ( 0 ) ;
93 do
94 t 1 . s e t N e i g h b o r s ( nodeTour ) ;
95 w h i l e ( ( t 1 = s u c ( t 1 ) ) != f i r s t N o d e ) ;
96 do {
97 improved = f a l s e ;
98 t1 = f i rstNod e ;
99 do {
100 t2 = suc ( t1 ) ;
101 f o r ( Neighbor n : t1 . n e i g h b o r s ) {
102 t 3 = n . toNode ;
103 i f ( t 3 != t 2 ) {
104 t4 = pred ( t3 ) ;
105 t5 = suc ( t3 ) ;
106 i f ( ( t 4 != t 1 ) && ( t 5 != t 2 ) && ( t 1 != t 5 ) && ( t 2 != t 4 ) ) {
107 gain = ( t1 . d i st an c e ( t2 ) + t4 . d i st an c e ( t3 ) + t3 . d i st an c e ( t5 ) ) −
108 ( t1 . d i stan c e ( t3 ) + t3 . d i stan c e ( t2 ) + t4 . d i stan c e ( t5 ) ) ;
109 i f ( gain > 0) {
110 b e s t L e n g t h −= g a i n ;
111 swap ( ) ;
112
113 improved = t r u e ;
114 break ;
115 }
116 }
117 }
118 }
119 t1 = suc ( t1 ) ;
120 }
121 w h i l e ( t 1 != f i r s t N o d e ) ;
122 }
123 w h i l e ( improved ) ;
124 }
125 }
E.13 TwoOpt.java
1 package t s p . o p t i m i z a t i o n ;
2
105
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
APPENDIX E. CODE Computer Science, RUC
3 import java . u t i l . ∗ ;
4 i m p o r t Node . ∗ ;
5
6 /∗∗
7 ∗ Th i s c l a s s t a k e s a t o u r and d o e s a 2−o p t l o c a l s e a r c h on i t .
8 ∗ @author Jakob K i e r k e g a a r d & Jean−Luc Ngassa
9 ∗/
10 p u b l i c c l a s s TwoOpt {
11
12 p u b l i c double bestLength ;
13 p r i v a t e Node t1 , t2 , t3 , t 4 ;
14 p u b l i c L i n k e d L i s t <Node> nodeTour = new L i n k e d L i s t <Node > ( ) ;
15 p r i v a t e f i n a l L i n k e d L i s t <Node> temp1 = new L i n k e d L i s t <Node > ( ) ;
16 p r i v a t e f i n a l L i n k e d L i s t <Node> temp2 = new L i n k e d L i s t <Node > ( ) ;
17
18 /∗∗
19 ∗ The c o n s t r u c t o r i n s t a n t i a t e s t h e d i s t a n c e o f t h e t o u r and t h e t o u r
20 ∗ itself .
21 ∗ @param t o u r The t o u r t h a t n e e d s o p t i m i z i n g .
22 ∗ @param b e s t L e n g t h The d i s t a n c e o f t h e t o u r t h a t n e e d s o p t i m i z i n g .
23 ∗/
24 p u b l i c TwoOpt( L i n k e d L i s t <Node> t o u r , d o u b l e b e s t L e n g t h ) {
25 t h i s . bestLength = bestLength ;
26 t h i s . nodeTour = t o u r ;
27
28 twoOpt ( ) ;
29 }
30
31 /∗∗
32 ∗ Gets t h e node b e f o r e a s p e c i f i c node . I f t h e s p e c i f i c node i s i n
33 ∗ t h e bottom o f t h e l i s t , i t g e t s t h e l a s t i t e m i n t h e l i s t , e l s e i t
34 ∗ g e t s t h e node a t t h e i n d e x b e f o r e .
35 ∗ @param curNode The node t o which t h e f o u n d p r e v i o u s node b e l o n g s .
36 ∗ @ r e t u r n The p r e v i o u s node .
37 ∗/
38 p r i v a t e Node p r e d ( Node curNode ) {
39 i f ( nodeTour . i n d e x O f ( curNode ) == 0 )
40 r e t u r n nodeTour . g e t L a s t ( ) ;
41 else {
42 r e t u r n nodeTour . g e t ( nodeTour . i n d e x O f ( curNode ) − 1 ) ;
43 }
44 }
45
46 /∗∗
47 ∗ Gets t h e node a f t e r a s p e c i f i c node . Gets t h e node i n t h e i n d e x
48 ∗ a f t e r , and t h e modulo t a k e s c a r e o f t h e s c e n a r i o where t h e
49 ∗ s p e c i f i e d node i s i n t h e end o f t h e l i s t .
50 ∗ @param curNode The node t o which t h e f o u n d s u c c e e d i n g node b e l o n g s .
51 ∗ @ r e t u r n The s u c c e e d i n g node .
52 ∗/
53 p r i v a t e Node s u c ( Node curNode ) {
54 r e t u r n nodeTour . g e t ( ( nodeTour . i n d e x O f ( curNode ) + 1 ) % nodeTour . s i z e ( ) ) ;
55 }
56
57 /∗∗
58 ∗ R e v e r s e s the o r d e r o f nodes i n a L i n k e d L i s t .
59 ∗ @param t o u r The l i s t o f n o d e s t h a t n e e d s t o be r e v e r s e d .
60 ∗ @ r e t u r n The r e v e r s e d l i s t .
61 ∗/
62 p r i v a t e L i n k e d L i s t <Node> r e v e r s e T o u r ( L i n k e d L i s t <Node> t o u r ) {
63 L i n k e d L i s t <Node> temp = new L i n k e d L i s t <Node > ( ) ;
64 f o r ( i n t i = t o u r . s i z e ( ) − 1 ; i >= 0 ; i −−) {
65 temp . add ( t o u r . g e t ( i ) ) ;
66 }
67 r e t u r n temp ;
68 }
69
70 /∗∗
71 ∗ The method p e r f o r m s a swap on t h e t o u r when t h e a l g o r i t h m h a s
72 ∗ f o u n d a p o s s i b l e swap .
73 ∗ I t h a s t o t a k e i n t o c o n s i d e r a t i o n i f T2 i s b e f o r e o r a f t e r T4
74 ∗ and i f T1 i s b e f o r e o r a f t e r T3 s o i t knows wh e t h e r t o i n s e r t
75 ∗ them backwards o r f o r w a r d t o g i v e t h e c o r r e c t r e s u l t i n t h e end .
76 ∗/
106
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
Computer Science, RUC APPENDIX E. CODE
77 p r i v a t e v o i d swap ( ) {
78 temp1 . c l e a r ( ) ;
79
80 if ( nodeTour . i n d e x O f ( t 4 ) < nodeTour . i n d e x O f ( t 2 ) ) {
81 i n t i = nodeTour . i n d e x O f ( t 2 ) ;
82 do {
83 i f ( i == nodeTour . s i z e ( ) ) {
84 i = 0;
85 }
86 temp1 . add ( nodeTour . g e t ( i % nodeTour . s i z e ( ) ) ) ;
87 i ++;
88 }
89 w h i l e ( i != nodeTour . i n d e x O f ( t 4 ) ) ;
90 temp1 . add ( t 4 ) ;
91 }
92 else {
93 f o r ( i n t i = nodeTour . i n d e x O f ( t 2 ) ; i <= nodeTour . i n d e x O f ( t 4 ) ; i ++) {
94 temp1 . add ( nodeTour . g e t ( i ) ) ;
95 }
96 }
97
98 temp2 . c l e a r ( ) ;
99 i f ( nodeTour . i n d e x O f ( t 3 ) > nodeTour . i n d e x O f ( t 1 ) ) {
100 i n t j = nodeTour . i n d e x O f ( t 3 ) ;
101 do {
102 temp2 . add ( nodeTour . g e t ( j ) ) ;
103 j = ( j + 1 ) % nodeTour . s i z e ( ) ;
104 }
105 w h i l e ( j != nodeTour . i n d e x O f ( t 1 ) ) ;
106 temp2 . add ( t 1 ) ;
107 }
108 else {
109 f o r ( i n t j = nodeTour . i n d e x O f ( t 3 ) ; j <= nodeTour . i n d e x O f ( t 1 ) ; j ++) {
110 temp2 . add ( nodeTour . g e t ( j ) ) ;
111 }
112 }
113 nodeTour . c l e a r ( ) ;
114 nodeTour . a d d A l l ( r e v e r s e T o u r ( temp1 ) ) ;
115 nodeTour . a d d A l l ( temp2 ) ;
116 }
117
118 /∗∗
119 ∗ Gi v e s a s t r i n g r e p r e s e n t a t i o n o f t h e t o u r .
120 ∗ @param t o u r The t o u r a s a L i n k e d L i s t .
121 ∗ @ r e t u r n The s t r i n g r e p r e s e n t a t i o n o f t h e t o u r .
122 ∗/
123 p u b l i c S t r i n g p r i n t T o u r ( L i n k e d L i s t <Node> t o u r ) {
124 S t r i n g output = ” [ ” ;
125 f o r ( Node n : t o u r ) {
126 o u t p u t += ” ” + n . nodeID + ” , ” ;
127 }
128 o u t p u t += ” ] ” ;
129 r e t u r n output ;
130 }
131
132 /∗∗
133 ∗ Th i s method g o e s t h r o u g h t h e l i s t o f n o d e s t o l o o k f o r any f e a s i b l e
134 ∗ swaps . I t g e t s t h e T1 and T2 nodes , and g o e s t h r o u g h a l l t h e n e i g h b o r s
135 ∗ o f T2 t o f i n d a p o s s i b l e swap . I f t h e g a i n i s p o s i t i v e , a swap
136 ∗ i s done .
137 ∗ As t h e t o u r c h a n g e s r a d i c a l l y a f t e r e a c h swap , t h e e n t i r e t o u r i s
138 ∗ c h e c k e d from t h e s t a r t a g a i n a f t e r e a c h swap .
139 ∗/
140 p r i v a t e v o i d twoOpt ( ) {
141 b o o l e a n improved ;
142 double gain ;
143 Node f i r s t N o d e = t 1 = nodeTour . g e t ( 0 ) ;
144 do
145 t 1 . s e t N e i g h b o r s ( nodeTour ) ;
146 w h i l e ( ( t 1 = s u c ( t 1 ) ) != f i r s t N o d e ) ;
147 do {
148 improved = f a l s e ;
149 t1 = f i rstNod e ;
150
107
Jakob Kierkegaard & Jean-Luc Ngassa
2nd module project
APPENDIX E. CODE Computer Science, RUC
151 do {
152 t2 = suc ( t1 ) ;
153 i n t d i st 12 = t1 . d i st an c e ( t2 ) ;
154 f o r ( Neighbor n : t2 . n e i g h b o r s ) {
155 t 3 = n . toNode ;
156 t4 = pred ( t3 ) ;
157 gain = ( d i st 1 2 + t3 . d i st a n c e ( t4 ) ) − ( t1 . d i st an c e ( t4 ) + t2 . d i st an c e ( t3 ) ) ;
158 i f ( gain > 0) {
159 b e s t L e n g t h −= g a i n ;
160 swap ( ) ;
161 improved = t r u e ;
162 break ;
163 }
164 }
165 t1 = suc ( t1 ) ;
166 }
167 w h i l e ( t 1 != f i r s t N o d e ) ;
168 }
169 w h i l e ( improved ) ;
170 }
171 }
108