Aleph-w  1.5a.2
Biblioteca general de algoritmos y estructuras de datos
 Todo Clases Archivos Funciones Variables 'typedefs' Enumeraciones Amigas Grupos Páginas
tpl_ant.H
1 # ifndef TPL_ANT_H
2 # define TPL_ANT_H
3 
4 # include <gsl/gsl_rng.h>
5 # include <gsl/gsl_randist.h>
6 
7 # include <limits>
8 
9 # include <fstream>
10 
11 # include <tpl_dynArray.H>
12 # include <tpl_graph_utils.H>
13 # include <tpl_agent_graph.H>
14 
15 
16 extern bool verbose;
17 
18 using namespace Aleph;
19 
20 namespace Aleph {
21 
22 
23 extern double initial_life; // = 100000
24 
25 extern double feromone_importance; // = 2.5
26 
27 extern double distance_importance; // = 1;
28 
29 extern double food_importance; // = 4;
30 
31 extern double & alpha; // = feromone_importance;
32 extern double & beta; // = distance_importance;
33 extern double & chi; // = food_importance;
34 
35 extern double Q; // = 10000; // constante de feromona
36 
37 extern double K; // = 1; // constante de consumo de energía en transito
38 
39 extern double L; // = 1; // constante de pérdida de vida
40 
41 extern double F; // = 1; // constante de consumo de alimento
42 
43 extern double min_dist; // = 10;
44 extern double max_dist; // = 1000;
45 
46 
47 struct Ant_Node : public Agent_Node<Empty_Class>
48 {
49  double food;
50 
51  int num;
52 
53  Ant_Node() : food(0), num(-1)
54  {
55  // empty
56  }
57 
58  Ant_Node(const double & __food)
59  : food(__food), num(-1)
60  {
61  // empty
62  }
63 
64  Ant_Node(const Empty_Class&) : num(-1) { /* Empty */ }
65 
66  Ant_Node(Ant_Node * p)
67  : food(p->food), num(p->num)
68  {
69  // empty
70  }
71 };
72 
73 
74 struct Ant_Arc : public Agent_Arc<Empty_Class>
75 {
76  double feromone_level;
77 
78  double distance;
79 
80  Ant_Arc() : feromone_level(0), distance(0) { /* empty */ }
81 
82  Ant_Arc(Ant_Node * src, Ant_Node * tgt)
83  : Agent_Arc <Empty_Class> (src, tgt), feromone_level(0), distance(0)
84  {
85  // empty
86  }
87 };
88 
89 
90 struct Ant_Graph;
91 
92 
93 struct Ant : public Walking_Agent<Empty_Class>
94 {
95  Ant() { /* empty */ }
96 
97  // Ant(Transit transit)
98  // : Walking_Agent<Empty_Class>(Empty_Class(), transit)
99  // {
100  // // empty
101  // }
102 
103  // return true si hormiga debe continuar; false de lo contrario
104  virtual bool select_path(void * /* src_node */,
105  void *& /* tgt_node */,
106  void *& /* ant_arc */)
107  {
108  EXIT("ERROR: must not be called");
109 
110  return true;
111  }
112 
113  virtual bool walk(Ant_Graph * /* g */,
114  void * /* tgt_node */,
115  void * /* ant_arc */)
116  {
117  EXIT("ERROR: must not be called");
118 
119  return false;
120  }
121 };
122 
123 
124 struct Ant_Graph : public Agent_Graph<List_Graph, Ant_Node, Ant_Arc, Ant>
125 {
126  typedef Ant_Graph::Node Node;
127 
128  typedef Ant_Graph::Arc Arc;
129 
130  pthread_mutex_t bit_mutex;
131 
132  BitArray nodes;
133 
134  Ant_Graph(const size_t & num_threads = 1)
135  : Agent_Graph<List_Graph, Ant_Node, Ant_Arc, Ant> (num_threads), nodes(NULL)
136  {
137  init_mutex(bit_mutex);
138  }
139 
140  ~Ant_Graph()
141  {
142  destroy_mutex(bit_mutex);
143  }
144 
145  Ant * insert_ant(Ant * p)
146  {
147 
148  return p;
149  }
150 
151  // subclases para cargar y guardar el grafo en disco
152  struct Save_Node
153  {
154  void operator () (ofstream & output, Ant_Graph &, Ant_Graph::Node * p)
155  {
156  output << p->food << " " << p->num << endl;
157 
158  if (verbose)
159  cout << endl;
160  }
161  };
162 
163  struct Load_Node
164  {
165  void operator () (ifstream & input, Ant_Graph &, Ant_Graph::Node * p)
166  {
167  input >> p->food >> p->num;
168 
169  if (verbose)
170  cout << p->food << " " << p->num;
171  }
172  };
173 
174  struct Save_Arc
175  {
176  void operator () (ofstream & output, Ant_Graph &, Ant_Graph::Arc * a)
177  {
178  output << a->feromone_level << " " << a->distance << endl;
179 
180  if (verbose)
181  cout << a->feromone_level << " " << a->distance;
182  }
183  };
184 
185  struct Load_Arc
186  {
187  void operator () (ifstream & input, Ant_Graph &, Ant_Graph::Arc * a)
188  {
189  input >> a->feromone_level >> a->distance;
190 
191  if (verbose)
192  cout << a->feromone_level << " " << a->distance;
193  }
194  };
195 };
196 
197 
198 struct Working_Ant : public Ant
199 {
200  double life;
201 
202  static long born_count;
203  static long died_count;
204 
205  static int bit_idx;
206 
207  int my_bit; // bit asignado para marcar nodos visitados
208 
209  Working_Ant() : life(initial_life)
210  {
211  // empty
212  }
213 
214  // Working_Ant(Transit transit, const double & __life)
215  // : Ant(transit), life(__life)
216  // {
217  // // Empty
218  // }
219 
220  ~Working_Ant()
221  {
222  // empty
223  }
224 
226  virtual bool select_path(Ant_Graph::Node * src_node,
227  Ant_Graph::Node *& tgt_node,
228  Ant_Graph::Arc *& ant_arc);
229 
231  virtual bool walk(Ant_Graph * g,
232  Ant_Graph::Node * tgt_node,
233  Ant_Graph::Arc * ant_arc);
234 };
235 
236 
237 void save(Ant_Graph & g, ofstream & output);
238 
239 void load(Ant_Graph & g, ifstream & input);
240 
241 
242 } // end namespace Aleph
243 
244 # endif
Definition: tpl_agent_graph.H:335
Definition: tpl_ant.H:163
Definition: bitArray.H:96
virtual bool walk(Ant_Graph *g, Ant_Graph::Node *tgt_node, Ant_Graph::Arc *ant_arc)
ejecuta la transición
Definition: tpl_ant.H:47
Definition: tpl_ant.H:174
Definition: tpl_ant.H:93
Definition: tpl_ant.H:124
Definition: tpl_agent_graph.H:313
Definition: tpl_ant.H:185
Definition: tpl_ant.H:198
Definition: tpl_ant.H:74
Definition: tpl_agent_graph.H:422
Definition: ahDefs.H:24
Definition: tpl_ant.H:152
virtual bool select_path(Ant_Graph::Node *src_node, Ant_Graph::Node *&tgt_node, Ant_Graph::Arc *&ant_arc)
Selecciona el próximo camino.
Definition: tpl_agent_graph.H:74

Leandro Rabindranath León