0
3
0
... | ... |
@@ -150,11 +150,10 @@ |
150 | 150 |
// Data sturcture for path data |
151 | 151 |
struct PathData |
152 | 152 |
{ |
153 |
bool found; |
|
154 | 153 |
LargeValue dist; |
155 | 154 |
Arc pred; |
156 |
PathData(bool f = false, LargeValue d = 0, Arc p = INVALID) : |
|
157 |
found(f), dist(d), pred(p) {} |
|
155 |
PathData(LargeValue d, Arc p = INVALID) : |
|
156 |
dist(d), pred(p) {} |
|
158 | 157 |
}; |
159 | 158 |
|
160 | 159 |
typedef typename Digraph::template NodeMap<std::vector<PathData> > |
... | ... |
@@ -191,6 +190,9 @@ |
191 | 190 |
|
192 | 191 |
Tolerance _tolerance; |
193 | 192 |
|
193 |
// Infinite constant |
|
194 |
const LargeValue INF; |
|
195 |
|
|
194 | 196 |
public: |
195 | 197 |
|
196 | 198 |
/// \name Named Template Parameters |
... | ... |
@@ -245,7 +247,10 @@ |
245 | 247 |
const LengthMap &length ) : |
246 | 248 |
_gr(digraph), _length(length), _comp(digraph), _out_arcs(digraph), |
247 | 249 |
_best_found(false), _best_length(0), _best_size(1), |
248 |
_cycle_path(NULL), _local_path(false), _data(digraph) |
|
250 |
_cycle_path(NULL), _local_path(false), _data(digraph), |
|
251 |
INF(std::numeric_limits<LargeValue>::has_infinity ? |
|
252 |
std::numeric_limits<LargeValue>::infinity() : |
|
253 |
std::numeric_limits<LargeValue>::max()) |
|
249 | 254 |
{} |
250 | 255 |
|
251 | 256 |
/// Destructor. |
... | ... |
@@ -472,7 +477,7 @@ |
472 | 477 |
return false; |
473 | 478 |
} |
474 | 479 |
for (int i = 0; i < n; ++i) { |
475 |
_data[(*_nodes)[i]].resize(n + 1); |
|
480 |
_data[(*_nodes)[i]].resize(n + 1, PathData(INF)); |
|
476 | 481 |
} |
477 | 482 |
return true; |
478 | 483 |
} |
... | ... |
@@ -482,7 +487,7 @@ |
482 | 487 |
// node to node v containing exactly k arcs. |
483 | 488 |
void processRounds() { |
484 | 489 |
Node start = (*_nodes)[0]; |
485 |
_data[start][0] = PathData( |
|
490 |
_data[start][0] = PathData(0); |
|
486 | 491 |
_process.clear(); |
487 | 492 |
_process.push_back(start); |
488 | 493 |
|
... | ... |
@@ -517,12 +522,9 @@ |
517 | 522 |
e = _out_arcs[u][j]; |
518 | 523 |
v = _gr.target(e); |
519 | 524 |
d = _data[u][k-1].dist + _length[e]; |
520 |
if (!_data[v][k].found) { |
|
521 |
next.push_back(v); |
|
522 |
_data[v][k] = PathData(true, _data[u][k-1].dist + _length[e], e); |
|
523 |
} |
|
524 |
else if (_tolerance.less(d, _data[v][k].dist)) { |
|
525 |
_data[v][k] = PathData(true, d, e); |
|
525 |
if (_tolerance.less(d, _data[v][k].dist)) { |
|
526 |
if (_data[v][k].dist == INF) next.push_back(v); |
|
527 |
_data[v][k] = PathData(d, e); |
|
526 | 528 |
} |
527 | 529 |
} |
528 | 530 |
} |
... | ... |
@@ -540,8 +542,8 @@ |
540 | 542 |
e = _out_arcs[u][j]; |
541 | 543 |
v = _gr.target(e); |
542 | 544 |
d = _data[u][k-1].dist + _length[e]; |
543 |
if (!_data[v][k].found || _tolerance.less(d, _data[v][k].dist)) { |
|
544 |
_data[v][k] = PathData(true, d, e); |
|
545 |
if (_tolerance.less(d, _data[v][k].dist)) { |
|
546 |
_data[v][k] = PathData(d, e); |
|
545 | 547 |
} |
546 | 548 |
} |
547 | 549 |
} |
... | ... |
@@ -561,7 +563,7 @@ |
561 | 563 |
_curr_found = false; |
562 | 564 |
for (int i = 0; i < n; ++i) { |
563 | 565 |
u = (*_nodes)[i]; |
564 |
if ( |
|
566 |
if (_data[u][k].dist == INF) continue; |
|
565 | 567 |
for (int j = k; j >= 0; --j) { |
566 | 568 |
if (level[u].first == i && level[u].second > 0) { |
567 | 569 |
// A cycle is found |
... | ... |
@@ -586,11 +588,11 @@ |
586 | 588 |
// Find node potentials |
587 | 589 |
for (int i = 0; i < n; ++i) { |
588 | 590 |
u = (*_nodes)[i]; |
589 |
pi[u] = |
|
591 |
pi[u] = INF; |
|
590 | 592 |
for (int j = 0; j <= k; ++j) { |
591 |
d = _data[u][j].dist * _curr_size - j * _curr_length; |
|
592 |
if (_data[u][j].found && _tolerance.less(d, pi[u])) { |
|
593 |
|
|
593 |
if (_data[u][j].dist < INF) { |
|
594 |
d = _data[u][j].dist * _curr_size - j * _curr_length; |
|
595 |
if (_tolerance.less(d, pi[u])) pi[u] = d; |
|
594 | 596 |
} |
595 | 597 |
} |
596 | 598 |
} |
... | ... |
@@ -178,6 +178,9 @@ |
178 | 178 |
|
179 | 179 |
Tolerance _tolerance; |
180 | 180 |
|
181 |
// Infinite constant |
|
182 |
const LargeValue INF; |
|
183 |
|
|
181 | 184 |
public: |
182 | 185 |
|
183 | 186 |
/// \name Named Template Parameters |
... | ... |
@@ -230,9 +233,13 @@ |
230 | 233 |
/// \param length The lengths (costs) of the arcs. |
231 | 234 |
Howard( const Digraph &digraph, |
232 | 235 |
const LengthMap &length ) : |
233 |
_gr(digraph), _length(length), |
|
236 |
_gr(digraph), _length(length), _best_found(false), |
|
237 |
_best_length(0), _best_size(1), _cycle_path(NULL), _local_path(false), |
|
234 | 238 |
_policy(digraph), _reached(digraph), _level(digraph), _dist(digraph), |
235 |
_comp(digraph), _in_arcs(digraph) |
|
239 |
_comp(digraph), _in_arcs(digraph), |
|
240 |
INF(std::numeric_limits<LargeValue>::has_infinity ? |
|
241 |
std::numeric_limits<LargeValue>::infinity() : |
|
242 |
std::numeric_limits<LargeValue>::max()) |
|
236 | 243 |
{} |
237 | 244 |
|
238 | 245 |
/// Destructor. |
... | ... |
@@ -307,7 +314,7 @@ |
307 | 314 |
if (!computeNodeDistances()) break; |
308 | 315 |
} |
309 | 316 |
// Update the best cycle (global minimum mean cycle) |
310 |
if ( !_best_found || |
|
317 |
if ( _curr_found && (!_best_found || |
|
311 | 318 |
_curr_length * _best_size < _best_length * _curr_size) ) { |
312 | 319 |
_best_found = true; |
313 | 320 |
_best_length = _curr_length; |
... | ... |
@@ -446,7 +453,7 @@ |
446 | 453 |
return false; |
447 | 454 |
} |
448 | 455 |
for (int i = 0; i < int(_nodes->size()); ++i) { |
449 |
_dist[(*_nodes)[i]] = |
|
456 |
_dist[(*_nodes)[i]] = INF; |
|
450 | 457 |
} |
451 | 458 |
Node u, v; |
452 | 459 |
Arc e; |
... | ... |
@@ -148,11 +148,10 @@ |
148 | 148 |
// Data sturcture for path data |
149 | 149 |
struct PathData |
150 | 150 |
{ |
151 |
bool found; |
|
152 | 151 |
LargeValue dist; |
153 | 152 |
Arc pred; |
154 |
PathData(bool f = false, LargeValue d = 0, Arc p = INVALID) : |
|
155 |
found(f), dist(d), pred(p) {} |
|
153 |
PathData(LargeValue d, Arc p = INVALID) : |
|
154 |
dist(d), pred(p) {} |
|
156 | 155 |
}; |
157 | 156 |
|
158 | 157 |
typedef typename Digraph::template NodeMap<std::vector<PathData> > |
... | ... |
@@ -186,6 +185,9 @@ |
186 | 185 |
std::vector<Node> _process; |
187 | 186 |
|
188 | 187 |
Tolerance _tolerance; |
188 |
|
|
189 |
// Infinite constant |
|
190 |
const LargeValue INF; |
|
189 | 191 |
|
190 | 192 |
public: |
191 | 193 |
|
... | ... |
@@ -241,7 +243,10 @@ |
241 | 243 |
const LengthMap &length ) : |
242 | 244 |
_gr(digraph), _length(length), _comp(digraph), _out_arcs(digraph), |
243 | 245 |
_cycle_length(0), _cycle_size(1), _cycle_node(INVALID), |
244 |
_cycle_path(NULL), _local_path(false), _data(digraph) |
|
246 |
_cycle_path(NULL), _local_path(false), _data(digraph), |
|
247 |
INF(std::numeric_limits<LargeValue>::has_infinity ? |
|
248 |
std::numeric_limits<LargeValue>::infinity() : |
|
249 |
std::numeric_limits<LargeValue>::max()) |
|
245 | 250 |
{} |
246 | 251 |
|
247 | 252 |
/// Destructor. |
... | ... |
@@ -458,7 +463,7 @@ |
458 | 463 |
return false; |
459 | 464 |
} |
460 | 465 |
for (int i = 0; i < n; ++i) { |
461 |
_data[(*_nodes)[i]].resize(n + 1); |
|
466 |
_data[(*_nodes)[i]].resize(n + 1, PathData(INF)); |
|
462 | 467 |
} |
463 | 468 |
return true; |
464 | 469 |
} |
... | ... |
@@ -468,7 +473,7 @@ |
468 | 473 |
// node to node v containing exactly k arcs. |
469 | 474 |
void processRounds() { |
470 | 475 |
Node start = (*_nodes)[0]; |
471 |
_data[start][0] = PathData( |
|
476 |
_data[start][0] = PathData(0); |
|
472 | 477 |
_process.clear(); |
473 | 478 |
_process.push_back(start); |
474 | 479 |
|
... | ... |
@@ -493,12 +498,9 @@ |
493 | 498 |
e = _out_arcs[u][j]; |
494 | 499 |
v = _gr.target(e); |
495 | 500 |
d = _data[u][k-1].dist + _length[e]; |
496 |
if (!_data[v][k].found) { |
|
497 |
next.push_back(v); |
|
498 |
_data[v][k] = PathData(true, _data[u][k-1].dist + _length[e], e); |
|
499 |
} |
|
500 |
else if (_tolerance.less(d, _data[v][k].dist)) { |
|
501 |
_data[v][k] = PathData(true, d, e); |
|
501 |
if (_tolerance.less(d, _data[v][k].dist)) { |
|
502 |
if (_data[v][k].dist == INF) next.push_back(v); |
|
503 |
_data[v][k] = PathData(d, e); |
|
502 | 504 |
} |
503 | 505 |
} |
504 | 506 |
} |
... | ... |
@@ -516,8 +518,8 @@ |
516 | 518 |
e = _out_arcs[u][j]; |
517 | 519 |
v = _gr.target(e); |
518 | 520 |
d = _data[u][k-1].dist + _length[e]; |
519 |
if (!_data[v][k].found || _tolerance.less(d, _data[v][k].dist)) { |
|
520 |
_data[v][k] = PathData(true, d, e); |
|
521 |
if (_tolerance.less(d, _data[v][k].dist)) { |
|
522 |
_data[v][k] = PathData(d, e); |
|
521 | 523 |
} |
522 | 524 |
} |
523 | 525 |
} |
... | ... |
@@ -528,12 +530,12 @@ |
528 | 530 |
int n = _nodes->size(); |
529 | 531 |
for (int i = 0; i < n; ++i) { |
530 | 532 |
Node u = (*_nodes)[i]; |
531 |
if ( |
|
533 |
if (_data[u][n].dist == INF) continue; |
|
532 | 534 |
LargeValue length, max_length = 0; |
533 | 535 |
int size, max_size = 1; |
534 | 536 |
bool found_curr = false; |
535 | 537 |
for (int k = 0; k < n; ++k) { |
536 |
if ( |
|
538 |
if (_data[u][k].dist == INF) continue; |
|
537 | 539 |
length = _data[u][n].dist - _data[u][k].dist; |
538 | 540 |
size = n - k; |
539 | 541 |
if (!found_curr || length * max_size > max_length * size) { |
0 comments (0 inline)